w5100 資料整理

 3.1數據通信的建立

  TCP是面向連接的通信方式,它首先必須建立連接.然後才能利用IP地址和端口號進行數據通信。TCP有兩種建立連接的方式,一是通過服務器模式(被動打開)等待連接請求;二是通過客戶模式(主動打開)發送連接請求給服務器。本例採用TCP客戶模式。在建立TCP連接之前,一般都需要初始化端口,包括設置端口號、設置W5100TCP模式和寫入OPEN命令。端口初始化主要配置端口0的相關寄存器,包括:S0_PORTS0_MRS0_CR

 

  圖5W5100TCP客戶模式的處理流程。


 

  3.2中斷處理

  在處理W5100的中斷時,首先應訪問W5100的中斷寄存器(IR),可用MCU通過訪問IR獲得產生中斷的來源。任何中斷源都可以被中斷寄存器(IMR)的相應位所屏蔽,因此,若要使用某個中斷源,先要置位該中斷源在IMR中的相應位,這樣,當IR中對應位置位時,纔會產生中斷。此後當中斷產生時,即進入中斷處理程序。對於每個中斷事件,處理方式可由用戶自己定義。

 

  假如使用的是端口0中斷。可在W5100的初始化程序中先將IMR中的IM_IR 0(端口0中斷屏蔽位)置位。這樣,當端口0中斷髮生時(IM_IR0=IS0_INT=1),系統將開始讀端口0中斷寄存器(S0_IR),在W5100的端口寄存器中,主要設置有建立連接(CON)、終止連接(DIS

 

  CON)、數據發送完成(SEND_OK)、接收數據(RECV)和超時(TIMEOUT)等中斷事件。

 

  3.3  數據接收

  當端口產生接收中斷時,可調用接收函數S_rx_process(SOCKET s)將端口接收到的數據緩存到Rx_buffer數組中,並返回接收的數據字節數。當讀完所有的數據後,可將接收存儲器讀指針寄存器(S0_RX_RD)的值加上讀取的數據長度,然後再寫入S0_RX_RD,最後向端口0的命令寄存器(S0_CR)寫入RECV命令,以等待下次接收數據。但要注意在計算實際物理偏移量rx_offset時,S_RX_SIZE必須保證和在初始化代碼中定義的接收緩存區的大小一致。

 

  3.4  數據發送

  通過Socket發送數據時,首先把要發送的數據緩存在Tx_buffer中。此外,在發送數據時,還需先檢查發送緩存區的剩餘空間的大小,然後控制發送數據的字節數。端口發送緩存區的大小由發送存儲器空間寄存器(TMSR)確定。在數據發送處理過程中,剩餘空間的大小將因寫入數據而減少,發送完成後又自動增加。把Tx_buffer的數據完全寫入端口的發送數據緩存區後,可將端口傳輸寫指針寄存器(Sn_TX_WR)中的值加上寫入的數據長度,再寫入Sn_Tx_WR,以指示發送數據的長度,最後在命令寄存器(Sn_CR)中寫入SEND命令,以啓動發送。

 

 

4 通信接口的軟件設計
4.1
初始化程序設計
 本系統初始化通過定義結構體的方式完成STM32F105V微處理器和W5100的初始化[4-5]
微處理器完成系統時鐘、外設時鐘、系統啓動模式、嵌入式向量式中斷控制寄存器、I2C、通用輸入輸出接口、通用異步接收發送器、通用定時器以及SPI等的初始化。
 W5100的初始化主要設置一些關鍵的寄存器:
 (1)設置模式寄存器(MR)bit[7](軟件復位位)1,初始化芯片內部寄存器,復位後自動清0
 (2)設置中斷屏蔽寄存器(IMR)OxFF(屏蔽中斷源),啓動IP地址衝突異常中斷和端口n寄存器(Sn_INT)中斷等,通過向相應的中斷屏蔽位寫1,任何時候只要中斷寄存器(IR)對應的位也置1,則中斷將產生,CPU通過訪問IR獲得中斷來源。
 (3)設置重發時間寄存器(RTR)200 ms(Ox07D0),當發出連接、斷開等命令而沒有收到遠程對端的響應或響應延遲時,產生重發過程。
 (4)配置重發計數寄存器(RCR)8,設定重發的次數。
 (5)設置接收緩衝區的大小寄存器(RMSR)和發送存儲空間大小寄存器(TMSR)都爲0x55,每個端口接口和發送存儲空間分別分配2 KB的存儲空間。
 (6)設置端口n模式寄存器(Sn_MR)OxA1,啓動廣播功能,設置端口n協議類型爲TCP模式。
 (7)設置端口n命令寄存器(Sn_CR),端口的初始化、建立/斷開連接以及數據傳輸等。
 (8)設置端口n的最大分片長度寄存器(Sn_MSS)1 460
 初始化完成後,根據SPI協議編寫發送字節函數SPI_SendByte(),配合Read_W5100Write_W5100完成字節的讀取和發送,這裏需要定義讀操作碼(OxF0)和寫操作碼(Ox0F),實現微處理器與W5100數據通信。
4.2 Socket
初始化程序設計
 W5100與終端之間的數據交換有多種通信方式,本文采用基於TCP模式的通信方式。TCP是以連接爲基礎的通信方式,端口n在進行數據通信時,必須先建立連接。TCP有兩種建立連接方式,一種是服務器模式(被動模式),需要等待連接請求;另一種是客戶端模式(主動打開),需要發送連接請求給服務器。本設計配置W5100爲服務器模式,只需對W5100Socket進行配置就可以完成網絡數據的收發和啓動功能。
 當Socket作爲服務器模式時,初始化端口需要設置運行模式(Sn_MR)和本機端口號(Sn_Port),並在端口命令寄存器打開(OPEN)端口。引用Socket_Listen(SOCKET s)程序,只調用一次該程序就可使W5100設置爲服務器模式。主要程序如下所示。
 Write_W5100((W5100_S0_MR+s*0x100)S_MR_TCP)
 //設置SocketTCP模式
 Write_W5100((W5100_S0_CR+s*0x100)S_CR_OPEN)
 //打開Socket
 Write_W5100((W5100_S0_CR+s*0x100)S_CR_LISTEN)
 //設置Socket爲偵聽模式
 Write_W5100((W5100_S0_CR+s*0x100)S_CR_CLOSE)
    //
關閉Socket
 完成Socket的打開和設置偵聽工作後,至於遠程客戶端是否與其連接,則需要等待Socket中斷,在服務器偵聽模式下,不需要設置目的IP和目的端口號。

 

4.3 中斷處理程序設計
 本設計採用中斷方式來處理數據包的接收和發送,以提高效率。在W5100處理中斷的過程中,微處理器首先通過應訪問W5100的中斷寄存器(IR)獲得產生中斷的來源。中斷寄存器與中斷屏蔽寄存器配合使用,且位是一一對應的,中斷屏蔽寄存器(IMR)的相應位可屏蔽中斷寄存器中任何中斷源。因此,若要使用某個中斷源,先要將該中斷源在中斷屏蔽寄存器中的相應位置位,以打開所需的中斷源,這樣,中斷纔會產生。當中斷產生後,即進入中斷處理程序。本設計中的中斷源主要包括端口n中斷事件。一般設置有Socket成功連接(S_IR_CON)、斷開連接(S_IR_DISCON)、數據發送完成(S_IR_SENDOK)、接收到數據(S_IR_RECV)或傳輸超時(S_IR_TIMEOUT)等事件中斷。
 本文以端口0接收到數據包後的產生一個接收數據中斷爲例說明中斷處理過程。首先,在使用端口0中斷之前,應在初始化程序中將中斷屏蔽寄存器(IMR)中的端口0置位(IMR_S0_INT),當Socket0發生中斷時,IMR_S0_INT=1IR_S0_INT=1、動態LED燈亮顯示接收狀態,此時,W5100的中斷輸出管腳(/INT)輸出低電平,以通知微處理器有中斷產生,微處理器訪問中斷寄存器獲取中斷源爲接收數據中斷;然後進入中斷處理函數,啓動發送函數(S_rx_process)
4.4 Socket
數據接收程序設計
 當端口接收數據時,產生接收中斷。首先調用端口接收數據包函數Process_Socket_Data(),並對接收到的數據類型進行判斷和加工。本過程先調用接收函數S_rx_process()W5100端口的接收數據緩存區讀取數據,然後將讀取的數據加上接收存儲器讀指針寄存器(S0_RX_RD)的值再寫入S0_RX_RD,最後將RECV命令重新寫入端口0的命令寄存器(S0_CR),以等待下次數據的接收。或者將處理完的數據拷貝到發送緩衝區,再調用S_tx_process函數發送數據包給CPU


 其中OxaaOx55爲接收數據包的標誌頭;長度位爲數據包字節長度,不包括數據包頭和本身字符,命令位爲對對象數據的操作,爲0時讀取數據,爲1時設置對象數據,目標代碼位用來顯示對象代碼,如Ox00爲網關IPOx01爲子網掩碼、0x02爲物理地址、LED爲狀態顯示等;數據位爲接收到的數據,數據是以16進制形式接收,最後再加上2 B的數據報頭和1 B的數據本身。
4.5 Socket
數據發送程序設計
 通過Socket發送數據時,調用發送數據函數S_tx_process。首先把要發送的數據緩存在發送緩衝區(Tx_buffer)中。此外,在發送數據時,需先檢查發送緩存區的剩餘空間的大小(Sn_TX_FSR),控制發送數據的字節數,如用以太網協議發送的數據最大傳送單元(MTU)不超過1 500 B。在TCP服務器模式下,在數據發送處理過程中,可不設置目標主機的IP和端口號。剩餘空間的大小因寫入數據的增加而減少,數據發送後又自動增加。當發送緩衝區的數據完全寫入端口的發送數據緩存區後,則將數據本身長度加上端口傳輸寫指針寄存器(Sn_TX_WR)中的值再寫入Sn_Tx_WR,再計算髮送緩衝區的偏移量(tx_offset),用於指示發送數據的長度,最後啓動發送(Sn_CR_SEND)。相關程序如下:
 i=tx_offset/S_TX_SIZE  //計算實際物理偏移值,
 //S_TX_SIZETMSR定義爲2 K
 tx_offset=tx_offset-i*S_TX_SIZE  //計算實際物理地址
 //j= W5100_TX+s*S_TX_SIZE+tx_offset
   Write_W5100(jTx_Buffer[i])     //將發送緩衝區中的
 //數據寫入到端口的發送緩衝區
 Write_W5100((W5100_S0_CR+s*0x100)S_CR_SEND)
 //啓動發送的指令
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章