基於AX88796B的網路介面模組的設計與實現
| [日期:2008-7-22] |
來源:今日電子/21IC 作者:重慶郵電大學 崔巍 |
[字型:大 中 小] |
引言
網路技術應用日益普及的今天,工業現場的儀器儀錶、資料擷取和控制裝置也日趨網路化,工業自動化和網路的結合越來越密切。而將乙太網路和嵌入式系統相結合應用於工業控制中已成為趨勢。
AX88796B是Asix公司推出的一款為嵌入式和工業乙太網路應用而設計的低引腳數乙太網路控制晶片。其內部整合10/100Mb/s自適應的介質訪問層MAC和物理層收發器PHY以及8K×16位的SRAM。AX88796B可應用於商業級0~70C和工業級-40C~85C的溫度範圍。AX88796B支援MCS-51系列、80186系列、ISA匯流排和SRAM-like介面類型。執行基於IEEE802.3/IEEE802.3u區域網路標準的10Mb/s和100Mb/s乙太網路控制功能,並且提供發送隊列功能來增強標準NE2000的發送效能。
AT91R40008微控制器是基於ARM7TDMI核的32位RISC結構的嵌入式微控制器,非常適於工業即時控制應用。AX88796B引腳的LQFP封裝減少了PCB空間並且和NE2000相容,編程簡單,其驅動可以容易快速的移植到許多嵌入式系統中。因此,綜合上述兩種晶片的優點,我們選擇AX88796B和AT91R40008作為工業即時控制中嵌入式網路應用的解決方案,具有很好的工業應用價值和前景。
圖1 AX88796B內部結構圖
AX88796B內部結構及工作原理
1 AX88796B的內部結構
網卡上電複位時EEPROM介面能夠通過CSR中位移為14H的SMI/EEPROM寄存器來存取資料,MAC地址由EEPROM中讀取,並被自動載入地址為0000h~001fh和0400h~040fh的內部儲存區中。如果沒有使用EEPROM,每次上電對網卡進行初始化時候就手動給它分配一個MAC地址。
AX88796B內部有一個16KB(0x4000~0x7fff)大小的SRAM,該SRAM是雙連接埠SRAM,可以同時被網卡讀寫和使用者讀寫,這片地址空間的一部分被保留用來存放一個緩衝環結構,另一部分可以給使用者使用。在本設計中,16KB的SRAM全部被用來接收和發送資料包。本地DMA正是通過這個緩衝環結構來接收報文的。這個結構由一連串相鄰的固定長度為256B的緩衝區構成,每256位元組稱為一頁,共有64頁。頁的地址就是地址的高8位,頁地址為0x00~0xff。其中0x40~0x4B為網卡的發送緩衝區,共12頁,剛好可以儲存2個最大的乙太網路包,所以我們把發送緩衝區分成兩部分進行輪流發送。使用0x4c~0x7f共52頁為網卡的接收緩衝區。AX88796B的SRAM空間結構和收發緩衝區結構2、3所示。
圖2 SRAM空間結構
圖3 收發緩衝區
2 AX88796B的工作原理
由四個寄存器來控制接收緩衝區的操作。Page Start Address Register (PSTART)和Page Stop Address Register(PSTOP)定義了接收緩衝區的起始和終止頁號,形成一個接收緩衝環。當前頁地址寄存器(Current Page Register)指向第一個用於儲存資料包的緩衝區。邊界指標寄存器(Boundary Pointer Register)指向在緩衝環中第一個未被主機讀取的資料包。如果本地DMA地址與Boundary Pointer Register的值相等,則接收過程中止。邊界指標也被用來初始化遠端DMA來移動一個資料包,當資料包被移走後,邊界指標也向前增長。這樣,Current Page Register如同一個寫指標,Boundary Pointer如同一個讀指標。接收到一個資料包時,從PSR中指定的頁號開始儲存,如果一個256B的緩衝區不夠,DMA會執行一個前向串連來串連下一個緩衝區以儲存這個資料包的剩餘部分。串連的時候緩衝區必須是連續的,一個資料包總是會被儲存在相鄰的緩衝區裡。在串連下一個緩衝區前,緩衝管理邏輯會執行兩個比較,首先比較下一個緩衝區的DMA地址是否和page Stop Register相等,若相等,則DMA地址被恢複為page start address register中儲存的地址。其次和boundary pointer register比較,如果相等,則接收報文過程終止。Boundary Pointer Register能夠防止緩衝區裡的資料還沒有讀出就被重寫。
要發送和接收資料包就必須通過DMA讀寫AX88796B內部的SRAM。DMA分為遠程DMA(Remote DMA)和本地DMA(Local DMA)。CPU從網卡的SRAM讀寫資料稱為遠端DMA。AX88796B讀寫SRAM稱為本地DMA。資料包的接收過程:當資料包到達網卡的MAC層後,本地DMA先將到達MAC層的報文傳送到網卡的記憶體中,主機CPU再通過遠端DMA通道從網卡記憶體中讀取資料包。資料包的發送過程:主機CPU通過遠端DMA把要發送的資料包送到網卡的記憶體中,本地的DMA將該資料包傳送到MAC層,再經由內部的PHY層發送至網路。
網路介面硬體設計
1 AX88796B的引腳配置
AX88796B與CPU的串連方式有MCS51模式、ISA模式、186模式,此方案使用了ISA 8bit模式。片選引腳CSn,讀寫訊號RDn、WRn、RSTn都是低電平有效,分別和AT91r40008相應引腳相連即可。AX88796B的資料線SD0~SD15和AT91r40008的DATA[0:15]相連,可通過軟體配置為16位或8位DMA資料轉送方式。AX88796B的IRQ是可程式化的,插斷要求訊號可以通過配置BTCR或EEPROM來選擇其觸發方式和中斷I/O緩衝類型,AT91r40008中斷觸發方式應該和BTCR的配置相一致。其他重要引腳如IOIS16、PME、EECE、EECK在本設計中懸空處理。引腳配置應根據網卡晶片手冊說明和設計方案而定。
對AX88796B控制狀態寄存器(CSR)的操作,需要確定其基地址,基地址的選擇應根據AT91r40008的可程式化外部匯流排EBI的地址和片選訊號來確定。AT91r40008的EBI處理位於地址空間0x00400000~0xFFC00000的訪問操作,在訪問過程中,它將產生外部器件的控制訪問訊號。當把網卡寄存器地址空間映射進EBI後,直接對EBI地址空間操作即可控制網卡的寄存器讀寫。對每個映射進EBI介面的外圍器件,可以編程等待周期數、資料浮空時間、資料匯流排寬度(8位或16位)等。
2 AT91r40008與AX88796B介面電路
圖4 硬體串連原理圖
電路4所示。
AX88796B的驅動程式設計
AX88796B的網路卡驅動程式是處理器CPU和網卡硬體的介面,網路卡驅動程式主要包括以下幾部分:網卡的初始化;資料包的接收和發送;中斷處理子程式。
1 網卡初始化
在網卡的初始化過程中除了完成對相關寄存器的定義與賦值外,還要完成對接收緩衝環的構造。AX88796B的所有寄存器除了資料連接埠寄存器外都是8位元據寬度。資料連接埠寄存器可以通過配置DCR寄存器中的WTS設定成8位或16位寬。AX88796B將位移量為01h~0fh的寄存器分為4頁(Page0~Page3)進行操作。與NE2000相容的寄存器只有3頁(Page0~Page2)。初始化需要設定頁0與頁1的相關寄存器,頁2的寄存器是唯讀,不可以設定,頁3的寄存器不是NE2000相容的,不用設定。初始化函數主要要完成以下諸項工作。
/*AX88796B_init*/
/*調用複位子程式對AX88796B進行複位。有兩種複位方式:一是硬體複位,通過拉高拉低RESET引腳達到複位AX88796B的目的;二是軟體複位,從0x1f連接埠讀資料使AX88796B複位。*/
ReadByte(RESET);
WriteByte(RESET,0xff);
delay(3000);
WriteByte(IMR,0);/*初始化中斷屏蔽寄存器IMR,寫入0x00,禁止所有插斷要求。*/
WriteByte(CR,0x61);/*選中頁1,停止AX88796B。*/
delay(1000);
WriteByte(CPR,0x4C);/*初始化接收緩衝環寫頁指標CPR=PSTART*/
WriteByte(PAR0~PAR5,MAC);/*設定網卡晶片MAC地址,清除多播地址寄存器。*/
WriteByte(MAR0~MAR7,0);
WriteByte(CR,0x21);/*停止網卡,切換到頁0。*/
delay(1000);
WriteByte(BNRY,0x79);/*寫邊界指標寄存器(BNRY)為0x79;*/
WriteByte(PSTART,0x4c);/*設定接收緩衝區的起始頁地址0x4c;*/
WriteByte(PSTOP,0x80);/*PSTOP接收緩衝區的結束頁地址0x80;*/
WriteByte(TPSR,0x40);/*TPSR發送頁的起始地址0x40;*/
WriteByte(DCR,0x80);/*設定資料配置寄存器為8位元據傳輸模式。*/
/*設定接收配置寄存器為0x4C,使接收緩衝區僅接收廣播位址資料包和多點播送地址包。*/
WriteByte(RCR,0x4C);
/*設定TCR發送配置寄存器為0x80,採用全雙工系統模式,當資料包長度小於60位元組時自動填滿,發送時附加CRC校正。*/
WriteByte(TCR,0x80);
WriteByte(ISR,0xFF);/*清除中斷狀態寄存器。*/
WriteByte(IMR,0x11);/*允許覆寫中斷和資料包接收中斷。*/
WriteByte(BTCR,0x30);/*中斷觸發方式為高電平有效,IRQ輸出為推挽驅動方式*/
WriteByte(CR,0x22);/*啟動晶片,AX88796B初始化完成。*/
delay(1000);
wrcurpge=read(CPR);
rdnxtpge=wrcurpge;
2 資料包的發送和接收
判斷AX88796B是否接收到新的資料包有兩種方式:輪循和中斷。單片機用輪循方式較多。為了提高CPU效能和即時性要求,這裡採用中斷方式。當網卡接收到新資料包時進入中斷,首先判斷CPR是否等於BNRY,若相等,則表示接收緩衝區已被存滿,則停止接收資料包,而不會覆蓋舊的資料;若不等,則將接收緩衝區中待讀取的資料包的起始地址寫入RSAR[0,1]寄存器,資料包的開始4位元組寫入RBCR[0,1]寄存器,並啟動遠端DMA讀命令,通過讀取4個資訊位元組得到待讀取資料包的長度、接收狀態和下一個將被讀的頁的指標資訊。然後通過遠端DMA讀命令,將資料包從網卡SRAM中讀入CPU記憶體中,並更新讀頁指標寄存器BNRY,CPU每從網卡記憶體中讀走一頁資料,BNRY便加一,這需要通過程式實現。網卡通過CPR將接收到的資料包寫入接收緩衝區,每寫完一頁,CPR將自動加一,當加到最後的空頁(這裡是PSTOP=0x80)時,CPR將自動回復為接收緩衝區的首頁(PSTART=0x4c)。網卡接收關鍵性代碼如下:
/*AX88796B_receive*/
uint8 rcvinfo[4],i;
uint16 pktlength,index;
/*得到待讀取資料包的資訊,並將其儲存在rcvinfo數組中*/
WriteByte(RSAR0,0x00);
WriteByte(idx,RSAR1,rdnxtpge);
WriteByte(RBCR0,0x04);
WriteByte(RBCR1,0x00);
WriteByte(CR,0x0A);
for(i=0;i<4;i++)
rcvinfo[i]=*((uint8*)(DP_PORT+Base_addr));
pktlength=rcvinfo[2]+(rcvinfo[3]*256)-4;
/*根據得到的待讀取資料包的長度pktlength,將資料包讀入CPU記憶體Buf*/
WriteByte(RSAR0,0x4);
WriteByte(RSAR1,rdnxtpge);
WriteByte(RBCR0,(uint8)(pktlength&0x00ff));
WriteByte(RBCR1,(uint8)(pktlength>>8));
WriteByte(CR,0x0A);
ReadData(uint16*Buf,uint16 length);
/*更新BNRY指標,並返回pktlength值*/
rdnxtpge=rcvinfo[1];
if(rdnxtpge==PSTART)
WriteByte(idx,BNRY,PSTOP-1);
else
WriteByte(idx,BNRY,rdnxtpge-1);
return pktlength;
CPU通過遠端DMA通道將網卡發送緩衝區的起始地址和要發送的位元組數分別寫入RSAR[0,1]和RBCR[0,1],然後啟動遠端DMA寫命令即可將資料包寫入網卡記憶體,此後將位元組數寫入TBCR[0,1]寄存器,啟動發送命令就可將資料包發送到網路上。網卡發送的關鍵代碼如下:
/*AX88796B_transmit*/
/*將資料寫入網卡的發送緩衝區*/
WriteByte (RSAR0,0x00);
WriteByte (RSAR1,TX_BUF_Start);
WriteByte (RBCR0,(uint8)(len&0xFF));
WriteByte (RBCR1,(uint8)(len>>8));
WriteByte (CR,0x12);
WriteData((uint16*)addr,len);
WriteByte (idx,TPSR,TX_BUF_Start);
/*發送緩衝區的資料發送到網路*/
WriteByte (TBCR0,(uint8)(len&0xFF));
WriteByte (TBCR1,(uint8)(len>>8));
WriteByte (CR,0x26);
3 中斷處理
中斷的處理和CPU關聯密切,在軟體中必須先配置好網卡的片選線和中斷訊號線。資料包到來時,網卡將其儲存在SARM中,同時觸發一個中斷。處理器接收到中斷訊號後,進入中斷處理常式。在中斷處理常式中讀AX88796B的中斷狀態寄存器ISR來判斷是什麼樣類型的中斷,如果讀出的值的最低位為1,則代表是資料包接收中斷,這時需觸發一個訊息,進入到讀網卡函數。讀網卡函數的功能是將網路資料包從網卡的記憶體接收到主機中,接著向上層傳遞,進行相應的處理。
一個報文的發送過程就是通過調用寫網卡函數,將報文發送到網卡的記憶體中去。然後將AX88796的控制寄存器(CR)的發送位TXP(Transmit packet)位置1,即將報文發送。
中斷處理子程式的關鍵代碼:
/*IRQ0_handler*/
uint8 InterruptStatus;
InterruptStatus=read(ISR);//讀中斷狀態寄存器
write(IMR,0x00);//禁止中斷
write(ISR,InterruptStatus);//清除中斷狀態寄存器
if(InterruptStatus&0x01)//是否為資料包接收中斷
OSQPost(TcpIpMsgQ,&idx);//通知上位機接收到資料包
write(IMR,0x11);//使能接收中斷和覆寫中斷