嵌入式系統(tǒng)以太網(wǎng)接口的設計
DM9008可尋址的空間有32個,分別為00H~1FH。其中00H~0FH是寄存器區(qū),00H作為命令寄存器,通過設置可選擇3個頁面,10H~17H為數(shù)據(jù)端口,18H~1FH為復位端口。
3.1 DM9008的初始化
DM9008的具體初始化過程如下(CPU對DM9008的尋址需要加上基地址,為了描述方便,省略掉基地址直接用DM9008的內部地址描述寄存器地址):
(1)讀入1FH端口數(shù)據(jù),再寫回該地址以啟動DM9008工作。
(2)向命令寄存器CR(00H)寫入21H,選擇寄存器頁面0,并進行軟件復位。
(3)設置數(shù)據(jù)結構寄存器DCR(0EH)為48H。
(4)設置方式狀態(tài)寄存器TCR(0DH)為02H。
(5)讀出網(wǎng)絡的物理地址:
a. 設置遠程DMA計數(shù)器RBCR1(0BH)、RBCR0(0AH)的值為000CH;
b.設置遠程DMA地址RSAR1(09H)、RSAR0(08H)的值為0000H;
c. 設置命令寄存器CR(00H)為遠程DMA讀,即0AH;
d. 重復從數(shù)據(jù)端口(10H)讀6個字節(jié),這6個字節(jié)即網(wǎng)絡物理地址;
e.停止遠程DMA,設置CR為21H,RBCR1、RBCR0為0000H。
(6)設置接收狀態(tài)寄存器RCR(0CH)為04H。
(7)劃分緩沖區(qū)為接收緩沖區(qū)和發(fā)送緩沖區(qū),并建立接收緩沖環(huán)。將DM9008內部RAM地址為4000H~4BFFH設置為發(fā)送緩沖區(qū),4C00H~7FFFH設置為接收緩沖區(qū),即設置PSTART(01H)為4CH,PSTOP(02H)為80H,BNRY(03H)為4CH。
(8)設置CR為61H,選擇頁面1。
(9)設置網(wǎng)卡地址寄存器,把PAR0(01H)~PAR5(06H)設置為前面讀出的物理地址。
(10)設置當前頁面寄存器CURR(07H)為PSTART+1,即4DH。
(11)清除多址寄存器,即MAR0(08H)~MAR7(0FH)為00H。
(12)設置CR為21H,選擇寄存器頁面0。
(13)清除中斷狀態(tài)寄存器ISR(07H)為0FFH。
(14)設置中斷屏蔽寄存器IMR(0FH)為3BH,即接收中斷允許、接收錯誤中斷允許、發(fā)送錯誤中斷允許、溢出中斷允許、計數(shù)器溢出中斷允許。
(15)設置發(fā)送設置寄存器TCR(0DH)為00H。
(16)設置CR為22H,芯片進入工作狀態(tài)。
至此,DM9008的初始化過程完成,DM9008處于接收狀態(tài)。只要網(wǎng)絡上有可以接收的數(shù)據(jù)包,DM9008自動將數(shù)據(jù)存入接收緩沖區(qū)并在收完后向CPU發(fā)中斷申請。
3.2 接收數(shù)據(jù)
DM9008收到一個完整的以太網(wǎng)數(shù)據(jù)包后,向CPU發(fā)出中斷請求,CPU響應DM9008的中斷申請后,進入中斷服務程序并開始接收數(shù)據(jù),具體過程如下。
(1)讀出中斷狀態(tài)寄存器ISR,并寫回該寄存器。
(2)判斷是否數(shù)據(jù)接收中斷,如果不是,不執(zhí)行以下步驟。
(3)設置CR為22H,選擇頁面0。
(4)設置遠程DMA地址寄存器RSAR1、RSAR0為接收地址指針,該指針高位字節(jié)初始值位PSTART+1,低位字節(jié)為0。
(5)設置遠程DMA計數(shù)器RBCR1、RBCR0為0004H;
(6)設置CR為遠程讀0AH,讀數(shù)據(jù)端口,讀出4個字節(jié),這4個字節(jié)第1個字節(jié)表示接收狀態(tài),第2個字節(jié)為下一包開始地址指針,第3~4個字節(jié)為本數(shù)據(jù)包的長度(高位字節(jié)在前)。
(7)設置CR為22H,遠程DMA完成。
(8)根據(jù)接收狀態(tài)判斷數(shù)據(jù)包是否接收正確,如果接收正確,啟動遠程DMA,收取該數(shù)據(jù)包并進行處理。
(9)結束遠程DMA,設置下一次接收數(shù)據(jù)指針和接收邊界指針。
3.3 發(fā)送數(shù)據(jù)
數(shù)據(jù)的發(fā)送過程應包含三個步驟:數(shù)據(jù)包的封裝;通過遠程DMA將數(shù)據(jù)包送入DM9008的數(shù)據(jù)發(fā)送緩沖區(qū);通過DM9008的本地DMA將數(shù)據(jù)送入FIFO進行發(fā)送。具體過程如下:
(1)數(shù)據(jù)包在發(fā)送前應該按規(guī)定的格式封裝好,格式如下:
(2)把上面的數(shù)據(jù)包通過遠程DMA寫送入DM9008的數(shù)據(jù)發(fā)送緩沖區(qū)。
a. 設置CR為22H,選擇寄存器頁面0;
b. 設置中斷狀態(tài)寄存器ISR為40H,清除發(fā)送完成標志;
c.設置遠程DMA地址寄存器RSAR1、RSAR0為4000H,即發(fā)送緩沖區(qū)開始地址,
d. 設置遠程DMA字節(jié)計數(shù)寄存器RBCR1、RBCR0為發(fā)送數(shù)據(jù)包的長度,
e. 設置CR為12H,設置命令寄存器為遠程DMA寫,
f. 往數(shù)據(jù)端口寫入發(fā)送數(shù)據(jù),
g. 查詢中斷狀態(tài)寄存器ISR,等待遠程DMA完成,
h. 設置CR為22H,設置RBCR1、RBCR0為0,遠程DMA停止,
i. 設置ISR為40H,清除發(fā)送完成標志。
(3)啟動本地DMA,把數(shù)據(jù)發(fā)送出去。
a. 設置發(fā)送字節(jié)計數(shù)器TBCR1(06H)、TBCR0(05H)為發(fā)送數(shù)據(jù)包的長度;
b. 設置發(fā)送頁面起始地址TPSR(04H)為40H,即發(fā)送緩沖區(qū)開始地址高位字節(jié);
c. 設置命令寄存器CR為26H,啟動發(fā)送。
3.4 高層通信協(xié)議
上述發(fā)送、接收過程所完成的協(xié)議是MAC層和物理層的協(xié)議。要真正實現(xiàn)嵌入式系統(tǒng)與以太網(wǎng)上其它設備(如PC機)之間的通信,還需要在嵌入式系統(tǒng)中實現(xiàn)更高層的通信協(xié)議,如TCP/IP協(xié)議,這樣PC機的程序員就可以使用TCP/IP協(xié)議透明地訪問嵌入式系統(tǒng)的數(shù)據(jù)。
因此上述以8051單片機系統(tǒng)為例的嵌入式系統(tǒng)的軟件設計中除了實現(xiàn)收發(fā)數(shù)據(jù)的功能外,還需要實現(xiàn)TCP/IP協(xié)議及更高層的應用層協(xié)議才能真正實現(xiàn)整個系統(tǒng)的通信功能。由于TCP/IP協(xié)議的實現(xiàn)通常采用C語言,并且有現(xiàn)成的源程序,所以在用8051系列單片機編程時,可采用C51語言并參考TCP/IP標準的源程序來具體實現(xiàn)。有關這方面內容,可以查看有關TCP/IP協(xié)議方面的資料。
評論