基于TMS320 C6455的以太網(wǎng)通信程序的設(shè)計(jì)
摘要:文中介紹了TMS320 C64155 DSP EMAC接口的構(gòu)成以及工作原理和關(guān)鍵數(shù)據(jù)結(jié)構(gòu),參考相關(guān)的以太網(wǎng)驅(qū)動(dòng)程序,完成了基于C6455 DSP的以太網(wǎng)通信程序的設(shè)計(jì)。該網(wǎng)絡(luò)通信程序實(shí)現(xiàn)了某款信號(hào)處理機(jī)與上位機(jī)之間的高速通信接口。系統(tǒng)測試結(jié)果表明,利用C6455實(shí)現(xiàn)的以太網(wǎng)通信接口完全滿足系統(tǒng)設(shè)計(jì)要求,并且系統(tǒng)具有組成簡單、系統(tǒng)集成度高等優(yōu)點(diǎn)。該方案在其他多功能信號(hào)處理設(shè)備方面具有一定的應(yīng)用價(jià)值。
關(guān)鍵詞:TMS320 C6455;DSP;以太網(wǎng)通信;網(wǎng)絡(luò)驅(qū)動(dòng)程序
隨著以太網(wǎng)技術(shù)的普及和發(fā)展,以太網(wǎng)的通信速率從百兆網(wǎng)逐漸進(jìn)入了千兆網(wǎng),甚至萬兆網(wǎng),其通信速率已經(jīng)滿足了常用信號(hào)處理機(jī)所需要的吞吐率。而以前僅用來做信號(hào)處理的DSP器件逐漸也加入了以太網(wǎng)通信功能,常見的如TI公司的DM642,C6455,C6678等DSP器件都帶有以太網(wǎng)接口,這給一些需要高速通信接口的信號(hào)處理板的設(shè)計(jì)提供了極大的便利。本文利用某處理板上的TI公司高端DSP器件TMS320 C6455,完成了信號(hào)處理板與人機(jī)界面之間的高速以太網(wǎng)通信功能。系統(tǒng)測試結(jié)果表明,利用C6455實(shí)現(xiàn)的以太網(wǎng)通信接口完全滿足系統(tǒng)設(shè)計(jì)要求,并且系統(tǒng)具有組成簡單、系統(tǒng)集成度高等優(yōu)點(diǎn)。
1 硬件平臺(tái)
信號(hào)處理板的主要硬件包括兩路高速DAC,兩路高速ADC以及一塊Xilinx V5的FPGA和一塊TMS320 C6455DSP處理器,其中網(wǎng)絡(luò)通信接口部分主要包括C6455、PHY芯片和RJ45接口,如圖1所示。C6455的EMAC接口與信號(hào)板上的PHY芯片以GMII方式連接,支持千兆雙工通信模式。
2 C6455 EMAC接口介紹
C6455的EMAC接口主要由3部分構(gòu)成,包括MDIO模塊、EMAC模塊、EMAC控制模塊。其中MDIO模塊通過802.3協(xié)議規(guī)定的串行通信接口,完成以太網(wǎng)物理層芯片的配置和管理:EMAC模塊負(fù)責(zé)以太網(wǎng)數(shù)據(jù)包的發(fā)送和接收;EMAC控制模塊作為DSP核和EMAC接口之間的橋梁,實(shí)現(xiàn)DSP核對EMAC模塊和MDIO模塊的控制。
如圖2所示,EMAC接口通過C6455提供的外設(shè)總線與DSP核連接,外設(shè)總線中的配置總線提供DSP核對EMAC寄存器的訪問,數(shù)據(jù)總線完成DSP核與EMAC接口之間的以太網(wǎng)通信包的交換。此外,EMAC控制模塊將EMAC模塊和MDIO模塊產(chǎn)生的18個(gè)中斷信號(hào)綜合在一起,對外提供一個(gè)中斷信號(hào),發(fā)往C6455的中斷控制器,成為C6455處理器的第17號(hào)系統(tǒng)事件。C6455的DSP核在接到中斷信號(hào)后,通過查詢EMAC控制模塊提供的中斷狀態(tài)寄存器判斷中斷產(chǎn)生的中斷源。
包緩存描述符(Packet Buffer Descriptors)在C6455的網(wǎng)絡(luò)通信中起到關(guān)鍵的作用,應(yīng)用程序和EMAC接口之間的信息交換主要是通過包緩存描述符來實(shí)現(xiàn)。包緩存描述符的結(jié)構(gòu)如圖3所示,每個(gè)包緩存描述符大小為16個(gè)字節(jié),其中各個(gè)域的意義如下:Next Descriptor Poin ter表示指向下一個(gè)描述符的指針,這樣多個(gè)包緩存描述符可以形成一個(gè)單向鏈表;Buffer Pointer表示指向接收或者發(fā)送數(shù)據(jù)內(nèi)存空間的指針,EMAC模塊根據(jù)該指針,啟動(dòng)內(nèi)部的DMA引擎將數(shù)據(jù)放入到內(nèi)部FIFO以便發(fā)送,或者從內(nèi)部FIFO讀出到該地址,以便應(yīng)用程序處理;Buffer Offset表示從Buffer Pointer指向的地址到有效數(shù)據(jù)之間的距離;Buffer Length表示該緩存器指向數(shù)據(jù)的大小;Flags表示該緩存器指向的數(shù)據(jù)是否是應(yīng)用程序數(shù)據(jù)包的起始包,或是結(jié)束包;Packets Length表示應(yīng)用程序數(shù)據(jù)包的總長度,應(yīng)用程序包可能是由一個(gè)或者多個(gè)包緩存描述符構(gòu)成。
EMAC模塊以鏈表的形式處理包緩存描述符,描述符鏈表的第一個(gè)地址需要寫入EMAC的頭描述符寄存器(head descriptor pointer),EMAC從頭描述符寄存器指向的描述符開始,逐個(gè)處理鏈表中所有的描述符,直到遇到Next Descriptor Pointer為零的描述符。當(dāng)鏈表中所有的描述符都處理完成時(shí),EMAC向DSP核發(fā)出一個(gè)中斷,并將處理完的最后一個(gè)描述符的地址寫入發(fā)送/接收完成寄存器,DSP核通過中斷和完成寄存器與EMAC進(jìn)行發(fā)送或接收數(shù)據(jù)的同步。
3 以太網(wǎng)通信程序設(shè)計(jì)
文中設(shè)計(jì)的以太網(wǎng)通信程序是基于TI公司提供的DSP操作系統(tǒng)DSP/BIOS之上,由該操作系統(tǒng)提供時(shí)鐘定時(shí)、任務(wù)同步、硬件中斷管理等功能。如圖4所示,以太網(wǎng)通信程序主要由DSP/BIOS操作系統(tǒng)、網(wǎng)絡(luò)驅(qū)動(dòng)程序和用戶程序構(gòu)成。DSP/BIOS操作系統(tǒng)為其他模塊提供定時(shí)、任務(wù)同步等服務(wù);網(wǎng)絡(luò)驅(qū)動(dòng)程序完成以太網(wǎng)通信功能;用戶程序負(fù)責(zé)解釋并執(zhí)行人機(jī)界面發(fā)送的命令和數(shù)據(jù)。網(wǎng)絡(luò)驅(qū)動(dòng)程序主要包括以太網(wǎng)硬件驅(qū)動(dòng)程序和幾個(gè)基本的網(wǎng)絡(luò)協(xié)議,包括ICMP,ARP和UDP協(xié)議,其中,以太網(wǎng)硬件驅(qū)動(dòng)程序的設(shè)計(jì)是文中描述的重點(diǎn),其主要包括MDIO驅(qū)動(dòng)程序與EMAC驅(qū)動(dòng)程序。MDIO驅(qū)動(dòng)程序完成C6455 EMAC與物理芯片的交互,而EMAC驅(qū)動(dòng)程序?yàn)橛脩舫绦蛱峁┝艘蕴W(wǎng)通信接口。
3.1 MDIO驅(qū)動(dòng)模塊的設(shè)計(jì)
MDIO模塊主要負(fù)責(zé)搜索、配置和監(jiān)控外部以太網(wǎng)物理收發(fā)芯片。該模塊主要包括如下幾個(gè)部分:MDIO硬件初始化;PHY芯片搜索和配置;PHY芯片狀態(tài)監(jiān)控。詳細(xì)的設(shè)計(jì)描述如下:
3.1.1 MDIO硬件初始化
MDIO硬件初始化包括如下步驟:
1)讀取C6455設(shè)備狀態(tài)寄存器(DEVSTFAT)中的MACSEL位,確定EMAC與PHY芯片之間的連接方式。文中所涉及的信號(hào)處理板上的C6455 EMAC與PHY芯片之間采用GMII方式連接。
2)初始化MDIO狀態(tài)機(jī),將狀態(tài)機(jī)置為初始化狀態(tài)。
3)配置MDIO訪問PHY芯片的時(shí)鐘并使能MDIO模塊。
3.1.2 PHY芯片搜索和配置
由于PHY芯片的搜索過程并無確定的時(shí)間,因此PHY芯片搜索和配置的實(shí)現(xiàn)采用狀態(tài)機(jī)來實(shí)現(xiàn),該狀態(tài)機(jī)每隔100 ms根據(jù)查詢到的PHY芯片的狀態(tài)完成相應(yīng)的操作并更新到下一狀態(tài),如圖5所示。PHY芯片的搜索經(jīng)過芯片復(fù)位,通信速率自協(xié)商等過程,最終與通信對端建立以太網(wǎng)物理層連接。
3.1.3 PHY芯片狀態(tài)監(jiān)控
在以太網(wǎng)物理層鏈路的建立后,有可能由于用戶拔出網(wǎng)線、對端機(jī)器改變通信接口速率等情況而導(dǎo)致鏈路狀態(tài)改變,因此MDIO模塊需要每隔一段時(shí)間對網(wǎng)絡(luò)進(jìn)行監(jiān)控。文中設(shè)計(jì)的狀態(tài)監(jiān)控模塊由DSP/BIOS操作系統(tǒng)每隔100 ms查詢一次網(wǎng)絡(luò)狀態(tài),狀態(tài)監(jiān)控程序一旦發(fā)現(xiàn)鏈路狀態(tài)有所變化,則根據(jù)引起鏈路變化的不同原因,進(jìn)入相應(yīng)的處理流程。該流程如圖5中“鏈路連接”狀態(tài)以及相應(yīng)的轉(zhuǎn)移狀態(tài)所示。
3.2 EMAC驅(qū)動(dòng)模塊的設(shè)計(jì)
EMAC驅(qū)動(dòng)模塊主要負(fù)責(zé)以太網(wǎng)數(shù)據(jù)包的接收和發(fā)送,它是以太網(wǎng)驅(qū)動(dòng)程序的主要組成部分。該模塊主要包括如下幾個(gè)部分:EMAC硬件初始化;EMAC接收模塊;EMAC發(fā)送模塊。各個(gè)模塊詳細(xì)的設(shè)計(jì)描述如下:
3.2.1 EMAC硬件初始化
EMAC硬件初始化主要的目的是將EMAC模塊置于就緒狀態(tài),此時(shí)EMAC已經(jīng)可以接收和發(fā)送以太網(wǎng)數(shù)據(jù)包。初始化過程主要包括如下步驟:
1)禁止EMAC中斷,復(fù)位EMAC的HDP寄存器、統(tǒng)計(jì)寄存器等,設(shè)置EMAC的MAC地址,掛接應(yīng)用程序提供的回調(diào)函數(shù)等操作。
2)根據(jù)需求為發(fā)送模塊和接收模塊分配相應(yīng)的包緩存描述符,并初始化接收模塊的包緩存描述符,使之指向應(yīng)用程序提供的數(shù)據(jù)接收存儲(chǔ)塊。文中設(shè)計(jì)的以太網(wǎng)驅(qū)動(dòng)程序?yàn)榻邮漳K分配了32個(gè)包緩存描述符,為發(fā)送模塊分配了480個(gè)包緩存描述符,為發(fā)送和接收模塊共分配了64塊存儲(chǔ)塊,每個(gè)存儲(chǔ)塊大小為4 096個(gè)字節(jié)。圖6是接收模塊初始化完成后,接收描述符和接收存儲(chǔ)塊之間的關(guān)系。
如圖6,文中用EMAC_Ch_Struct結(jié)構(gòu)體涵蓋了接收模塊所用到的鏈表指針。其中,DescQueue表示空的接收存儲(chǔ)塊鏈表,EMAC在接收到一塊數(shù)據(jù)時(shí),啟動(dòng)EMAC內(nèi)部的DMA,將數(shù)據(jù)放入當(dāng)前描述符指向的存儲(chǔ)塊,并通過中斷通知應(yīng)用程序有數(shù)據(jù)到達(dá);pDescFirst指向接收描述符鏈表的首地址,pDescLast指向接收描述符鏈表的末地址;pDescRead指向第一個(gè)可使用的描述符;pDescWrite指向最后一個(gè)可使用的描述符;
3)配置MAC的是否為多播地址,使能以太網(wǎng)中斷,EMAC處于就緒狀態(tài)。
3.2.2 EMAC接收模塊
EMAC接收模塊主要由EMAC中斷來驅(qū)動(dòng)。當(dāng)EMAC硬件接收完一個(gè)或多個(gè)包數(shù)據(jù)時(shí),會(huì)向DSP核發(fā)出一個(gè)接收完成中斷。DSP核在接收到中斷后,調(diào)用應(yīng)用程序提供的接收數(shù)據(jù)回調(diào)函數(shù)處理接收到的數(shù)據(jù),并返回給中斷服務(wù)程序一個(gè)空閑的存儲(chǔ)塊,中斷服務(wù)程序?qū)⒃摯鎯?chǔ)塊重新鏈接到接收存儲(chǔ)塊鏈表,完成接收數(shù)據(jù)流程。
3.2.3 EMAC發(fā)送模塊
EMAC發(fā)送模塊主要由一個(gè)發(fā)送接口函數(shù)ethSendPacket(char*Buffer,int Length)構(gòu)成,用戶程序通過調(diào)用該函數(shù)完成以太網(wǎng)數(shù)據(jù)的發(fā)送。該函數(shù)參數(shù)中,Buffer表示應(yīng)用程序需要發(fā)送的數(shù)據(jù),Length表示發(fā)送數(shù)據(jù)的長度。該函數(shù)首先將Buffer中的數(shù)據(jù)拷貝到空閑的存儲(chǔ)塊,并將該儲(chǔ)存塊加入如圖7所示的WaitQueue隊(duì)列中,WaitQueue隊(duì)列表示等待加入EMAC發(fā)送隊(duì)列(DescQueue)的存儲(chǔ)塊。ethSendPacket函數(shù)接著檢查EMAC發(fā)送隊(duì)列DescQueue是否有空閑的發(fā)送描述符,如果有,將WaitQueue鏈表中的存儲(chǔ)塊加入到DeseQueue。EMAC硬件將通過相應(yīng)的描述符,將DescQueue中的數(shù)據(jù)發(fā)送出去。
當(dāng)數(shù)據(jù)發(fā)送完成后,EMAC向DSP核發(fā)出一個(gè)發(fā)送完成中斷。發(fā)送完成中斷服務(wù)程序?qū)l(fā)送后的存儲(chǔ)塊從DescQueue中移除并交還給應(yīng)用程序,然后將使用過的發(fā)送描述符置為空閑狀態(tài),以便下次發(fā)送數(shù)據(jù)時(shí)使用。
3.3 ARP/ICMP/UDP網(wǎng)絡(luò)協(xié)議模塊的設(shè)計(jì)
為了與上位機(jī)完成網(wǎng)絡(luò)通信,信號(hào)處理機(jī)還必須提供基本的網(wǎng)絡(luò)通信協(xié)議。文中在設(shè)計(jì)時(shí),主要提供了ARP/ICMP/UDP 3種網(wǎng)絡(luò)協(xié)議。ARP協(xié)議主要完成信號(hào)處理機(jī)IP地址和MAC地址的轉(zhuǎn)換;ICMP協(xié)議主要完成測試信號(hào)處理機(jī)與上位機(jī)之間的網(wǎng)絡(luò)連通性;UDP協(xié)議主要完成實(shí)際指令和數(shù)據(jù)的通信。
文中簡化了這些網(wǎng)絡(luò)協(xié)議模塊的設(shè)計(jì),設(shè)計(jì)的主要思路是解析3種協(xié)議的包格式,并根據(jù)不同協(xié)議,封裝相應(yīng)的回應(yīng)包,發(fā)送給上位機(jī)。在UDP協(xié)議設(shè)計(jì)中,為了保證數(shù)據(jù)能夠準(zhǔn)確送達(dá)上位機(jī),加入了CRC校驗(yàn)和出錯(cuò)重傳機(jī)制。協(xié)議處理流程如圖8所示。
4 結(jié)束語
文中以TMS320C6455為核心芯片,通過對C6455 EMAC硬件的研究,參考相關(guān)的以太網(wǎng)驅(qū)動(dòng)程序,完成了C6455的以太網(wǎng)通信程序的設(shè)計(jì)。結(jié)果表明,文中設(shè)計(jì)的以太網(wǎng)驅(qū)動(dòng)程序以及網(wǎng)絡(luò)協(xié)議模塊較好的滿足了處理機(jī)對實(shí)時(shí)高效數(shù)據(jù)通信的基本需求,省卻了對信號(hào)處理機(jī)硬件的修改,降低了系統(tǒng)的復(fù)雜度,為其他項(xiàng)目的開發(fā)提供了很好的借鑒。
但在對信號(hào)處理機(jī)網(wǎng)絡(luò)吞吐性能的測試過程中發(fā)現(xiàn)實(shí)際的網(wǎng)絡(luò)吞吐速率與千兆以太網(wǎng)的理論速率還是有較大的差距。如何進(jìn)一步優(yōu)化驅(qū)動(dòng)程序的架構(gòu)和關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的算法,以便進(jìn)一步提高網(wǎng)絡(luò)吞吐率,是筆者下一步的研究方向。