基于AX88796B的網(wǎng)絡(luò)接口模塊的設(shè)計與實現(xiàn)
網(wǎng)絡(luò)接口硬件設(shè)計
本文引用地址:http://www.ex-cimer.com/article/86068.htm1 AX88796B的引腳配置
AX88796B與CPU的連接方式有MCS51模式、ISA模式、186模式,此方案使用了ISA 8bit模式。片選引腳CSn,讀寫信號RDn、WRn、RSTn都是低電平有效,分別和AT91r40008相應(yīng)引腳相連即可。AX88796B的數(shù)據(jù)線SD0~SD15和AT91r40008的DATA[0:15]相連,可通過軟件配置為16位或8位DMA數(shù)據(jù)傳輸方式。AX88796B的IRQ是可編程的,中斷請求信號可以通過配置BTCR或EEPROM來選擇其觸發(fā)方式和中斷I/O緩沖類型,AT91r40008中斷觸發(fā)方式應(yīng)該和BTCR的配置相一致。其他重要引腳如IOIS16、PME、EECE、EECK在本設(shè)計中懸空處理。引腳配置應(yīng)根據(jù)網(wǎng)卡芯片手冊說明和設(shè)計方案而定。
對AX88796B控制狀態(tài)寄存器(CSR)的操作,需要確定其基地址,基地址的選擇應(yīng)根據(jù)AT91r40008的可編程外部總線EBI的地址和片選信號來確定。AT91r40008的EBI處理位于地址空間0x00400000~0xFFC00000的訪問操作,在訪問過程中,它將產(chǎn)生外部器件的控制訪問信號。當把網(wǎng)卡寄存器地址空間映射進EBI后,直接對EBI地址空間操作即可控制網(wǎng)卡的寄存器讀寫。對每個映射進EBI接口的外圍器件,可以編程等待周期數(shù)、數(shù)據(jù)浮空時間、數(shù)據(jù)總線寬度(8位或16位)等。
2 AT91r40008與AX88796B接口電路
圖4 硬件連接原理圖
電路如圖4所示。
AX88796B的驅(qū)動程序設(shè)計
AX88796B的網(wǎng)卡驅(qū)動程序是處理器CPU和網(wǎng)卡硬件的接口,網(wǎng)卡驅(qū)動程序主要包括以下幾部分:網(wǎng)卡的初始化;數(shù)據(jù)包的接收和發(fā)送;中斷處理子程序。
1 網(wǎng)卡初始化
在網(wǎng)卡的初始化過程中除了完成對相關(guān)寄存器的定義與賦值外,還要完成對接收緩沖環(huán)的構(gòu)造。AX88796B的所有寄存器除了數(shù)據(jù)端口寄存器外都是8位數(shù)據(jù)寬度。數(shù)據(jù)端口寄存器可以通過配置DCR寄存器中的WTS設(shè)置成8位或16位寬。AX88796B將偏移量為01h~0fh的寄存器分為4頁(Page0~Page3)進行操作。與NE2000兼容的寄存器只有3頁(Page0~Page2)。初始化需要設(shè)置頁0與頁1的相關(guān)寄存器,頁2的寄存器是只讀的,不可以設(shè)置,頁3的寄存器不是NE2000兼容的,不用設(shè)置。初始化函數(shù)主要要完成以下諸項工作。
/*AX88796B_init*/
/*調(diào)用復位子程序?qū)X88796B進行復位。有兩種復位方式:一是硬件復位,通過拉高拉低RESET引腳達到復位AX88796B的目的;二是軟件復位,從0x1f端口讀數(shù)據(jù)使AX88796B復位。*/
ReadByte(RESET);
WriteByte(RESET,0xff);
delay(3000);
WriteByte(IMR,0);/*初始化中斷屏蔽寄存器IMR,寫入0x00,禁止所有中斷請求。*/
WriteByte(CR,0x61);/*選中頁1,停止AX88796B。*/
delay(1000);
WriteByte(CPR,0x4C);/*初始化接收緩沖環(huán)寫頁指針CPR=PSTART*/
WriteByte(PAR0~PAR5,MAC);/*設(shè)置網(wǎng)卡芯片MAC地址,清除多播地址寄存器。*/
WriteByte(MAR0~MAR7,0);
WriteByte(CR,0x21);/*停止網(wǎng)卡,切換到頁0。*/
delay(1000);
WriteByte(BNRY,0x79);/*寫邊界指針寄存器(BNRY)為0x79;*/
WriteByte(PSTART,0x4c);/*設(shè)置接收緩沖區(qū)的起始頁地址0x4c;*/
WriteByte(PSTOP,0x80);/*PSTOP接收緩沖區(qū)的結(jié)束頁地址0x80;*/
WriteByte(TPSR,0x40);/*TPSR發(fā)送頁的起始地址0x40;*/
WriteByte(DCR,0x80);/*設(shè)置數(shù)據(jù)配置寄存器為8位數(shù)據(jù)傳輸模式。*/
/*設(shè)置接收配置寄存器為0x4C,使接收緩沖區(qū)僅接收廣播地址數(shù)據(jù)包和多點播送地址包。*/
WriteByte(RCR,0x4C);
/*設(shè)置TCR發(fā)送配置寄存器為0x80,采用全雙工模式,當數(shù)據(jù)包長度小于60字節(jié)時自動填充,發(fā)送時附加CRC校驗。*/
WriteByte(TCR,0x80);
WriteByte(ISR,0xFF);/*清除中斷狀態(tài)寄存器。*/
WriteByte(IMR,0x11);/*允許覆寫中斷和數(shù)據(jù)包接收中斷。*/
WriteByte(BTCR,0x30);/*中斷觸發(fā)方式為高電平有效,IRQ輸出為推挽驅(qū)動方式*/
WriteByte(CR,0x22);/*啟動芯片,AX88796B初始化完成。*/
delay(1000);
wrcurpge=read(CPR);
rdnxtpge=wrcurpge;
2 數(shù)據(jù)包的發(fā)送和接收
判斷AX88796B是否接收到新的數(shù)據(jù)包有兩種方式:輪循和中斷。單片機用輪循方式較多。為了提高CPU性能和實時性要求,這里采用中斷方式。當網(wǎng)卡接收到新數(shù)據(jù)包時進入中斷,首先判斷CPR是否等于BNRY,若相等,則表示接收緩沖區(qū)已被存滿,則停止接收數(shù)據(jù)包,而不會覆蓋舊的數(shù)據(jù);若不等,則將接收緩沖區(qū)中待讀取的數(shù)據(jù)包的起始地址寫入RSAR[0,1]寄存器,數(shù)據(jù)包的開始4字節(jié)寫入RBCR[0,1]寄存器,并啟動遠端DMA讀命令,通過讀取4個信息字節(jié)得到待讀取數(shù)據(jù)包的長度、接收狀態(tài)和下一個將被讀的頁的指針信息。然后通過遠端DMA讀命令,將數(shù)據(jù)包從網(wǎng)卡SRAM中讀入CPU內(nèi)存中,并更新讀頁指針寄存器BNRY,CPU每從網(wǎng)卡內(nèi)存中讀走一頁數(shù)據(jù),BNRY便加一,這需要通過程序?qū)崿F(xiàn)。網(wǎng)卡通過CPR將接收到的數(shù)據(jù)包寫入接收緩沖區(qū),每寫完一頁,CPR將自動加一,當加到最后的空頁(這里是PSTOP=0x80)時,CPR將自動恢復為接收緩沖區(qū)的首頁(PSTART=0x4c)。網(wǎng)卡接收關(guān)鍵性代碼如下:
/*AX88796B_receive*/
uint8 rcvinfo[4],i;
uint16 pktlength,index;
/*得到待讀取數(shù)據(jù)包的信息,并將其保存在rcvinfo數(shù)組中*/
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;
/*根據(jù)得到的待讀取數(shù)據(jù)包的長度pktlength,將數(shù)據(jù)包讀入CPU內(nèi)存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通道將網(wǎng)卡發(fā)送緩沖區(qū)的起始地址和要發(fā)送的字節(jié)數(shù)分別寫入RSAR[0,1]和RBCR[0,1],然后啟動遠端DMA寫命令即可將數(shù)據(jù)包寫入網(wǎng)卡內(nèi)存,此后將字節(jié)數(shù)寫入TBCR[0,1]寄存器,啟動發(fā)送命令就可將數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)上。網(wǎng)卡發(fā)送的關(guān)鍵代碼如下:
/*AX88796B_transmit*/
/*將數(shù)據(jù)寫入網(wǎng)卡的發(fā)送緩沖區(qū)*/
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);
/*發(fā)送緩沖區(qū)的數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)*/
WriteByte (TBCR0,(uint8)(len&0xFF));
WriteByte (TBCR1,(uint8)(len>>8));
WriteByte (CR,0x26);
3 中斷處理
中斷的處理和CPU關(guān)聯(lián)密切,在軟件中必須先配置好網(wǎng)卡的片選線和中斷信號線。數(shù)據(jù)包到來時,網(wǎng)卡將其保存在SARM中,同時觸發(fā)一個中斷。處理器接收到中斷信號后,進入中斷處理程序。在中斷處理程序中讀AX88796B的中斷狀態(tài)寄存器ISR來判斷是什么樣類型的中斷,如果讀出的值的最低位為1,則代表是數(shù)據(jù)包接收中斷,這時需觸發(fā)一個消息,進入到讀網(wǎng)卡函數(shù)。讀網(wǎng)卡函數(shù)的功能是將網(wǎng)絡(luò)數(shù)據(jù)包從網(wǎng)卡的內(nèi)存接收到主機中,接著向上層傳遞,進行相應(yīng)的處理。
一個報文的發(fā)送過程就是通過調(diào)用寫網(wǎng)卡函數(shù),將報文發(fā)送到網(wǎng)卡的內(nèi)存中去。然后將AX88796的控制寄存器(CR)的發(fā)送位TXP(Transmit packet)位置1,即將報文發(fā)送。
中斷處理子程序的關(guān)鍵代碼:
/*IRQ0_handler*/
uint8 InterruptStatus;
InterruptStatus=read(ISR);//讀中斷狀態(tài)寄存器
write(IMR,0x00);//禁止中斷
write(ISR,InterruptStatus);//清除中斷狀態(tài)寄存器
if(InterruptStatus&0x01)//是否為數(shù)據(jù)包接收中斷
OSQPost(TcpIpMsgQ,&idx);//通知上位機接收到數(shù)據(jù)包
write(IMR,0x11);//使能接收中斷和覆寫中斷
評論