基于AX88796B的網(wǎng)絡(luò)接口模塊的設(shè)計(jì)與實(shí)現(xiàn)
2 AT91r40008與AX88796B接口電路
本文引用地址:http://2s4d.com/article/86294.htm電路如圖4所示。
圖4 硬件連接原理圖
AX88796B的驅(qū)動(dòng)程序設(shè)計(jì)
AX88796B的網(wǎng)卡驅(qū)動(dòng)程序是處理器CPU和網(wǎng)卡硬件的接口,網(wǎng)卡驅(qū)動(dòng)程序主要包括以下幾部分:網(wǎng)卡的初始化;數(shù)據(jù)包的接收和發(fā)送;中斷處理子程序。
1 網(wǎng)卡初始化
在網(wǎng)卡的初始化過(guò)程中除了完成對(duì)相關(guān)寄存器的定義與賦值外,還要完成對(duì)接收緩沖環(huán)的構(gòu)造。AX88796B的所有寄存器除了數(shù)據(jù)端口寄存器外都是8位數(shù)據(jù)寬度。數(shù)據(jù)端口寄存器可以通過(guò)配置DCR寄存器中的WTS設(shè)置成8位或16位寬。AX88796B將偏移量為01h~0fh的寄存器分為4頁(yè)(Page0~Page3)進(jìn)行操作。與NE2000兼容的寄存器只有3頁(yè)(Page0~Page2)。初始化需要設(shè)置頁(yè)0與頁(yè)1的相關(guān)寄存器,頁(yè)2的寄存器是只讀的,不可以設(shè)置,頁(yè)3的寄存器不是NE2000兼容的,不用設(shè)置。初始化函數(shù)主要要完成以下諸項(xiàng)工作。
/*AX88796B_init*/
/*調(diào)用復(fù)位子程序?qū)X88796B進(jìn)行復(fù)位。有兩種復(fù)位方式:一是硬件復(fù)位,通過(guò)拉高拉低RESET引腳達(dá)到復(fù)位AX88796B的目的;二是軟件復(fù)位,從0x1f端口讀數(shù)據(jù)使AX88796B復(fù)位。*/
2 數(shù)據(jù)包的發(fā)送和接收
判斷AX88796B是否接收到新的數(shù)據(jù)包有兩種方式:輪循和中斷。單片機(jī)用輪循方式較多。為了提高CPU性能和實(shí)時(shí)性要求,這里采用中斷方式。當(dāng)網(wǎng)卡接收到新數(shù)據(jù)包時(shí)進(jìn)入中斷,首先判斷CPR是否等于BNRY,若相等,則表示接收緩沖區(qū)已被存滿,則停止接收數(shù)據(jù)包,而不會(huì)覆蓋舊的數(shù)據(jù);若不等,則將接收緩沖區(qū)中待讀取的數(shù)據(jù)包的起始地址寫入RSAR[0,1]寄存器,數(shù)據(jù)包的開始4字節(jié)寫入RBCR[0,1]寄存器,并啟動(dòng)遠(yuǎn)端DMA讀命令,通過(guò)讀取4個(gè)信息字節(jié)得到待讀取數(shù)據(jù)包的長(zhǎng)度、接收狀態(tài)和下一個(gè)將被讀的頁(yè)的指針信息。然后通過(guò)遠(yuǎn)端DMA讀命令,將數(shù)據(jù)包從網(wǎng)卡SRAM中讀入CPU內(nèi)存中,并更新讀頁(yè)指針寄存器BNRY,CPU每從網(wǎng)卡內(nèi)存中讀走一頁(yè)數(shù)據(jù),BNRY便加一,這需要通過(guò)程序?qū)崿F(xiàn)。網(wǎng)卡通過(guò)CPR將接收到的數(shù)據(jù)包寫入接收緩沖區(qū),每寫完一頁(yè),CPR將自動(dòng)加一,當(dāng)加到最后的空頁(yè)(這里是PSTOP=0x80)時(shí),CPR將自動(dòng)恢復(fù)為接收緩沖區(qū)的首頁(yè)(PSTART=0x4c)。網(wǎng)卡接收關(guān)鍵性代碼如下:
CPU通過(guò)遠(yuǎn)端DMA通道將網(wǎng)卡發(fā)送緩沖區(qū)的起始地址和要發(fā)送的字節(jié)數(shù)分別寫入RSAR[0,1]和RBCR[0,1],然后啟動(dòng)遠(yuǎn)端DMA寫命令即可將數(shù)據(jù)包寫入網(wǎng)卡內(nèi)存,此后將字節(jié)數(shù)寫入TBCR[0,1]寄存器,啟動(dòng)發(fā)送命令就可將數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)上。網(wǎng)卡發(fā)送的關(guān)鍵代碼如下:
3 中斷處理
中斷的處理和CPU關(guān)聯(lián)密切,在軟件中必須先配置好網(wǎng)卡的片選線和中斷信號(hào)線。數(shù)據(jù)包到來(lái)時(shí),網(wǎng)卡將其保存在SARM中,同時(shí)觸發(fā)一個(gè)中斷。處理器接收到中斷信號(hào)后,進(jìn)入中斷處理程序。在中斷處理程序中讀AX88796B的中斷狀態(tài)寄存器ISR來(lái)判斷是什么樣類型的中斷,如果讀出的值的最低位為1,則代表是數(shù)據(jù)包接收中斷,這時(shí)需觸發(fā)一個(gè)消息,進(jìn)入到讀網(wǎng)卡函數(shù)。讀網(wǎng)卡函數(shù)的功能是將網(wǎng)絡(luò)數(shù)據(jù)包從網(wǎng)卡的內(nèi)存接收到主機(jī)中,接著向上層傳遞,進(jìn)行相應(yīng)的處理。
一個(gè)報(bào)文的發(fā)送過(guò)程就是通過(guò)調(diào)用寫網(wǎng)卡函數(shù),將報(bào)文發(fā)送到網(wǎng)卡的內(nèi)存中去。然后將AX88796的控制寄存器(CR)的發(fā)送位TXP(Transmit packet)位置1,即將報(bào)文發(fā)送。
中斷處理子程序的關(guān)鍵代碼:
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論