摘 要: 設(shè)計(jì)了一種基于以太網(wǎng)控制器W5100和32 bit ARM微處理器STM32F105V的嵌入式以太網(wǎng)通信接口,。介紹了W5100的工作原理、接口硬件設(shè)計(jì)及軟件設(shè)計(jì)方案,。硬件部分采用SPI總線接口模式實(shí)現(xiàn)STM32F105V與W5100連接,,軟件部分著重對網(wǎng)絡(luò)控制器的4個獨(dú)立端口編程,,實(shí)現(xiàn)以太網(wǎng)數(shù)據(jù)快速收發(fā)功能。本接口設(shè)計(jì)可直接應(yīng)用于工業(yè)數(shù)據(jù)采集系統(tǒng)開發(fā),。
關(guān)鍵詞: W5100,;STM32F105V;以太網(wǎng),;嵌入式
隨著以太網(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)用前景,。
參考文獻(xiàn)
[1] ST.STM32F105xx datasheet.2010.
[2] WIZnet.W5100 datasheet version1.1.8. 2009.
[3] 姚冰,康世英,謝佳.嵌入式以太網(wǎng)接口硬件部分的設(shè)計(jì)與實(shí)現(xiàn)[J].微處理機(jī),,2008,,29(2):155-157.
[4] 成都加聯(lián)科技有限公司.W5100在嵌入式系統(tǒng)中實(shí)現(xiàn)TCP/IP網(wǎng)絡(luò)通信的應(yīng)用[R].2009.
[5] 段海龍,彭輝俊,,程健.基于ARM的嵌入式以太網(wǎng)通信的實(shí)現(xiàn)[J].機(jī)械與電子,,2006(2):9-12.