轉載
摘要:在嵌入式系統中,以太網控制器通常也是研究熱點之一,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,當硬體允許的時候,每次收滿一個以太網資料包(>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---></b><b>初始化</b><b>MAC</b><b>組</b><b>REG---></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,如需轉載請自行聯系原作者