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