ENC28J60 驅動開發要點


轉載

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

1.以太網數據緩沖區(8K)讀寫/地址控制REG的相關作用:

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

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

--手冊P28,MCU讀取緩沖區數據時,每次實際讀取的地址由該REG保存.

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

--手冊P29,MCU向緩沖區寫入數據時,每次實際寫入的地址由該REG保存.

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

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

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

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

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

--手冊P17,在整個以太網數據緩沖區中,定義待發送數據區的首地址

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

--手冊P17,在整個以太網數據緩沖區中,定義待發送數據區的尾地址

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

--手冊P17, 在整個以太網數據緩沖區中,定義接收硬件可以寫入數據的緩沖區首地址.

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

--手冊P17, 在整個以太網數據緩沖區中,定義接收硬件可以寫入數據的緩沖區尾地址.

9).EPKTCNT(8bits)以太網數據包計數器:

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

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

clip_image001

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

2.MIIPHY寄存器的操作:

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

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

3.控制器結構和初始化過程

clip_image002

初始化的過程應該是:

初始化ETHREG--->初始化MACREG--->通過MII初始化PHYREG(需要查詢硬件穩定)

Step1: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發出的無效數)

讀取的有效數據在SPI發送的第二個有效字節返回.

4).ECON2初始化

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

主控SPI寫控制REG(WCR),發出2byte,REG地址0h1E,數據為:

0b010\11110+0bAAAAAAAA(A--8bits實際數據)

5).ECON1初始化

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

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

主控SPI寫控制REG(WCR),發出2byte,REG地址0h1F,數據為:

0b010\11111+0bAAAAAAAA(A--8bits實際數據)

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

--手冊P48,

首先需要寫ECON1,選擇訪問Bank1,此后

主控SPI寫控制REG(WCR),發出2byte,REG地址0h18,數據為:

0b010\11000+0bAAAAAAAA(A--8bits實際數據)

Step2: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)

注意:初始化時, ERXWRPTL/H一般取等於ERXSTL/H

ERXRDPTL/H

主控SPI寫控制REG(WCR),發出4byte,REG地址0h0E(L),0h0F(H),數據為:

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

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

注意: ERXRDPTERXWRPT的差值應該大於1個以太網數據幀的長度,如果ERXRDPT=ERXWRPT則整個接收緩沖區可以連續使用.

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)

Step3:MAC組寄存器初始化

(注意:MAC組寄存器映射在Bank2/3,訪問前需要調整ECON1中的BSEL0/1)

如果初始化發生在上電復位之后,初始化前必須查詢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)

注意:正常使用時,應該采用全雙工方式,此時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)

Step4:PHY組寄存器初始化

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

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

與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

地址(Bank2)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.

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

主控SPI寫控制REG(WCR),發出2byte*3,給MIREGADR,MIWRL/H 3個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的實際值)

0b010\10111+0b00000000(字節1—MIREGADR的地址, 字節2—寫入MIWRH的8bits實際數據,在這里發出的數據無效,僅觸發PHY事件).

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

3).PHCON2的設置

--一般全雙工狀態時可以保持其默認值,但是注意其中的TXDIS位可以關閉PHY的硬件發送.

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

地址(Bank2)0h14(MIREGADR),0h16(MIWRL),0h17(MIWRH),數據為:

0b010\10100+0b00000000(字節1—MIREGADR的地址,字節2—寫入PHCON2的地址11h)

0b010\10110+0bAAAAAAAA(字節1—MIREGADR的地址, 字節2—寫入MIWRL的8bits實際數據—L字節應該是寫入PHCON2的實際值)

0b010\10111+0b00000000(字節1—MIREGADR的地址, 字節2—寫入MIWRH的8bits實際數據,在這里發出的數據無效,僅觸發PHY事件).

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

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

4).查詢MISTAT狀態

--主控SPI讀控制REG(RCR),發出3byte, REG地址0h0A(Bank3),數據為:

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

讀取的有效數據在SPI發送的第三個有效字節返回.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM