3.1資料通訊的建立
tcp是面向連線的通訊方式,它首先必須建立連線.然後才能利用ip位址和埠號進行資料通訊。tcp有兩種建立連線的方式,一是通過伺服器模式(被動開啟)等待連線請求;二是通過客戶模式(主動開啟)傳送連線請求給伺服器。本例採用tcp客戶模式。在建立tcp連線之前,一般都需要初始化埠,包括設定埠號、設定w5100為tcp模式和寫入open命令。埠初始化主要配置埠0的相關暫存器,包括:s0_port、s0_mr和s0_cr。
圖5是w5100在tcp客戶模式的處理流程。
3.2中斷處理
在處理w5100的中斷時,首先應訪問w5100的中斷暫存器(ir),可用mcu通過訪問ir獲得產生中斷的**。任何中斷源都可以被中斷暫存器(imr)的相應位所遮蔽,因此,若要使用某個中斷源,先要置位該中斷源在imr中的相應位,這樣,當ir中對應位置位時,才會產生中斷。此後當中斷產生時,即進入中斷處理程式。對於每個中斷事件,處理方式可由使用者自己定義。
假如使用的是埠0中斷。可在w5100的初始化程式中先將imr中的im_ir 0(埠0中斷遮蔽位)置位。這樣,當埠0中斷發生時(im_ir0=i,s0_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_w5100和write_w5100完成位元組的讀取和傳送,這裡需要定義讀操作碼(oxf0)和寫操作碼(ox0f),實現微處理器與w5100資料通訊。
4.2 socket初始化程式設計
w5100與終端之間的資料交換有多種通訊方式,本文採用基於tcp模式的通訊方式。tcp是以連線為基礎的通訊方式,埠n在進行資料通訊時,必須先建立連線。tcp有兩種建立連線方式,一種是伺服器模式(被動模式),需要等待連線請求;另一種是客戶端模式(主動開啟),需要傳送連線請求給伺服器。本設計配置w5100為伺服器模式,只需對w5100的socket進行配置就可以完成網路資料的收發和啟動功能。
當socket作為伺服器模式時,初始化埠需要設定執行模式(sn_mr)和本機埠號(sn_port),並在埠命令暫存器開啟(open)埠。引用socket_listen(socket
s)程式,只呼叫一次該程式就可使w5100設定為伺服器模式。主要程式如下所示。
write_w5100((w5100_s0_mr+s*0x100),s_mr_tcp);
//設定socket為tcp模式
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和目的埠號。
w5100在tcp伺服器模式下的處理流程如圖4所示。
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=1、ir_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。主要程式如下:
其中oxaa和ox55為接收資料報的標誌頭;長度位為資料報位元組長度,不包括資料報頭和本身字元,命令位為對物件資料的操作,為0時讀取資料,為1時設定物件資料,目標**位用來顯示物件**,如ox00為閘道器ip、ox01為子網掩碼、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_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])
//將傳送緩衝區中的
//資料寫入到埠的傳送緩衝區
write_w5100((w5100_s0_cr+s*0x100),s_cr_send)
//啟動傳送的指令
W5100故障除錯
此帖來自ednchina 故障現象 w5100在上電後不對其進行任何操作的情況下 linkled燈不停閃爍。其正常現象應是上電後燈熄滅。晶元不工作。灌進經正常除錯過的程式後ping晶元連續丟包。撥通了晶元 商的 求助。在與他進行交流後他給我提了乙個建議將電源上的2個電感拿掉直接短路試試。抱著試一試的...
乙太網控制晶元W5300與W5100差異對比
w5100是wiznet研發的一款全硬體tcp ip協議,內嵌全套硬體網路協議,支援4個socket口同時工作,網路接入效能穩定優異,經住了市場考驗,能面向工業應用。由於w5300是基於w5100的tcp ip核心,因此它繼承了w5100的基本功能。w5100與w5300最主要的區別是資料匯流排。w...
如何提高W5100的通訊速度
在很多應用領域都需要提高w5100與其它網路裝置 如pc機 的通訊速度。理論上講,w5100的最大通訊速度可以達到25mbps,實際應用中,由於網路的原因 cpu與w5100之間通訊速度的原因等等,使w5100的網路傳輸速度遠遠低於25mbps。這裡拋開網路速度的影響,談談如何提高w5100的網路通...