嵌入式Internet以太網(wǎng)接口的設計與實(shí)現
摘要: 基于DSP和較新的自適應10M/100M嵌入式以太網(wǎng)控制器芯片LAN91C111,介紹了嵌入式系統的軟硬件實(shí)現方法。
本文引用地址:http://dyxdggzs.com/article/149787.htm在電子設備日趨網(wǎng)絡(luò )的背景下,目前廣泛使用的以太網(wǎng)及TCP/IP協(xié)議已經(jīng)成為事實(shí)上最常用的網(wǎng)絡(luò )標準之一,它的高速、可靠、分層及可擴充性使得它在各個(gè)領(lǐng)域的應用越來(lái)越靈活,很多情況下運用以太網(wǎng)和TCP/IP能夠簡(jiǎn)化結構和降低成本。目前關(guān)于嵌入式以太網(wǎng)的設計方案不是很多,其中大多是基于單片機的,缺點(diǎn)是速度慢、成本太高。DSP作為一種特殊的嵌入式微處理器系統,具有嵌入的協(xié)處理器和用于快速數據處理的并行數據通道,在嵌入式網(wǎng)絡(luò )設備中引入DSP技術(shù)可以使嵌入式以太網(wǎng)變得更快、更便宜、更容易進(jìn)行功能擴充。本文介紹了基于TMS320LF2407型的嵌入式系統與LAN91C111型自適應10Mb/s/100Mb/s嵌入式以太網(wǎng)控制芯片的接口電路和實(shí)現方法。
1 LAN91C111嵌入式以太網(wǎng)控制器芯片
LAN91C111是SMSC公司推出的為嵌入式應用系統設計的第三代快速以太網(wǎng)控制器。在LAN91C111芯片上集成了CSMA/CD協(xié)議的媒體層(MAC)和物理層(PHY),其系統結構圖如圖1所示。該以太網(wǎng)控制器的主要功能特性如下。
(1)自適應地選擇傳輸速率,支持10M/100Mbps。
(2) 8KB的內部存儲器用于接收和發(fā)送的緩存。
(3) 支持突發(fā)數據傳輸。
(4) 提前發(fā)送和接收功能。
(5) 支持總線(xiàn)8位、16位和32位的CPU訪(fǎng)問(wèn)。
該以太網(wǎng)控制器遵循的標準與協(xié)議為IEEE頒布的802.3以太網(wǎng)傳輸協(xié)議。8~32位數據總線(xiàn)接口單元由控制總線(xiàn)、地址總線(xiàn)和數據總線(xiàn)與外部的CPU控制芯片相連。該單元還集成了E2PROM接口,所有內部寄存器的初始值可先放在E2PROM中,自舉時(shí)通過(guò)E2PROM接口輸入到芯片中,實(shí)現自動(dòng)初始化??偩€(xiàn)仲裁器(Arbiter)監視以太網(wǎng)總線(xiàn)的數據交流情況,一旦發(fā)生阻塞,一方面通過(guò)總線(xiàn)接口單元與外部CPU聯(lián)系,另一方面控制內存控制單元(MMU),實(shí)現總線(xiàn)數據協(xié)調。內存控制單元控制8KB動(dòng)態(tài)SRAM的存儲情況,實(shí)現與DMA控制器之間的數據聯(lián)絡(luò )。DMA控制器與總線(xiàn)控制器一起控制數據在DMA與以太網(wǎng)協(xié)議處理器(EPH)之間的交換。由以太網(wǎng)協(xié)議處理器輸出的數據最終經(jīng)過(guò)10M/100M的物理層直接到達以太網(wǎng)總線(xiàn)。
2 硬件電路組成
出于性?xún)r(jià)比的考慮,采用了DSP控制器作為主CPU。TMS320LF2407是TI公司發(fā)布的240X系列中功能最強的一種控制器,有很大的存儲空間(高達32K字的Flash程序存儲器,可擴展外部64K字存儲器和64K字I/O尋址空間),非常適合于處理復雜的TCP/IP協(xié)議。
由于LAN91C111是為嵌入式系統設計,其外圍電路相對比較簡(jiǎn)單,其硬件接口框圖如圖2所示。LANC91C111內部寄存器可通過(guò)地址線(xiàn)A0~A15來(lái)訪(fǎng)問(wèn)。地址總線(xiàn)A1~A15與DSP的A1~A15相連,A0沒(méi)有被懸空;數據總線(xiàn)D0~D15與DSP的D0~D15相連,可以傳輸16位數據。D16~D32懸空(因為L(cháng)F2407是16位數據總線(xiàn));LAN91C111的片選信號AEN由DSP的外部I/O接口選通信號IS提供。二元件的讀電平RD和寫(xiě)電平WR分別相連。LAN91C111端的中斷輸出信號INTR0送入DSP的外部中斷腳XINT1 觸發(fā)中斷。TG110-S050N2是針對10M/100M以太網(wǎng)的變壓濾波器。LAN91C111模塊的Protel原理圖。
3 軟件設計
編寫(xiě)控制以太網(wǎng)接口程序的步驟如下。
3.1 μC/OSⅡ實(shí)時(shí)操作系統的移植
μC/OSⅡ是一種開(kāi)放源碼的實(shí)時(shí)嵌入式操作系統,具有很好的實(shí)時(shí)性。它是可移植、可裁減、可固化的占先式多任務(wù)操作系統,其大部分源碼由ANSI C語(yǔ)言編寫(xiě)。
移植工作包括以下幾個(gè)內容:(1)用匯編語(yǔ)言改寫(xiě)OS_ CPU_ A.ASM。(2)用C語(yǔ)言改寫(xiě)OS_CPU_C。C。(3)編寫(xiě)OS_ CPU.H。(4)適當處理OSMapTbl[ ]和OSUnMapTbl[ ]。
①OS_ CPU_ A.ASM文件包括4個(gè)子程序:OSStart-HighRdy、OSCtxsw、OSIntCtxSw和OSTickISR。
1)OSStartHighRdy()函數
當程序執行內核的OSStart函數時(shí),表示多任務(wù)系統開(kāi)始啟動(dòng), OSStart函數將調用OSStartHighRdy函數從最高優(yōu)先級任務(wù)的TCB塊中獲得該任務(wù)的堆棧指針,通過(guò)該指針,依次從該任務(wù)的任務(wù)堆棧中恢復CPU的現場(chǎng)。由于任務(wù)在堆棧初始化時(shí),已經(jīng)設定了彈出到程序指針寄存器PC的是該任務(wù)函數的入口地址,因此,OSStartHighRdy函數只需依次彈出任務(wù)棧內容到處理起寄存器,該任務(wù)便將得以運行。
2)OSCtxSw()函數
該函數是任務(wù)級的上下文切換函數,當任務(wù)被阻塞而主動(dòng)請求CPU開(kāi)始任務(wù)調度時(shí)執行,其過(guò)程是將當前任務(wù)的的CPU現場(chǎng)保存到該任務(wù)堆棧中去,然后從 OSTCBHighRdy中獲得更高優(yōu)先級任務(wù)的堆棧指針,再從該指針指向的堆棧中恢復此任務(wù)的CPU現場(chǎng),使之繼續執行,從而完成一次任務(wù)級別的切換。表2為OSCtxSw函數的偽代碼。
void OSCtxSw(void) {
保存處理器寄存器;/*將欲掛起的任務(wù)的CPU寄存器壓入當前堆棧*/
OSTCBCur->OSTCBStkPtr = sp; /*OSTCBCur目前指向的是被打斷的任務(wù)TCB,此操作
將該任務(wù)的棧頂指針保存到其OSTCBStkPtr中去,便于下次恢復時(shí)從這里獲取棧頂指針*/
OSTCBCur = OSTCBHighRdy; /*OSTCBHighRdy 指向的是就緒的高優(yōu)先級任務(wù)的TCB,
將其裝載到OSTCBCur 中來(lái)*/
SP = OSTCBHighRdy->OSTCBStkPtr; /*取得就緒的高優(yōu)先級任務(wù)的棧頂指針*/
恢復該任務(wù)的現場(chǎng)(); /*于是便可通過(guò)剛取得的棧頂指針恢復該任務(wù) */
執行中斷返回指令; /*若OSCtxSw含有軟中斷指令則需中斷返回,本移植不使用軟中斷*/
}
表2 OSCtxSw函數的偽代碼
3) OSIntCtxSw() 函數
該函數用于中斷級的上下文切換。由于CPU響應時(shí)鐘節拍中斷后,處理器從svc進(jìn)入了irq模式,并進(jìn)入時(shí)鐘節拍中斷服務(wù)函數OSTickISR, OSTickISR函數發(fā)現若有高優(yōu)先級任務(wù)需要運行,則系統不返回中斷前的任務(wù),而直接調度就緒的高優(yōu)先級任務(wù)使之盡快得到執行,以保證實(shí)時(shí)性能。但是由于OSTickISR函數一開(kāi)始已經(jīng)保存過(guò)任務(wù)中斷前的CPU現場(chǎng),因此OSIntCtxSW()不需要再進(jìn)行類(lèi)似的操作。當OSTickISR調用 OSIntExit函數找出需要運行的更高優(yōu)先級任務(wù)后,OSIntExit會(huì )將該任務(wù)的TCB指針?lè )旁贠STCBHighRdy中,然后 OSIntExit在最后調用OSIntCtxSW函數來(lái)從OSTCBHighRdy中獲取堆棧指針然后恢復該高優(yōu)先級任務(wù)的現場(chǎng),使得其繼續執行,并不再返回時(shí)鐘節拍中斷服務(wù)程序。顯然,OSIntCtxSW函數的過(guò)程和OSCtxSW函數的后半部分操作相同,因此,OSCtxSW可以借用 OSIntCtxSW的代碼。
4) OSTickISR()函數
在CPU響應時(shí)鐘節拍中斷后,程序指針PC發(fā)生跳轉后進(jìn)入該函數,由于OSTickISR調用OSTimeTick函數使得所有的延時(shí)節拍不為0的任務(wù)延時(shí)節拍數減1,并調用OSIntExit函數來(lái)找出就緒的高優(yōu)先級任務(wù),若需要切換,則最后由OSIntCtxSw來(lái)完成新任務(wù)的調度,否則仍然返回到被時(shí)鐘節拍中斷的任務(wù)。
②OS_CPU_C.C文件:本文件僅包括一個(gè)OSTaskStkInit( )子程序。該函數模仿TI公司的I$$SAVE庫函數對任務(wù)堆棧進(jìn)行初始化,被函數OSTaskCreate( )和OSTaskCreateExt( )所調用并返回任務(wù)堆棧初始化后的指針值。注意:2407A的堆棧與一般MCU不同,芯片本身的堆棧(以下簡(jiǎn)稱(chēng) US)只有 8 級,無(wú)法作為系統堆棧使用,所以C編譯器將它內部的2個(gè)寄存器AR0和AR1保留。AR1作為堆棧指針SP,AR0用做堆棧中臨時(shí)變量指針FP(在匯編程序中不要使用這2個(gè)寄存器,如果必須使用,要關(guān)中斷,并注意保存和恢復)。編譯器將函數和中斷壓進(jìn) US ,并將其返回地址彈出放在SP(AR1)指向的堆棧中,保留當前環(huán)境,不同的是函數只保留程序要使用的寄存器,中斷要調用 I$$SAVE 保存所有寄存器,返回時(shí)要跳轉到(不是調用)I$$REST(這2個(gè)函數可以在RTS.SRC中看到源代碼)恢復寄存器。這2個(gè)函數就像8086中的中斷進(jìn)入和指令I(lǐng)RET,是移植的基礎。
③OS_CPU.H文件:內容可根據μC/OS-Ⅱ中80x86的內容進(jìn)行修改。
④適當處理OSMapTbl[ ]和OSUnMapTbl[ ]:移植時(shí)還需要對μC/OSⅡ的OSMapTbl[ ]和OSUnMapTbl[ ]2個(gè)表進(jìn)行適當處理,否則會(huì )出現尋址錯誤而使μC/OSⅡ無(wú)法正常運行,這是移植能否成功的重要因素之一。由于TMS320LF2407的存儲器采用的是哈佛結構,Flash存儲器(或外擴的ROM)位于程序區,因此可按如下方法處理:將μC/OSⅡ中OSMapTbl[ ]和OSUnMapTbl[ ]的數據類(lèi)型從“INT8U const”改為“INT8U”,并在鏈接器命令文件(。CMD)中將“。cinit”塊分配到Flash存儲器(或外擴的ROM)中,鏈接選項用“。C”(ROM初始化)。這樣,在程序運行時(shí)自動(dòng)對數據區的RAM進(jìn)行初始化,即運行時(shí)自動(dòng)將“。cinit”塊中的數據復制到數據區的RAM中。
按需要配置OS_FG.H,修改CPU中斷向量表和外設向量表后,根據實(shí)際需要對其他文檔中的內容進(jìn)行相應設置即可。至此,μC/OSⅡ在TMS320LF2407上的移植就完成了。
3.2 LAN91C111的編程
對LAN91C111主要包括初始化、發(fā)送數據包和接收數據包三部分。
3.2.1 初始化
上電后,LAN91C111內部的寄存器的值設置為缺省值,CPU根據需要設置它里面的Configuration、Base和Individual Address寄存器,以保證它正常工作。
3.2.2 發(fā)送數據包流程
(1)DSP向控制器發(fā)送ALLOCATE MEMORY命令(設置MMUCOM寄存器,通常設置為0x0020)。MMU負責在控制器內部的packet buffer中為待發(fā)送的包分配存儲空間。
(2)DSP查詢(xún)中斷狀態(tài)寄存器中的ALLOC INT位,直到該位被置為1,也可以設置中斷掩碼中的ALLOC INT位,然后等待硬件中斷,這時(shí)MMU已經(jīng)分配好存儲空間。而且TX packet number放在A(yíng)llocation Result寄存器中。
(3)將Allocation Result寄存器中的packet Number拷貝到Packet NUMBER寄存器中,設置Pointer寄存器(設置為T(mén)X、WR、AUTOINC,即0x4000)。然后將包的數據從upper layer發(fā)送隊列傳送到控制器的數據寄存器。要求依次寫(xiě)人Status Word、Byte Count、destination address、source address、packet size、packet data和control word。
(4)DSP向控制器發(fā)送“ENQUEUE PACKET NUMBER TO TX FIFO”命令(設置MMUCOM寄存器,通常設置為Ox00C0),該命令將Packet Number寄存器中的packet number拷貝到TX FIFO,說(shuō)明發(fā)送的包已經(jīng)放入隊列中。同時(shí)設置傳輸控制寄存器中的TXENA位,啟動(dòng)transmitter。到目前為止,DSP的設置工作已完成,它可以空閑,直到接收到一個(gè)控制器產(chǎn)生的發(fā)送中斷。
(5)當控制器傳送完包以后,內存中的第1個(gè)字(16位)被CSMA/CD寫(xiě)入相應的狀態(tài)字,然后將TX FIFO中的packet number移到TX completion FIFO,當TX completion FIFO不為空時(shí)產(chǎn)生中斷。
(6)DSP接收到中斷后,開(kāi)始執行中斷處理程序,它讀入中斷狀態(tài)寄存器,如果產(chǎn)生發(fā)送中斷,則從FIFO端口寄存器讀入發(fā)送包的Packet Number,并將它寫(xiě)入Packet Number寄存器。然后從內存中讀入狀態(tài)字(包括設置Pointer寄存器為T(mén)X、RD、AUTOINC,即0x6000,然后從數據寄存器中讀入包的狀態(tài)字),它是EPH寄存器的鏡像,根據狀態(tài)字判斷包發(fā)送是否成功。如果成功則DSP向控制器發(fā)布RELEASE命令(設置MMUCOM寄存器,設置為Ox00A0),控制器將釋放發(fā)送包所使用的存儲空間,同時(shí)設置TX INT Acknowledge寄存器,它將TX completion FIFO中的packet number清除。有二種產(chǎn)生發(fā)送中斷的方案:①每發(fā)送一個(gè)包產(chǎn)生一個(gè)中斷。②每發(fā)送一個(gè)序列的包產(chǎn)生一個(gè)中斷。通過(guò)控制寄存器的Auto Release位來(lái)選擇這二種方案,而且這二種方案所使用的發(fā)送中斷位也有所不同。
TX INT:當TX completion FIFO不為空時(shí)置0;
TX EMPTY INT:當TX FIFO為空時(shí)置1;
AUTO RELEASE:如果置為1,發(fā)送包成功后,packet number不寫(xiě)到TX completion FIFO中,而且它所使用的存儲空間被自動(dòng)釋放。
(7)選擇使用“每發(fā)送一個(gè)包產(chǎn)生一個(gè)中斷”方案:允許TX INT中斷,AUTO RELEASE=0,這種方案的流程如上所示。
(8)選擇使用“每發(fā)送一個(gè)序列的包產(chǎn)生一個(gè)中斷”方案:允許TX EMPTY INT和TX INT,AUTO RELEASE=1,當發(fā)送完FIFO中的最后一個(gè)包后,產(chǎn)生TX EMPTY INT中斷。當發(fā)生嚴重的發(fā)送錯誤時(shí),產(chǎn)生TX INT中斷,同時(shí)將發(fā)送失敗的包的packet number保存到FIFO Ports寄存器,這樣DSP就可以知道發(fā)送過(guò)程停止了。該方案可以減少DSP的負擔,而且存儲空間的釋放也更迅速。當AUTO RELEASE=1時(shí),DSP不能得到成功發(fā)送包的packet number。
3.2.3 接收數據包流程
(1)DSP設置接收控制寄存器中的RXEN位,允許接收包。
(2)含有正確地址的包被接收到,從MMU請求存儲空間,并分派一個(gè)packet number,內部的DMA邏輯產(chǎn)生連續的地址,并將接收到的字寫(xiě)到內存中。如果超界,則包被丟棄,存儲空間被釋放。當檢測到包結束時(shí),狀態(tài)字被寫(xiě)到接收包的最前面,byte count寫(xiě)到第2個(gè)字。如果CRC校驗正確,則packet number被寫(xiě)到RX FIFO。當RX FIFO非空時(shí),產(chǎn)生RCV INT中斷;如果CRC校驗不正確,則存儲空間被釋放,而且不產(chǎn)生中斷。
(3)DSP接收到中斷后開(kāi)始執行中斷處理程序,它讀入中斷狀態(tài)寄存器,如果產(chǎn)生接收中斷(RCV INT位為1),則可以從FIFO端口寄存器得到接收的包的packet number,而且可以從數據寄存器將接收包傳送到DSP的內存或外存中。當處理結束時(shí),DSP向處理器發(fā)布REMOVE AND RELEASE FROM TOP OF RX命令(即設置寄存器MMUCOM,設置為0x0060),釋放使用的存儲空間和packet number。
4 結束語(yǔ)
對以太網(wǎng)和快速以太網(wǎng)的自動(dòng)協(xié)商模式使LAN 91C111具有很高的性?xún)r(jià)比,應用領(lǐng)域廣泛。本設計利用LAN91C111和DSP芯片組成嵌入式以太網(wǎng)通信系統,能夠正確地接入快速以太網(wǎng),具備10M/100Mbps、全雙工/半雙工自適應等多種功能,符合IEEE802.3/802.3u-100Base-TX/lOBase-T規范,實(shí)現的嵌入式以太網(wǎng)接口支持RJ45和以太網(wǎng)的連接,可以通過(guò)以太網(wǎng)接入Internet,以實(shí)現從Internet上監控嵌入式設備。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論