摘 要: 采用DAVICOM公司的以太網(wǎng)控制芯片和TI公司的TMS320C6713設(shè)計(jì)了網(wǎng)絡(luò)通信電路。該設(shè)計(jì)適用于各種嵌入式設(shè)備以及各種信號(hào)處理設(shè)備中。為各種設(shè)備之間的通信提供解決方案。給出了TMS320C6713和DM9000A的接口電路和軟件編程實(shí)現(xiàn)。
關(guān)鍵詞: DSP; 以太網(wǎng); DM9000A; TCP/IP協(xié)議
隨著嵌入式技術(shù)和網(wǎng)絡(luò)技術(shù)的發(fā)展及以太網(wǎng)的廣泛應(yīng)用,各種應(yīng)用設(shè)備的網(wǎng)絡(luò)化成為未來設(shè)備發(fā)展的一個(gè)重要方向。各種嵌入式設(shè)備已經(jīng)成功滲透到生產(chǎn)生活的各個(gè)領(lǐng)域,并逐漸朝著網(wǎng)絡(luò)化、智能化的方向發(fā)展[1]。以太網(wǎng)因其在實(shí)時(shí)操作、可靠傳輸、標(biāo)準(zhǔn)統(tǒng)一等方面的卓越性能及其便于安裝、維護(hù)簡單、不受通信距離限制等優(yōu)點(diǎn),已發(fā)展成為一種成熟的技術(shù)。人們希望通過網(wǎng)絡(luò)連接各種現(xiàn)場,協(xié)調(diào)各種設(shè)備間的工作,實(shí)現(xiàn)設(shè)備的網(wǎng)絡(luò)化控制與管理。AVICOM公司的DM9000A是實(shí)現(xiàn)網(wǎng)絡(luò)通信的芯片,它占用很少的硬件資源,可以在不改變設(shè)備其他性能的基礎(chǔ)上給設(shè)備加入網(wǎng)絡(luò)功能。開發(fā)一個(gè)嵌入式通信控制器不僅實(shí)現(xiàn)了設(shè)備上網(wǎng)的低成本解決方案,同時(shí)也提升了設(shè)備信息化水平。隨著數(shù)字信息技術(shù)、網(wǎng)絡(luò)技術(shù)和嵌入式系統(tǒng)的高速發(fā)展,如視頻監(jiān)控、遠(yuǎn)程控制、信息家電、網(wǎng)絡(luò)攝像頭都離不開嵌入式設(shè)備與網(wǎng)絡(luò)的結(jié)合,嵌入式系統(tǒng)的以太網(wǎng)接口設(shè)計(jì)已成為目前的一個(gè)研究熱點(diǎn)。因此嵌入式以太網(wǎng)接口的設(shè)計(jì)對于嵌入式網(wǎng)絡(luò)系統(tǒng)的建立是十分必要的。目前,Linux 操作系統(tǒng)己經(jīng)越來越廣泛地被應(yīng)用于嵌入式設(shè)備[2],編寫Linux下的設(shè)備驅(qū)動(dòng)程序十分有意義。
1 DM9000A芯片介紹
DM9000A是DAVICOM公司推出的一款高速以太網(wǎng)接口芯片,其基本特征是:集成10M/100M物理層接口;內(nèi)部帶有16 KB SRAM用作接收發(fā)送的FIFO緩存;支持8/16 bit兩種主機(jī)工作模式;通過HP認(rèn)證的AUTO-Mdix(支持直接互連自動(dòng)翻轉(zhuǎn))功能;支持TCP/IP加速(IPv4 check sum offload)減輕CPU負(fù)擔(dān),提高整機(jī)效能;10 ns I/O讀寫時(shí)間。該電路還集成了EEPROM接口,自舉時(shí)通過EEPROM接口輸入到芯片中,從而實(shí)現(xiàn)自動(dòng)初始化。在現(xiàn)有以太網(wǎng)控制器芯片中大多數(shù)速度是10 M的,其傳輸速率慢, DM9000A是成本低速度快的以太網(wǎng)控制器芯片,速度10M/100M自適應(yīng)。它被設(shè)計(jì)為低功耗、高處理性能, 而其操作又非常簡單, 具有通用的處理器接口,可以與多種處理器直接連接,容易完成不同系統(tǒng)的軟件驅(qū)動(dòng)開發(fā)。數(shù)據(jù)總線寬度可設(shè)置為8 bit和16 bit,IO口支持3.3 V~5 V,因此幾乎可以和所有處理器連接。DM9000A以太網(wǎng)控制器遵循IEEE頒布的802.3以太網(wǎng)傳輸協(xié)議[3]。芯片內(nèi)部集成4 KB雙字節(jié)靜態(tài)存取存儲(chǔ)器, 自動(dòng)收發(fā)轉(zhuǎn)換功能使開發(fā)變得更加簡單, 容易完成不同系統(tǒng)的軟件驅(qū)動(dòng)開發(fā)。
2 DM9000A芯片的硬件接口設(shè)計(jì)
DM9000A可以很方便地與目前主流嵌入式CPU以8 bit或16 bit的總線方式連接,本文系統(tǒng)的CPU為TI公司的DSP:TMS320C6713(C6713),它是業(yè)界流行的一款高性能32 bit浮點(diǎn)DSP,在255 MHz時(shí)鐘主頻下,其最高執(zhí)行速度可達(dá)1 800 MIPS。C6713擁有豐富的片內(nèi)資源,常用于數(shù)字處理領(lǐng)域,二者的接口設(shè)計(jì)如圖1。
現(xiàn)在的設(shè)備都包含數(shù)字處理器,DM9000A可以很容易地應(yīng)用到各種設(shè)備里。由圖1可以看到,TMS320C6713與DM9000A硬件連接簡單。系統(tǒng)上電時(shí),DSP通過總線配置DM9000A內(nèi)部網(wǎng)絡(luò)控制寄存器(NCR)、中斷寄存器(ISR)等,完成DM9000A的初始化。隨后,DM9000A進(jìn)入數(shù)據(jù)收發(fā)等待狀態(tài)。該電路還集成了EEPROM接口,自舉時(shí)通過EEPROM接口輸入配置數(shù)據(jù)到芯片中,從而實(shí)現(xiàn)自動(dòng)初始化。數(shù)據(jù)總線SD0-SD15可以直接掛在處理器的數(shù)據(jù)總線上,無需電平轉(zhuǎn)換。如果EECS接一個(gè)10 kΩ的上拉電阻,芯片在上電時(shí)將被配置成8 bit數(shù)據(jù)總線模式,此時(shí)SD8-SD15可以用作GPIO。再加一個(gè)硬件協(xié)議棧,可以將其用在沒有處理器的設(shè)備中。
3 DM9000A芯片的操作
對處理器驅(qū)動(dòng)網(wǎng)卡芯片來說,比較關(guān)心的有以下幾個(gè)引腳:IOR、IOW、CMD(A2)、INT、RST以及數(shù)據(jù)引腳SD0~SD15。IOR和IOW是DM9000的讀寫選擇引腳,低電平有效,即在信號(hào)的上升沿進(jìn)行讀(IOR)寫(IOW)操作。CMD為命令/數(shù)據(jù)選擇引腳,低電平時(shí)讀寫命令操作,高電平時(shí)讀寫數(shù)據(jù)操作,將它接到處理器的地址線A2上。如DM9000A工作的基地址為0x80000000,則DM9000A有兩個(gè)的地址:命令口地址(0x80000000)和數(shù)據(jù)口地址(0x80000004)。DM9000A有多個(gè)寄存器,通過先向命令口寫寄存器地址,再向數(shù)據(jù)口寫寄存器數(shù)據(jù)來配置芯片。數(shù)據(jù)總線SD0-SD15則根據(jù)數(shù)據(jù)總線的位數(shù)接到處理器數(shù)據(jù)總線上。收發(fā)數(shù)據(jù)也是通過讀寫相應(yīng)的寄存器實(shí)現(xiàn)。
圖2和圖3分別顯示了DM9000A的讀寫時(shí)序,由圖可知,DM9000A的讀寫操作與一般的異步存儲(chǔ)器相同。根據(jù)芯片資料,編寫讀寫寄存器的子函數(shù)。
寄存器的讀操作:
#define DM_INDEX *(volatile unsigned int *)0x8000000
#define DM_DATA *(volatile unsigned int *)0x8000004
int dm9000_reg_read(char reg)
{ DM_INDEX = reg;
return DM_ DATA; }
寄存器的寫操作:
void dm9000_reg_write(char reg, char data)
{ DM_ INDEX = reg;
DM_ DATA = data; }
4 DM9000A芯片的初始化
對DM9000A芯片的初始化,就是向相應(yīng)的寄存器寫入期望的值,為芯片的穩(wěn)定工作做好準(zhǔn)備。表1列出各寄存器的名稱、地址以及賦參考值,寄存器的具體功能可以參考DM9000A的用戶手冊。
初始化中還要對PAR(10H--15H)寄存器初始化,PAR中保存的是芯片物理地址即通常的MAC地址,芯片根據(jù)網(wǎng)絡(luò)數(shù)據(jù)與PAR中的數(shù)據(jù)比較來確定保存或丟棄數(shù)據(jù)。初始化后,可以通過讀NCR寄存器來判斷芯片是否已經(jīng)連上網(wǎng)絡(luò)。
5 DM9000A芯片數(shù)據(jù)的發(fā)送和接收
在傳送數(shù)據(jù)封包之前,需將其封包數(shù)據(jù)存放在DM9000A的內(nèi)存中。DM9000A的內(nèi)部RAM地址0000h~0BFFh用來存放發(fā)送數(shù)據(jù)包。用戶無需關(guān)心數(shù)據(jù)存放的地址,只要向MWCMD寄存器寫入數(shù)據(jù)包即可,內(nèi)部數(shù)據(jù)指針會(huì)自動(dòng)更新,將MWCMD寄存器的數(shù)據(jù)依次存到內(nèi)部RAM。另外還需將要傳送封包的大小存放在TXPLH和TXPLL寄存器中。之后再將TCR的bit0設(shè)為1,此時(shí)芯片開始進(jìn)行封包的傳送。而在傳送完成后,會(huì)將傳送是否成功的信息放在TSRI、TSRll中。
以下為數(shù)據(jù)發(fā)送的函數(shù):datas為要發(fā)送的數(shù)據(jù)在處理器緩沖區(qū)的地址,len(兩個(gè)字節(jié))為要發(fā)送的數(shù)據(jù)長度(以字節(jié)為單位)。
void sendpacket(char *datas, unsigned int len)
{unsigned int i;
dm9000_reg_write(IMR, 0x80);//先禁止網(wǎng)卡中斷,防止在發(fā)送數(shù)據(jù)時(shí)被中斷干擾。
DM_ INDEX = MWCMD; //寫命令寄存器
for(i=0; i<len; i+=2) //16 bit mode
DM_DATA = datas[i] | (datas[i+1]<<8);
dm9000_reg_write(TXPLH, (len>>8) & 0x0ff);
dm9000_reg_write(TXPLL, len & 0x0ff);
dm9000_reg_write(TCR, 0x01); //請求發(fā)送數(shù)據(jù)
dm9000_reg_write(IMR, 0x81);
//DM9000網(wǎng)卡的接收中斷使能
}
數(shù)據(jù)的發(fā)送比較簡單,接收相對復(fù)雜一點(diǎn)。DM9000接收到數(shù)據(jù)包時(shí),會(huì)存放于DM9000接收內(nèi)存的0C00h~3FFFh中。若是讀取位置超過3FFFh時(shí),DM9000會(huì)自動(dòng)將位置移到OC00h的位置。在每一個(gè)數(shù)據(jù)包前,會(huì)增加4 B存放數(shù)據(jù)包相關(guān)資料。接收數(shù)據(jù)包時(shí)首先要讀取這4個(gè)字節(jié)來確定數(shù)據(jù)包的狀態(tài),第一個(gè)字節(jié)“01H”表示接下來的是有效數(shù)據(jù)包,若為“00H”則表示沒有數(shù)據(jù)包,若為其他值則表示網(wǎng)卡沒有正確初始化,需要重新初始化。在讀取其他字節(jié)之前,必需要確定第1個(gè)字節(jié)是否為“01h”。第2個(gè)字節(jié)則為這個(gè)數(shù)據(jù)包的相關(guān)信息,其格式與RSR寄存器的格式一樣。第3和4個(gè)字節(jié)是存放這個(gè)封包的長度大小(不包括前四個(gè)字節(jié))。
如果接收到的數(shù)據(jù)包長度小于60 B,則DM9000會(huì)自動(dòng)為不足的字節(jié)補(bǔ)上0,使其達(dá)到60 B。同時(shí),在接收到的數(shù)據(jù)包后DM9000還會(huì)自動(dòng)添加4個(gè)CRC校驗(yàn)字節(jié)??梢圆挥杼幚怼S谑?,接收到的數(shù)據(jù)包的最小長度也會(huì)是64 B。
接收數(shù)據(jù)包的過程:(1)讀MRCMDX寄存器,判斷是否有數(shù)據(jù)包。(2)如有數(shù)據(jù)包,讀MRCMD寄存器,根據(jù)數(shù)據(jù)包的長度信息將整個(gè)數(shù)據(jù)包讀取出來。其中第一步需要做兩遍,因?yàn)榈谝淮巫x到的值總為0。
以下為數(shù)據(jù)包接收的函數(shù):datas為接收到是數(shù)據(jù)存儲(chǔ)位置,接收成功返回1,不成功返回0。
unsigned int receivepacket(unsigned char *datas)
{
unsigned int i, tem;
unsigned int status, len;
unsigned char ready;
ready = 0; //希望讀取到“01H”
status = 0; //數(shù)據(jù)包狀態(tài)
len = 0; //數(shù)據(jù)包長度
/*以上為有效數(shù)據(jù)包前的4個(gè)狀態(tài)字節(jié)*/
ready = dm9000_reg_read(MRCMDX);
//第一次讀取,一般讀取到的是00H
ready = dm9000_reg_read(MRCMDX);
//第二次讀取,總能讀對if(ready!= 0x01)
{ if(ready!= 0x00)
//若第二次讀取到的不是01H或00H,則
表示沒有初始化成功
{ dm9000_reg_write(IMR, 0x80);
//屏幕網(wǎng)卡中斷
DM9000_init();//重新初始化
dm9000_reg_write(IMR, 0x81);
//打開網(wǎng)卡中斷
}
retrun 0;
}
}
/*以上表示若接收到的第一個(gè)字節(jié)不是“01H”,則表示沒有數(shù)據(jù)包,返回0*/
status = dm9000_reg_read(MRCMD);
len = DM_DATA;
if(!(status & 0xbf00) && (len < 1522))
{ for(i=0; i<len; i+=2)// 16 bit mode
{ tem = DM_ DATA;
datas[i] = tem & 0x0ff;
datas[i+1] = (tem >> 8) & 0x0ff;
}
}
else
{
return 0;
}
6 網(wǎng)絡(luò)數(shù)據(jù)傳輸協(xié)議
以上完成了以太網(wǎng)數(shù)據(jù)包的收發(fā),應(yīng)用網(wǎng)絡(luò)傳輸還需要完整的網(wǎng)絡(luò)傳輸協(xié)議,TCP/IP協(xié)議為互聯(lián)網(wǎng)通用協(xié)議。TCP/IP協(xié)議族是一整套把各種系統(tǒng)連接在一起并保證數(shù)據(jù)準(zhǔn)確快速傳輸?shù)囊?guī)定和格式[4]。通常把TCP/IP協(xié)議族抽象成為一種具有四層結(jié)構(gòu)的模型:鏈路層、網(wǎng)絡(luò)層、運(yùn)輸層、應(yīng)用層。每層各負(fù)責(zé)一個(gè)或一系列獨(dú)立的功能。根據(jù)各種協(xié)議的格式編寫相應(yīng)的數(shù)據(jù)處理函數(shù)。在有操作系統(tǒng)的應(yīng)用中,要編寫網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。設(shè)備驅(qū)動(dòng)程序需要完成網(wǎng)絡(luò)設(shè)備的注冊、初始化與注銷以及進(jìn)行發(fā)送和接收數(shù)據(jù)處理,并能針對傳送超時(shí)、中斷等情況進(jìn)行及時(shí)處理[5]。
DM9000A的操作簡單,模塊獨(dú)立,不會(huì)影響原設(shè)備的性能指標(biāo),為設(shè)備間的通信提供保障。在沒有處理器的裝備中,93C46可以正確初始化芯片,硬件協(xié)議棧能正確處理收發(fā)數(shù)據(jù)。傳輸協(xié)議有成熟的TCP/IP協(xié)議,在簡單的通信和控制系統(tǒng)中,可以應(yīng)用簡單的數(shù)據(jù)傳輸協(xié)議,縮短開發(fā)周期,提高設(shè)備的效率。
參考文獻(xiàn)
[1] 雒珊,尹崗.基于ARM 的以太網(wǎng)通信控制器的設(shè)計(jì)[J].電子測量技術(shù),2009, 23(10):133-135.
[2] 趙軍.嵌入式平臺(tái)上Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的開發(fā)[J].電腦知識(shí)與技術(shù),2009,5(33):9272-9273.
[3] 陳 峰,彭 龑,易 彬,等.基于嵌入式技術(shù)的以太網(wǎng)接口設(shè)計(jì)[J].通信技術(shù),2010,43(5):127-129.
[4] 劉春燕,顏興建.嵌入式TCP/IP協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2010,6(8):1815-1816.
[5] 周敬瓊,周鳳星.基于ARM 的Linux 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序開發(fā)[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2009,30(22):5124-5127.