天天看點

ENC28J60 驅動開發要點

轉載

摘要:在嵌入式系統中,以太網控制器通常也是研究熱點之一,MicroChip公司的ENC28J60在嵌入式系統中應用價值較高,該晶片內建了MAC控制器和PHY,使用SPI接口,适合在引腳資源比較緊張的嵌入式系統中加入以太網連接配接功能,本文主要介紹了MicroChip公司的ENC28J60控制器的初始化及其程式設計相關的注意和要點,并針對開發中可能遇到的一些問題進行了探讨。

關鍵字: ENC28J60程式設計

<b>1.</b><b>以太網資料緩沖區</b><b>(8K)</b><b>讀寫</b><b>/</b><b>位址控制</b><b>REG</b><b>的相關作用</b><b>:</b>

注意,這些REG除EPKTCNT外都為16bits,以太網資料緩沖區位址為:0000h~1FFFh

1).ERDPT(分為H/L兩個)<b>MCU</b><b>讀緩沖器指針</b><b>:</b>

--手冊P28,MCU讀取緩沖區資料時,每次實際讀取的位址由該REG儲存.

2).EWRPT(分為H/L兩個)<b>MCU</b><b>寫緩沖器指針</b><b>:</b>

--手冊P29,MCU向緩沖區寫入資料時,每次實際寫入的位址由該REG儲存.

3).ERXRDPT(分為H/L兩個)<b>接收讀指針</b><b>:</b>

--手冊P17,P33, 定義禁止接收硬體寫入的FIFO 中的位置。 在正常操作中,接收硬體(指網絡接口方向)将資料順序寫入,直到ERXRDPT 所指單元(不包括該單元)。注意,該REG與釋放緩沖區的空間操作相關.

4).ERXWRPT(分為H/L兩個)<b>接收寫指針</b><b>:</b>

--手冊P17,P33, 定義接收硬體收到的資料寫入的FIFO 中的具體位置。 在正常操作中,接收硬體(指網絡接口方向)将資料順序寫入ERXWRPT所指單元。注意,該REG為”隻讀”,且與釋放緩沖區的空間操作相關.

5).ETXST(分為H/L兩個)<b>發送緩區起始位址</b><b>:</b>

--手冊P17,在整個以太網資料緩沖區中,定義待發送資料區的首位址

6).ETXND(分為H/L兩個)<b>發送緩區結束位址</b><b>:</b>

--手冊P17,在整個以太網資料緩沖區中,定義待發送資料區的尾位址

7).ERXST(分為H/L兩個)<b>接收緩區起始位址</b><b>:</b>

--手冊P17, 在整個以太網資料緩沖區中,定義接收硬體可以寫入資料的緩沖區首位址.

8).ERXND(分為H/L兩個)<b>接收緩區結束位址</b><b>:</b>

--手冊P17, 在整個以太網資料緩沖區中,定義接收硬體可以寫入資料的緩沖區尾位址.

9).EPKTCNT(8bits)<b>以太網資料包計數器</b><b>:</b>

--手冊P43,P45,當硬體允許的時候,每次收滿一個以太網資料包(&gt;64bytes)時,EPKTCNT+1,最大值為255,此時不論緩沖是否還有空閑也不再接收資料.每次前移ERXRDPT(即釋放接收緩沖區操作)後,EPKTCNT-1,最小值為0.

注意:在以上9個REG中,名稱中帶有”X”的規定的位址都是給以太網接收器使用的(即:從以太網一側通路8K緩存),隻有ERDPT和EWRPT是MCU通過SPI接口通路8K緩沖區用的.通路的關系如下圖:

<a href="http://images.cnblogs.com/cnblogs_com/emouse/201203/201203272040472668.jpg"></a>

其中 <b>ERXWRPT</b><b>和</b><b> ERXRDPT</b><b>可以指向同一位址</b>,應為ENC28J60接收時會從ERXWRPT指向的位址一直寫到ERXRDPT指向的位址前一個空間(即手冊所謂的”不包括ERXRDPT指向的單元”).此時整個接收緩沖區全部可用.8K空間中,實際用來進行發送緩沖的空間由寄存器組ETXST和ETXND确定,實際用來進行接受緩沖的空間由寄存器組ERXST和ERXND确定.顯然,8K空間中可以多餘一些什麼也不用的位置.

<b>2.MII</b><b>和</b><b>PHY</b><b>寄存器的操作</b><b>:</b>

PHY寄存器負責對PHY接口的配置,MCU不能直接從SPI接口通路這些REG,但是主要可以通過MAC組的一組特殊控制REG來通路PHY控制寄存器,MAC組中的這些特殊的控制REG即稱為MII接口寄存器.

對MCU而言,不會有直接通路PHY的可能,所有的PHY操作都必須經過MII寄存器來完成.還需注意,PHY有部分為16bits,寫入的時候必須先寫低8bits,當寫入高8bits的時候控制的設定将立即起效.

<b>3.</b><b>控制器結構和初始化過程</b>

<a href="http://images.cnblogs.com/cnblogs_com/emouse/201203/201203272040504323.jpg"></a>

初始化的過程應該是:

<b>初始化</b><b>ETH</b><b>組</b><b>REG---&gt;</b><b>初始化</b><b>MAC</b><b>組</b><b>REG---&gt;</b><b>通過</b><b>MII</b><b>初始化</b><b>PHY</b><b>組</b><b>REG(</b><b>需要查詢硬體穩定</b><b>)</b>

<b>Step1</b>:ETH組控制寄存器初始化

1).EIE初始化

--手冊P67,以太網中斷允許控制

主要SPI寫控制REG(WCR),發出2byte,REG位址0h1b,資料為:

0b010\11011+0bAAAAAAAA(A--8bits實際資料)

2). EIR查詢

--手冊P68,以太網中斷狀态擷取

主要SPI讀控制REG(RCR),發出2byte, REG位址0h1C,資料為:

0b010\11100+0bXXXXXXXX(X—為了保持SPCK發出的無效數)

讀取的有效資料在SPI發送的第二個有效位元組傳回.

3).ESTAT查詢

--手冊P66,獲得PHY就緒狀态(以及以太網的各種錯誤狀态)

主要SPI讀控制REG(RCR),發出2byte, REG位址0h1D,資料為:

0b010\11101+0bXXXXXXXX(X—為了保持SPCK發出的無效數)

4).ECON2初始化

--手冊P16,IC節能控制,資料包指針寄存器控制

主要SPI寫控制REG(WCR),發出2byte,REG位址0h1E,資料為:

0b010\11110+0bAAAAAAAA(A--8bits實際資料)

5).ECON1初始化

--手冊P15,特别注意其中對<b>BANK0~3</b>的選擇位,寫不同的控制REG需要多次改變Bank0~3的選擇.

主要SPI寫控制REG(WCR),發出2byte,REG位址0h1F,資料為:

0b010\11111+0bAAAAAAAA(A--8bits實際資料)

6).ERXFCON接收過濾器初始化

--手冊P48,

首先需要寫<b>ECON1</b>,選擇通路<b>Bank1</b>,此後

主要SPI寫控制REG(WCR),發出2byte,REG位址0h18,資料為:

0b010\11000+0bAAAAAAAA(A--8bits實際資料)

<b>Step2</b>:ETH組位址寄存器初始化

1).寄存器組ETXST和ETXND就位

--定義發送緩沖區範圍

ETXSTL/H

主要SPI寫控制REG(WCR),發出4byte,REG位址0h04(L),0h05(H),資料為:

0b010\00100+0bAAAAAAAA(A--8bits實際資料,ETXSTL)

0b010\00101+0bAAAAAAAA(A--8bits實際資料,ETXSTH)

ETXNDL/H

主要SPI寫控制REG(WCR),發出4byte,REG位址0h06(L),0h07(H),資料為:

0b010\00110+0bAAAAAAAA(A--8bits實際資料,ETXNDL)

0b010\00111+0bAAAAAAAA(A--8bits實際資料,ETXNDH)

2). 寄存器組ERXST和ERXND就位

--定義接收緩沖區範圍

ERXSTL/H

主要SPI寫控制REG(WCR),發出4byte,REG位址0h08(L),0h09(H),資料為:

0b010\01000+0bAAAAAAAA(A--8bits實際資料,ERXSTL)

0b010\01001+0bAAAAAAAA(A--8bits實際資料,ERXSTH)

ERXNDL/H

主要SPI寫控制REG(WCR),發出4byte,REG位址0h0a(L),0h0b(H),資料為:

0b010\01010+0bAAAAAAAA(A--8bits實際資料,ERXNDL)

0b010\01011+0bAAAAAAAA(A--8bits實際資料,ERXNDH)

3). ERXWRPT和 ERXRDPT就位

--注意其範圍要随應用中定義的資料幀的大小變化,且每次處理完接收以後要操作ERXRDPT釋放空間.

ERXWRPTL/H

主要SPI寫控制REG(WCR),發出4byte,REG位址0h0C(L),0h0D(H),資料為:

0b010\01100+0bAAAAAAAA(A--8bits實際資料, ERXRDPTL)

0b010\01101+0bAAAAAAAA(A--8bits實際資料, ERXRDPTH)

<b>注意</b><b>:</b><b>初始化時</b><b>, ERXWRPTL/H</b><b>一般取等于</b><b>ERXSTL/H</b>

ERXRDPTL/H

主要SPI寫控制REG(WCR),發出4byte,REG位址0h0E(L),0h0F(H),資料為:

0b010\01110+0bAAAAAAAA(A--8bits實際資料, ERXRDPTL)

0b010\01111+0bAAAAAAAA(A--8bits實際資料, ERXRDPTH)

<b>注意</b><b>: ERXRDPT</b><b>與</b><b>ERXWRPT</b><b>的內插補點應該大于</b><b>1</b><b>個以太網資料幀的長度</b><b>,</b><b>如果</b><b>ERXRDPT=ERXWRPT</b><b>則整個接收緩沖區可以連續使用</b><b>.</b>

4).根據MCU從以太網接收資料的需要,ERDPT就位

ERDPTL/H

主要SPI寫控制REG(WCR),發出4byte,REG位址0h00(L),0h01(H),資料為:

0b010\00000+0bAAAAAAAA(A--8bits實際資料,ERDPTL)

0b010\00001+0bAAAAAAAA(A--8bits實際資料,ERDPTH)

5).根據MCU向以太網發送資料的需要,EWRPT就位

EWRPTL/H

主要SPI寫控制REG(WCR),發出4byte,REG位址0h02(L),0h03(H),資料為:

0b010\00010+0bAAAAAAAA(A--8bits實際資料,EWRPTL)

0b010\00011+0bAAAAAAAA(A--8bits實際資料,EWRPTH)

<b>Step3</b>:MAC組寄存器初始化

<b>(</b><b>注意</b><b>:MAC</b><b>組寄存器映射在</b><b>Bank2/3,</b><b>通路前需要調整</b><b>ECON1</b><b>中的</b><b>BSEL0/1)</b>

如果初始化發生在上電複位之後,初始化前必須查詢ESTAT.CLKRDY(手冊P33)

MAC寄存器的初始化順序不重要,一般按照(手冊P34)說明的順序:

1).MACON2.MARST位清0—MAC初始化退出.

主要SPI寫控制REG(WCR),發出2byte,REG位址0h01(Bank2)資料為:

0b010\00001+0bAAAAAAAA(A--8bits實際資料)

2).MACON1初始化

--MARXEN位置1使能MAC接收.

--啟動全雙工方式,TXPAUS和RXPAUS位置1.

主要SPI寫控制REG(WCR),發出2byte,REG位址0h00(Bank2)資料為:

0b010\00000+0bAAAAAAAA(A--8bits實際資料)

3).MACON3初始化

--将PADCFG.TXCRCEN.和FULDPX位置1,使能幀自動填充,使能自動CRC生成.(要注意其中FRMLNEN位的使用).

主要SPI寫控制REG(WCR),發出2byte,REG位址0h02(Bank2)資料為:

0b010\00010+0bAAAAAAAA(A--8bits實際資料)

4).MACON4一般保持預設值

5).MAMXFL(16bitsREG,分為H/L兩部分)就位

--确定網絡幀的最大位元組數(暫定義應用中的幀長度都為64bytes).

主要SPI寫控制REG(WCR),發出4byte,REG位址(Bank2)0h0A(L),0h0B(H),資料為:

0b010\01010+0bAAAAAAAA(A--8bits實際資料, MAMXFLL)

0b010\01011+0bAAAAAAAA(A--8bits實際資料, MAMXFLH)

6).MABBIPG就位

--背對背包時間間隔就位,全雙工時置入值固定為15h

主要SPI寫控制REG(WCR),發出2byte,REG位址0h04(Bank2)資料為:

0b010\00100+0b00010101

7).MAIPGL就位

--非背對背包時間間隔就位, 全雙工時置入值固定為12h(L)和0Ch(H)

主要SPI寫控制REG(WCR),發出4byte,REG位址(Bank2) 0h06(L)0h07(H)

資料為:

0b010\00110+0b00010010(MAIPGLL)

0b010\00111+0b00001100(MAIPGLH)

<b>注意</b><b>:</b><b>正常使用時</b><b>,</b><b>應該采用全雙工方式</b>,此時MACLCON1/2可保持預設值

8).MAC位址就位(映射在Bank3)

--将6位元組的MAC位址寫入寄存器組:MAADR0~MAADR5.

主要SPI寫控制REG(WCR),發出6byte,REG位址(Bank3) 0h00~0h05資料為:

0b010\00000+0bAAAAAAAA(A--8bits實際資料,MAADR1)

0b010\00001+0bAAAAAAAA(A--8bits實際資料,MAADR0)

0b010\00010+0bAAAAAAAA(A--8bits實際資料,MAADR3)

0b010\00011+0bAAAAAAAA(A--8bits實際資料,MAADR2)

0b010\00100+0bAAAAAAAA(A--8bits實際資料,MAADR5)

0b010\00101+0bAAAAAAAA(A--8bits實際資料,MAADR4)

<b>Step4</b>:PHY組寄存器初始化

注意: 如果初始化發生在上電複位之後,初始化前必須查詢ESTAT.CLKRDY(手冊P33)

<b>(</b><b>注意</b><b>:PHY</b><b>組寄存器的</b><b>MII</b><b>接口</b><b>REG</b><b>映射在</b><b>Bank2,</b><b>通路前需要調整</b><b>ECON1</b><b>中的</b><b>BSEL0/1)</b>

與PHY相關的MII寄存器共有6個分别是:

MICON—手冊P21,MII控制REG

MICMD—手冊P21,MII指令REG

MIREGADR—手冊P19,PHY通路位址REG

MIWRL/H—手冊P19,PHY寫資料REG高/低,注意,該REG組必須先寫入L再寫入H,寫入H會觸發MII控制事件.

MIRDL/H—手冊P19,PHY讀資料REG高/低.在讀之前應将MICMD的MIIRD位置1,這樣可以觸發PHY事件且使MISTAT.BUSY=1,當MII獲得了PHY值以後,MIIRD不會自動清0.是以在查詢MISTAT.BUSY=0以後要手動清0.

MISTAT—手冊P22,MII狀态REG,反映PHY的狀态,在讀/寫PHY之前應該先查詢此REG當MISTAT.BUSY=0時才可以進行操作.

根據手冊P38,一般隻需要配置3個PHY子產品并且要查詢PHY的工作狀态

1).PHCON1的手動操作

--雖然可以通過外接LED的方式确定半雙工/全雙工方式,但是手工設定PHCON1.PDPXMD位的值是更加安全的方法,同時也要手工修改MACON3中的FULDPX位.

--PHY位址00h,通過MII操作時,流程在手冊P19

主要SPI寫控制REG(WCR),發出2byte*3,給MIREGADR,MIWRL/H 3個REG

位址(<b>Bank2</b>)0h14(MIREGADR),0h16(MIWRL),0h17(MIWRH),資料為:

0b010\10100+0b00000000(位元組1—MIREGADR的位址,位元組2—寫入PHCON1的位址00h)

0b010\10110+0bAAAAAAAA(位元組1—MIREGADR的位址, 位元組2—寫入MIWRL的8bits實際資料—L位元組應該是寫入PHCON1的實際值)

0b010\10111+0b00000000(位元組1—MIREGADR的位址, 位元組2—寫入MIWRH的8bits實際資料,在這裡發出的資料無效,僅觸發PHY事件).

寫入後,MII自動觸發PHY事件,MISTAT.BUSY自動置1.

2).PHLCON的設定

--根據外結LED電路的實際結構,有可能要修改這個REG.

位址(Bank2)0h14(MIREGADR),0h16(MIWRL),0h17(MIWRH),資料為:

0b010\10100+0b00010100(位元組1—MIREGADR的位址,位元組2—寫入PHLCON的位址14h)

0b010\10110+0bAAAAAAAA(位元組1—MIREGADR的位址, 位元組2—寫入MIWRL的8bits實際資料—L位元組應該是寫入PHLCON的實際值)

3).PHCON2的設定

--一般全雙工狀态時可以保持其預設值,但是注意其中的TXDIS位可以關閉PHY的硬體發送.

0b010\10100+0b00000000(位元組1—MIREGADR的位址,位元組2—寫入PHCON2的位址11h)

0b010\10110+0bAAAAAAAA(位元組1—MIREGADR的位址, 位元組2—寫入MIWRL的8bits實際資料—L位元組應該是寫入PHCON2的實際值)

特别注意:PHY寄存器不能直接通路,需要通過MII寄存器的間接操作.

4).查詢MISTAT狀态

--主要SPI讀控制REG(RCR),發出3byte, REG位址0h0A(Bank3),資料為:

0b010\01010+0bXXXXXXXX+0bXXXXXXXX(X—為了保持SPCK發出的無效數)

讀取的有效資料在SPI發送的第三個有效位元組傳回.

本文轉自emouse部落格園部落格,原文連結:http://www.cnblogs.com/emouse/archive/2012/03/27/2420126.html,如需轉載請自行聯系原作者

繼續閱讀