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