基于AX88796B的網絡接口模塊的設計與實現
2 AT91r40008與AX88796B接口電路
本文引用地址:http://www.104case.com/article/86294.htm電路如圖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復位。*/
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)。網卡接收關鍵性代碼如下:
CPU通過遠端DMA通道將網卡發送緩沖區的起始地址和要發送的字節數分別寫入RSAR[0,1]和RBCR[0,1],然后啟動遠端DMA寫命令即可將數據包寫入網卡內存,此后將字節數寫入TBCR[0,1]寄存器,啟動發送命令就可將數據包發送到網絡上。網卡發送的關鍵代碼如下:
3 中斷處理
中斷的處理和CPU關聯密切,在軟件中必須先配置好網卡的片選線和中斷信號線。數據包到來時,網卡將其保存在SARM中,同時觸發一個中斷。處理器接收到中斷信號后,進入中斷處理程序。在中斷處理程序中讀AX88796B的中斷狀態寄存器ISR來判斷是什么樣類型的中斷,如果讀出的值的最低位為1,則代表是數據包接收中斷,這時需觸發一個消息,進入到讀網卡函數。讀網卡函數的功能是將網絡數據包從網卡的內存接收到主機中,接著向上層傳遞,進行相應的處理。
一個報文的發送過程就是通過調用寫網卡函數,將報文發送到網卡的內存中去。然后將AX88796的控制寄存器(CR)的發送位TXP(Transmit packet)位置1,即將報文發送。
中斷處理子程序的關鍵代碼:
評論