w5100 网上资料整理
3.1數(shù)據(jù)通信的建立
TCP是面向連接的通信方式,它首先必須建立連接.然后才能利用IP地址和端口號進行數(shù)據(jù)通信。TCP有兩種建立連接的方式,一是通過服務器模式(被動打開)等待連接請求;二是通過客戶模式(主動打開)發(fā)送連接請求給服務器。本例采用TCP客戶模式。在建立TCP連接之前,一般都需要初始化端口,包括設(shè)置端口號、設(shè)置W5100為TCP模式和寫入OPEN命令。端口初始化主要配置端口0的相關(guān)寄存器,包括:S0_PORT、S0_MR和S0_CR。
?
圖5是W5100在TCP客戶模式的處理流程。
?
?
3.2中斷處理
在處理W5100的中斷時,首先應訪問W5100的中斷寄存器(IR),可用MCU通過訪問IR獲得產(chǎn)生中斷的來源。任何中斷源都可以被中斷寄存器(IMR)的相應位所屏蔽,因此,若要使用某個中斷源,先要置位該中斷源在IMR中的相應位,這樣,當IR中對應位置位時,才會產(chǎn)生中斷。此后當中斷產(chǎn)生時,即進入中斷處理程序。對于每個中斷事件,處理方式可由用戶自己定義。
?
假如使用的是端口0中斷。可在W5100的初始化程序中先將IMR中的IM_IR 0(端口0中斷屏蔽位)置位。這樣,當端口0中斷發(fā)生時(IM_IR0=I,S0_INT=1),系統(tǒng)將開始讀端口0中斷寄存器(S0_IR),在W5100的端口寄存器中,主要設(shè)置有建立連接(CON)、終止連接(DIS
?
CON)、數(shù)據(jù)發(fā)送完成(SEND_OK)、接收數(shù)據(jù)(RECV)和超時(TIMEOUT)等中斷事件。
?
3.3 ?數(shù)據(jù)接收
當端口產(chǎn)生接收中斷時,可調(diào)用接收函數(shù)S_rx_process(SOCKET s)將端口接收到的數(shù)據(jù)緩存到Rx_buffer數(shù)組中,并返回接收的數(shù)據(jù)字節(jié)數(shù)。當讀完所有的數(shù)據(jù)后,可將接收存儲器讀指針寄存器(S0_RX_RD)的值加上讀取的數(shù)據(jù)長度,然后再寫入S0_RX_RD,最后向端口0的命令寄存器(S0_CR)寫入RECV命令,以等待下次接收數(shù)據(jù)。但要注意在計算實際物理偏移量rx_offset時,S_RX_SIZE必須保證和在初始化代碼中定義的接收緩存區(qū)的大小一致。
?
3.4 ?數(shù)據(jù)發(fā)送
通過Socket發(fā)送數(shù)據(jù)時,首先把要發(fā)送的數(shù)據(jù)緩存在Tx_buffer中。此外,在發(fā)送數(shù)據(jù)時,還需先檢查發(fā)送緩存區(qū)的剩余空間的大小,然后控制發(fā)送數(shù)據(jù)的字節(jié)數(shù)。端口發(fā)送緩存區(qū)的大小由發(fā)送存儲器空間寄存器(TMSR)確定。在數(shù)據(jù)發(fā)送處理過程中,剩余空間的大小將因?qū)懭霐?shù)據(jù)而減少,發(fā)送完成后又自動增加。把Tx_buffer的數(shù)據(jù)完全寫入端口的發(fā)送數(shù)據(jù)緩存區(qū)后,可將端口傳輸寫指針寄存器(Sn_TX_WR)中的值加上寫入的數(shù)據(jù)長度,再寫入Sn_Tx_WR,以指示發(fā)送數(shù)據(jù)的長度,最后在命令寄存器(Sn_CR)中寫入SEND命令,以啟動發(fā)送。
?
?
4 通信接口的軟件設(shè)計
4.1 初始化程序設(shè)計
本系統(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](軟件復位位)為1,初始化芯片內(nèi)部寄存器,復位后自動清0。
(2)設(shè)置中斷屏蔽寄存器(IMR)為OxFF(屏蔽中斷源),啟動IP地址沖突異常中斷和端口n寄存器(Sn_INT)中斷等,通過向相應的中斷屏蔽位寫1,任何時候只要中斷寄存器(IR)對應的位也置1,則中斷將產(chǎn)生,CPU通過訪問IR獲得中斷來源。
(3)設(shè)置重發(fā)時間寄存器(RTR)為200?ms(Ox07D0),當發(fā)出連接、斷開等命令而沒有收到遠程對端的響應或響應延遲時,產(chǎn)生重發(fā)過程。
(4)配置重發(fā)計數(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),實現(xiàn)微處理器與W5100數(shù)據(jù)通信。
4.2 Socket初始化程序設(shè)計
W5100與終端之間的數(shù)據(jù)交換有多種通信方式,本文采用基于TCP模式的通信方式。TCP是以連接為基礎(chǔ)的通信方式,端口n在進行數(shù)據(jù)通信時,必須先建立連接。TCP有兩種建立連接方式,一種是服務器模式(被動模式),需要等待連接請求;另一種是客戶端模式(主動打開),需要發(fā)送連接請求給服務器。本設(shè)計配置W5100為服務器模式,只需對W5100的Socket進行配置就可以完成網(wǎng)絡(luò)數(shù)據(jù)的收發(fā)和啟動功能。
當Socket作為服務器模式時,初始化端口需要設(shè)置運行模式(Sn_MR)和本機端口號(Sn_Port),并在端口命令寄存器打開(OPEN)端口。引用Socket_Listen(SOCKET s)程序,只調(diào)用一次該程序就可使W5100設(shè)置為服務器模式。主要程序如下所示。
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è)置偵聽工作后,至于遠程客戶端是否與其連接,則需要等待Socket中斷,在服務器偵聽模式下,不需要設(shè)置目的IP和目的端口號。
W5100在TCP服務器模式下的處理流程如圖4所示。
?
4.3 中斷處理程序設(shè)計
本設(shè)計采用中斷方式來處理數(shù)據(jù)包的接收和發(fā)送,以提高效率。在W5100處理中斷的過程中,微處理器首先通過應訪問W5100的中斷寄存器(IR)獲得產(chǎn)生中斷的來源。中斷寄存器與中斷屏蔽寄存器配合使用,且位是一一對應的,中斷屏蔽寄存器(IMR)的相應位可屏蔽中斷寄存器中任何中斷源。因此,若要使用某個中斷源,先要將該中斷源在中斷屏蔽寄存器中的相應位置位,以打開所需的中斷源,這樣,中斷才會產(chǎn)生。當中斷產(chǎn)生后,即進入中斷處理程序。本設(shè)計中的中斷源主要包括端口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中斷之前,應在初始化程序中將中斷屏蔽寄存器(IMR)中的端口0置位(IMR_S0_INT),當Socket0發(fā)生中斷時,IMR_S0_INT=1、IR_S0_INT=1、動態(tài)LED燈亮顯示接收狀態(tài),此時,W5100的中斷輸出管腳(/INT)輸出低電平,以通知微處理器有中斷產(chǎn)生,微處理器訪問中斷寄存器獲取中斷源為接收數(shù)據(jù)中斷;然后進入中斷處理函數(shù),啟動發(fā)送函數(shù)(S_rx_process)。
4.4 Socket數(shù)據(jù)接收程序設(shè)計
當端口接收數(shù)據(jù)時,產(chǎn)生接收中斷。首先調(diào)用端口接收數(shù)據(jù)包函數(shù)Process_Socket_Data(),并對接收到的數(shù)據(jù)類型進行判斷和加工。本過程先調(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ù)包的標志頭;長度位為數(shù)據(jù)包字節(jié)長度,不包括數(shù)據(jù)包頭和本身字符,命令位為對對象數(shù)據(jù)的操作,為0時讀取數(shù)據(jù),為1時設(shè)置對象數(shù)據(jù),目標代碼位用來顯示對象代碼,如Ox00為網(wǎng)關(guān)IP、Ox01為子網(wǎng)掩碼、0x02為物理地址、LED為狀態(tài)顯示等;數(shù)據(jù)位為接收到的數(shù)據(jù),數(shù)據(jù)是以16進制形式接收,最后再加上2 B的數(shù)據(jù)報頭和1 B的數(shù)據(jù)本身。
4.5 Socket數(shù)據(jù)發(fā)送程序設(shè)計
通過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服務器模式下,在數(shù)據(jù)發(fā)送處理過程中,可不設(shè)置目標主機的IP和端口號。剩余空間的大小因?qū)懭霐?shù)據(jù)的增加而減少,數(shù)據(jù)發(fā)送后又自動增加。當發(fā)送緩沖區(qū)的數(shù)據(jù)完全寫入端口的發(fā)送數(shù)據(jù)緩存區(qū)后,則將數(shù)據(jù)本身長度加上端口傳輸寫指針寄存器(Sn_TX_WR)中的值再寫入Sn_Tx_WR,再計算發(fā)送緩沖區(qū)的偏移量(tx_offset),用于指示發(fā)送數(shù)據(jù)的長度,最后啟動發(fā)送(Sn_CR_SEND)。相關(guān)程序如下:
i=tx_offset/S_TX_SIZE? //計算實際物理偏移值,
//S_TX_SIZE由TMSR定義為2 K
tx_offset=tx_offset-i*S_TX_SIZE? //計算實際物理地址
//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ā)送的指令
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/pulan/archive/2013/03/15/2960776.html
總結(jié)
以上是生活随笔為你收集整理的w5100 网上资料整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows phone 中反序列化j
- 下一篇: 使用VirtualBox SDK之初步编