隨著以太網(wǎng)技術(shù)在工業(yè)遠(yuǎn)程監(jiān)控和數(shù)據(jù)采集領(lǐng)域的飛速發(fā)展,基于以太網(wǎng)的應(yīng)用接口設(shè)備也迅速普及到醫(yī)療設(shè)備、工廠電力系統(tǒng)等應(yīng)用。然而,嵌入式以太網(wǎng)接口設(shè)計(jì)的核心器件是網(wǎng)絡(luò)控制芯片,其性能優(yōu)劣直接影響網(wǎng)絡(luò)通信的效率。
本文結(jié)合ARM技術(shù),采用32 bit STM32F105V微處理器和高性能的以太網(wǎng)控制芯片W5100實(shí)現(xiàn)高性能、高可靠性的嵌入式以太網(wǎng)通信接口設(shè)計(jì),其系統(tǒng)各功能模塊容易擴(kuò)展和升級。
1 總體設(shè)計(jì)
在嵌入式系統(tǒng)設(shè)計(jì)高速發(fā)展的過程中,與傳統(tǒng)的基于現(xiàn)場總線方式相比,結(jié)合嵌入式系統(tǒng)和以太網(wǎng)技術(shù)來實(shí)現(xiàn)數(shù)據(jù)采集和控制功能越來越受到廣大嵌入式設(shè)計(jì)者的青睞,而通信接口設(shè)計(jì)實(shí)質(zhì)是能夠?qū)崿F(xiàn)TCP/IP網(wǎng)絡(luò)通信協(xié)議。使用本接口模塊的核心控制器W5100,應(yīng)用程序設(shè)計(jì)者無需深入了解TCP/IP協(xié)議,也無需考慮以太網(wǎng)的控制,只需訪問網(wǎng)絡(luò)控制器的寄存器,并靈活創(chuàng)建和選擇TCP及UDP套接字(Socket)函數(shù)就可以簡單地實(shí)現(xiàn)網(wǎng)絡(luò)通信,且不需要操作系統(tǒng)的支持,其具有硬件電路簡單、編程方便等特點(diǎn),解決了一般嵌入式設(shè)計(jì)的軟件設(shè)計(jì)復(fù)雜、網(wǎng)絡(luò)編程工作量大等問題,再結(jié)合32 bit高性能ARM處理器以真正實(shí)現(xiàn)以太網(wǎng)的高速實(shí)時傳輸。ARM完成對應(yīng)用程序的處理,W5100實(shí)現(xiàn)數(shù)據(jù)傳輸和通信網(wǎng)絡(luò)協(xié)議的處理。
具體實(shí)現(xiàn)過程:數(shù)據(jù)信號或模擬信號可以通過STM32F105V豐富的外設(shè)接口(RS232總線、CAN總線等)輸入或直接通過外部數(shù)據(jù)總線輸入,并且可以用ARM處理器對傳輸?shù)臄?shù)據(jù)和信號做一些預(yù)處理工作,然后傳輸?shù)絎5100芯片完成網(wǎng)絡(luò)協(xié)議的處理,再通過網(wǎng)絡(luò)接口傳輸?shù)竭h(yuǎn)程終端(PC機(jī))。相反,遠(yuǎn)程終端可以通過以太網(wǎng)發(fā)出控制指令,將傳輸信號發(fā)送至ARM或數(shù)據(jù)輸出端,從而實(shí)現(xiàn)嵌入式系統(tǒng)中網(wǎng)絡(luò)數(shù)據(jù)的采集和傳輸控制。系統(tǒng)框架如圖1所示。
本設(shè)計(jì)利用JTAG接口燒寫程序到ARM內(nèi)部的Flash,外擴(kuò)I2C接口的128×8(1 Kbits)EEPROM,基地址為Ox40005400,用來存儲網(wǎng)絡(luò)IP地址、端口號、子網(wǎng)掩碼等網(wǎng)絡(luò)信息,網(wǎng)絡(luò)傳輸狀態(tài)指示燈(LED)反映了數(shù)據(jù)傳輸?shù)膶?shí)時狀態(tài)。電源由外部電源提供,分別經(jīng)過MC7805和AS1117芯片穩(wěn)壓轉(zhuǎn)換輸出5 V和3.3 V的電壓,這樣就能夠很好地滿足內(nèi)核、外設(shè)以及外部電路的供電[1]。
2 網(wǎng)絡(luò)控制器W5100
W5100是WIZnet公司最新推出的固件網(wǎng)絡(luò)芯片,內(nèi)部集成了10/100 Mb/s以太網(wǎng)控制器,支持自動應(yīng)答(全雙工/半雙工模式),最高通信速率達(dá)25 Mb/s。W5100將TCP/IP協(xié)議棧、以太網(wǎng)MAC和PHY三種功能集成于一體,支持硬件化的TCP、UDP、ICMP、IPv4 ARP、IGMP、PPPoE、以太網(wǎng)等協(xié)議,并提供了多種總線接口方式(直接總線接口、間接總線接口、SPI總線)便于連接各類單片機(jī),可以滿足不同應(yīng)用場合的需求。
W5100內(nèi)含公共存儲器、端口存儲器、發(fā)送存儲器以及接收存儲器。公共寄存器用來設(shè)置W5100的工作模式、中斷向量、IP地址、網(wǎng)關(guān)地址、子網(wǎng)掩碼、物理地址、超時值等相關(guān)信息;端口寄存器平均分為4個相等的存儲器大小,可以單獨(dú)對4個獨(dú)立的網(wǎng)絡(luò)通道(Socket)設(shè)置端口的通信模式(TCP客戶端模式、TCP服務(wù)器模式、UDP模式),實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)的通信;內(nèi)部16 KB存儲器的發(fā)送和接收數(shù)據(jù)緩沖區(qū)(8 KB的發(fā)送緩存和8 KB接收緩存區(qū))用來存放臨時數(shù)據(jù)。W5100支持ADSL連接(支持PPPoE協(xié)議、帶PAP/CHAP驗(yàn)證),支持自動極性變換(MDI/MDIX)并附帶有多功能LED指示燈輸出,時鐘信號由外部晶振25 MHz提供,分別接入XTLP、XTLN管腳。
W5100支持80腳的LQFP小型封裝,0.18 μm CMOS工藝,符合環(huán)保要求。3.3 V的單電源工作電壓,I/O口可承受5 V電壓,可以滿足低功耗要求[2]。
3 通信接口硬件設(shè)計(jì)
本設(shè)計(jì)采用嵌入式微處理器和以太網(wǎng)控制器的方式實(shí)現(xiàn)接口轉(zhuǎn)換,需要用到的芯片主要包括STM32F105V微處理器,W5100網(wǎng)絡(luò)控制器及帶網(wǎng)絡(luò)變壓器的RJ-45接口13F-60系列,AT24LC01B EEPROM等。采用SPI總線接口模式,實(shí)現(xiàn)STM32F105V和網(wǎng)絡(luò)控制器的硬件連接。在串行接口模式下,只需要連接幾個簡單的引腳就可以進(jìn)行數(shù)據(jù)通信[3]。SPI總線接口模式下硬件連接如圖2所示。
本系統(tǒng)微處理器采用ST公司的STM32F105V,并采用專門設(shè)計(jì)的Cortex-M3內(nèi)核,時鐘頻率可達(dá)72 MHz,256 KB Flash存放程序或數(shù)據(jù),64 KB的RAM存放數(shù)據(jù),多達(dá)80個I/O接口可以映射到20個外部中斷。STM32F105V與W5100供電電壓都是3.3 V,所以可以直接連接。
配置W5100的SEN引腳必須通過一個10 kΩ的電阻接高電平,以選擇W5100的SPI接口模式,置STM32F105V為SPI主模式,W5100為SPI從模式,在SPI總線模式下的配置復(fù)用輸入輸出接口(AFIO)的PA5、PA6、PA4、PA7分別為SCLK、MISO、/SCS(SPI從模式選擇,低電平有效)、MOSI信號線直接相連,并用軟件設(shè)置管腳的輸出最大速度為10 MHz,STM32F105V通過SPI對W5100讀寫操作。
配置PB5口作為W5100的復(fù)位信號/RST_W,低電平有效。為實(shí)現(xiàn)準(zhǔn)確的硬件復(fù)位,復(fù)位引腳RST_W上復(fù)位信號至少保持2 μs。
配置PB1口為外部中斷線1(EXTI1),并作為W5100的中斷信號輸出端/INT,低電平有效。當(dāng)W5100在端口產(chǎn)生連接、斷開、接收數(shù)據(jù)、數(shù)據(jù)發(fā)送完成以及通信超時等條件下,該引腳輸出低電平信號指示微處理器。
配置PA8口為W5100輸出的以太網(wǎng)物理層信號燈(LINKLED)指示W(wǎng)5100的網(wǎng)絡(luò)連接狀態(tài),通過上拉電阻輸入到微處理器,低電平有效。
此外,為縮小接口設(shè)計(jì)的面積,本設(shè)計(jì)采用10/100 Mb/s的13F-60系列帶網(wǎng)絡(luò)變壓器的RJ45接口,W5100的RXIP接RJ45的RD+,RXIN接RD-,并帶有左右兩個狀態(tài)燈,連接狀態(tài)燈(LINKLED)和動態(tài)指示燈顯示接收與發(fā)送狀態(tài)(ACT_LED),通過一個高速開關(guān)二極管共陽極(開關(guān)速度最大值4 ns,重復(fù)反向峰值耐壓最大值75 V)與W5100的RXLED/TXLED管腳相連,供電電壓為3.3 V,直接與W5100相連。差分接收和發(fā)送引腳分別通過兩個75 Ω的電阻和0.001 μF的電容接地。RJ45接口的內(nèi)部結(jié)構(gòu)圖如圖3所示。
4 通信接口的軟件設(shè)計(jì)
4.1 初始化程序設(shè)計(jì)
本系統(tǒng)初始化通過定義結(jié)構(gòu)體的方式完成STM32F105V微處理器和W5100的初始化[4-5]。
微處理器完成系統(tǒng)時鐘、外設(shè)時鐘、系統(tǒng)啟動模式、嵌入式向量式中斷控制寄存器、I2C、通用輸入輸出接口、通用異步接收發(fā)送器、通用定時器以及SPI等的初始化。
W5100的初始化主要設(shè)置一些關(guān)鍵的寄存器:
(1)設(shè)置模式寄存器(MR)bit[7](軟件復(fù)位位)為1,初始化芯片內(nèi)部寄存器,復(fù)位后自動清0。
(2)設(shè)置中斷屏蔽寄存器(IMR)為OxFF(屏蔽中斷源),啟動IP地址沖突異常中斷和端口n寄存器(Sn_INT)中斷等,通過向相應(yīng)的中斷屏蔽位寫1,任何時候只要中斷寄存器(IR)對應(yīng)的位也置1,則中斷將產(chǎn)生,CPU通過訪問IR獲得中斷來源。
(3)設(shè)置重發(fā)時間寄存器(RTR)為200 ms(Ox07D0),當(dāng)發(fā)出連接、斷開等命令而沒有收到遠(yuǎn)程對端的響應(yīng)或響應(yīng)延遲時,產(chǎn)生重發(fā)過程。
(4)配置重發(fā)計(jì)數(shù)寄存器(RCR)為8,設(shè)定重發(fā)的次數(shù)。
(5)設(shè)置接收緩沖區(qū)的大小寄存器(RMSR)和發(fā)送存儲空間大小寄存器(TMSR)都為0x55,每個端口接口和發(fā)送存儲空間分別分配2 KB的存儲空間。
(6)設(shè)置端口n模式寄存器(Sn_MR)為OxA1,啟動廣播功能,設(shè)置端口n協(xié)議類型為TCP模式。
(7)設(shè)置端口n命令寄存器(Sn_CR),端口的初始化、建立/斷開連接以及數(shù)據(jù)傳輸?shù)取?br />
(8)設(shè)置端口n的最大分片長度寄存器(Sn_MSS)為1 460。
初始化完成后,根據(jù)SPI協(xié)議編寫發(fā)送字節(jié)函數(shù)SPI_SendByte(),配合Read_W5100和Write_W5100完成字節(jié)的讀取和發(fā)送,這里需要定義讀操作碼(OxF0)和寫操作碼(Ox0F),實(shí)現(xiàn)微處理器與W5100數(shù)據(jù)通信。
4.2 Socket初始化程序設(shè)計(jì)
W5100與終端之間的數(shù)據(jù)交換有多種通信方式,本文采用基于TCP模式的通信方式。TCP是以連接為基礎(chǔ)的通信方式,端口n在進(jìn)行數(shù)據(jù)通信時,必須先建立連接。TCP有兩種建立連接方式,一種是服務(wù)器模式(被動模式),需要等待連接請求;另一種是客戶端模式(主動打開),需要發(fā)送連接請求給服務(wù)器。本設(shè)計(jì)配置W5100為服務(wù)器模式,只需對W5100的Socket進(jìn)行配置就可以完成網(wǎng)絡(luò)數(shù)據(jù)的收發(fā)和啟動功能。
當(dāng)Socket作為服務(wù)器模式時,初始化端口需要設(shè)置運(yùn)行模式(Sn_MR)和本機(jī)端口號(Sn_Port),并在端口命令寄存器打開(OPEN)端口。引用Socket_Listen(SOCKET s)程序,只調(diào)用一次該程序就可使W5100設(shè)置為服務(wù)器模式。主要程序如下所示。
Write_W5100((W5100_S0_MR+s*0x100),S_MR_TCP);
//設(shè)置Socket為TCP模式
Write_W5100((W5100_S0_CR+s*0x100),S_CR_OPEN);
//打開Socket
Write_W5100((W5100_S0_CR+s*0x100),S_CR_LISTEN);
//設(shè)置Socket為偵聽模式
Write_W5100((W5100_S0_CR+s*0x100),S_CR_CLOSE);
//關(guān)閉Socket
完成Socket的打開和設(shè)置偵聽工作后,至于遠(yuǎn)程客戶端是否與其連接,則需要等待Socket中斷,在服務(wù)器偵聽模式下,不需要設(shè)置目的IP和目的端口號。
W5100在TCP服務(wù)器模式下的處理流程如圖4所示。
4.3 中斷處理程序設(shè)計(jì)
本設(shè)計(jì)采用中斷方式來處理數(shù)據(jù)包的接收和發(fā)送,以提高效率。在W5100處理中斷的過程中,微處理器首先通過應(yīng)訪問W5100的中斷寄存器(IR)獲得產(chǎn)生中斷的來源。中斷寄存器與中斷屏蔽寄存器配合使用,且位是一一對應(yīng)的,中斷屏蔽寄存器(IMR)的相應(yīng)位可屏蔽中斷寄存器中任何中斷源。因此,若要使用某個中斷源,先要將該中斷源在中斷屏蔽寄存器中的相應(yīng)位置位,以打開所需的中斷源,這樣,中斷才會產(chǎn)生。當(dāng)中斷產(chǎn)生后,即進(jìn)入中斷處理程序。本設(shè)計(jì)中的中斷源主要包括端口n中斷事件。一般設(shè)置有Socket成功連接(S_IR_CON)、斷開連接(S_IR_DISCON)、數(shù)據(jù)發(fā)送完成(S_IR_SENDOK)、接收到數(shù)據(jù)(S_IR_RECV)或傳輸超時(S_IR_TIMEOUT)等事件中斷。
本文以端口0接收到數(shù)據(jù)包后的產(chǎn)生一個接收數(shù)據(jù)中斷為例說明中斷處理過程。首先,在使用端口0中斷之前,應(yīng)在初始化程序中將中斷屏蔽寄存器(IMR)中的端口0置位(IMR_S0_INT),當(dāng)Socket0發(fā)生中斷時,IMR_S0_INT=1、IR_S0_INT=1、動態(tài)LED燈亮顯示接收狀態(tài),此時,W5100的中斷輸出管腳(/INT)輸出低電平,以通知微處理器有中斷產(chǎn)生,微處理器訪問中斷寄存器獲取中斷源為接收數(shù)據(jù)中斷;然后進(jìn)入中斷處理函數(shù),啟動發(fā)送函數(shù)(S_rx_process)。
4.4 Socket數(shù)據(jù)接收程序設(shè)計(jì)
當(dāng)端口接收數(shù)據(jù)時,產(chǎn)生接收中斷。首先調(diào)用端口接收數(shù)據(jù)包函數(shù)Process_Socket_Data(),并對接收到的數(shù)據(jù)類型進(jìn)行判斷和加工。本過程先調(diào)用接收函數(shù)S_rx_process()從W5100端口的接收數(shù)據(jù)緩存區(qū)讀取數(shù)據(jù),然后將讀取的數(shù)據(jù)加上接收存儲器讀指針寄存器(S0_RX_RD)的值再寫入S0_RX_RD,最后將RECV命令重新寫入端口0的命令寄存器(S0_CR),以等待下次數(shù)據(jù)的接收?;蛘邔⑻幚硗甑臄?shù)據(jù)拷貝到發(fā)送緩沖區(qū),再調(diào)用S_tx_process函數(shù)發(fā)送數(shù)據(jù)包給CPU。主要程序如下:
其中Oxaa和Ox55為接收數(shù)據(jù)包的標(biāo)志頭;長度位為數(shù)據(jù)包字節(jié)長度,不包括數(shù)據(jù)包頭和本身字符,命令位為對對象數(shù)據(jù)的操作,為0時讀取數(shù)據(jù),為1時設(shè)置對象數(shù)據(jù),目標(biāo)代碼位用來顯示對象代碼,如Ox00為網(wǎng)關(guān)IP、Ox01為子網(wǎng)掩碼、0x02為物理地址、LED為狀態(tài)顯示等;數(shù)據(jù)位為接收到的數(shù)據(jù),數(shù)據(jù)是以16進(jìn)制形式接收,最后再加上2 B的數(shù)據(jù)報(bào)頭和1 B的數(shù)據(jù)本身。
4.5 Socket數(shù)據(jù)發(fā)送程序設(shè)計(jì)
通過Socket發(fā)送數(shù)據(jù)時,調(diào)用發(fā)送數(shù)據(jù)函數(shù)S_tx_process。首先把要發(fā)送的數(shù)據(jù)緩存在發(fā)送緩沖區(qū)(Tx_buffer)中。此外,在發(fā)送數(shù)據(jù)時,需先檢查發(fā)送緩存區(qū)的剩余空間的大小(Sn_TX_FSR),控制發(fā)送數(shù)據(jù)的字節(jié)數(shù),如用以太網(wǎng)協(xié)議發(fā)送的數(shù)據(jù)最大傳送單元(MTU)不超過1 500 B。在TCP服務(wù)器模式下,在數(shù)據(jù)發(fā)送處理過程中,可不設(shè)置目標(biāo)主機(jī)的IP和端口號。剩余空間的大小因?qū)懭霐?shù)據(jù)的增加而減少,數(shù)據(jù)發(fā)送后又自動增加。當(dāng)發(fā)送緩沖區(qū)的數(shù)據(jù)完全寫入端口的發(fā)送數(shù)據(jù)緩存區(qū)后,則將數(shù)據(jù)本身長度加上端口傳輸寫指針寄存器(Sn_TX_WR)中的值再寫入Sn_Tx_WR,再計(jì)算發(fā)送緩沖區(qū)的偏移量(tx_offset),用于指示發(fā)送數(shù)據(jù)的長度,最后啟動發(fā)送(Sn_CR_SEND)。相關(guān)程序如下:
i=tx_offset/S_TX_SIZE //計(jì)算實(shí)際物理偏移值,
//S_TX_SIZE由TMSR定義為2 K
tx_offset=tx_offset-i*S_TX_SIZE //計(jì)算實(shí)際物理地址
//j= W5100_TX+s*S_TX_SIZE+tx_offset
Write_W5100(j,Tx_Buffer[i]) //將發(fā)送緩沖區(qū)中的
//數(shù)據(jù)寫入到端口的發(fā)送緩沖區(qū)
Write_W5100((W5100_S0_CR+s*0x100),S_CR_SEND)
//啟動發(fā)送的指令
本文以基于ARM Cortex-M3的微處理器STM32F105V為核心,結(jié)合W5100網(wǎng)絡(luò)控制芯片實(shí)現(xiàn)了嵌入式以太網(wǎng)的連接,該接口設(shè)計(jì)具有硬件設(shè)計(jì)簡單、成本低、集成高度以及軟件開發(fā)周期短等優(yōu)點(diǎn),在自動化控制和數(shù)據(jù)傳輸領(lǐng)域有著廣泛的市場和應(yīng)用前景。