W5500問題集錦(二)

W5500

W5500自去年9月推出,已經有一年的時間。一年間,不乏很多客戶紛紛將目光投向了W5500這顆性價比很高的全新硬件TCP/IP以太網芯片,無論是在工控、安防、交通,還是在智能醫療、智能家居等眾多領域中,得到了廣泛應用及認可。同時,也收到了很多客戶在使用過程中的問題反饋,比如W5500中斷問題、切換端口問題,及W5500做服務器,多端口連接等常見問題。這些,我們都一一幫助大家分析,一同解決!那麼,為了提高技術支持效率,也特此將這些問題再次整理給大家,以供分享!期待能有所幫助!

1.

W5500作為服務器時,如何獲取來自連接方的IP地址及端口

問題描述:w5500作為服務器時,如何獲取來自連接方的IP地址及端口?我怎麼沒有找到寄存器呢

讀DIPR 和SIPR都不對,

是不是沒有查詢方法呀?

UDP和TCP模式我都試過了,整了一天也沒找出明堂來,如果實在不行,只能依靠,誰來連接W5500,誰就在DATA區自報家門了,但這樣做感覺有點不是很爽,按說是可以獲取到來自連接方的IP地址及端口的

比如W5500接在網絡上,要對它進行搜索和設置,那麼就要UDP廣播包,目前可以收到廣播包,但量回應的包,去對方收不到,只能懷疑是目標地址和端口沒有更新在dipr寄存器了,請支招兒,謝謝!!

答1:TCP Server模式下,在連接建立後,由硬件更新目標IP和端口值。

答2:收到信息的前面6個字節即為對方IP地址和端口號。

答3:TCP Server 模式下,可以讀取Sn_DIPR和Sn_DPORT來確定連接方的IP及端口。這個是可以,你可以打印這個地址里的信息來查看。

W5500 As TCP Server

W5500 As TCP Server

原帖來自:9MCU

 

2.

W5500一個獨立端口作為Server模式可以支持多少個客戶端連接

問題描述1:W5500一個獨立端口端口作為TCP Server模式打開一個端口,此端口已經映射到外網,現在可能有多個客戶端連接過來,可以支持多少個客戶端連接?經測試,只能支持一個連接,連接上一個客戶端後,後連的客戶端根本連接不上;而採用ENC28J60採用uip協議時,利用TCP方式監聽端口,是可以支持客戶端多連接的。不知w5500內部的硬件協議棧能否支持作為server,多個客戶端連接過來?

答1:可以這樣用,但是要把5500的Socket都設置成TCP Server,然後端口都一致。這樣就可以有8個客戶連接進來了。

問題描述2:就是說,每個獨立端口實際上對應的是一個連接,最多只能有8個連接,對吧?

答2:是的

答3:按照你初始化第一個Socket 0為TCP Server的方式,將其他Socket 1~7 配置成參數一致的TCP Server即可

原帖來自:9MCU

3.

W5500無法清中斷

問題描述:這幾天一直在調試W5500,MCU用的是STM32F205,

可以正常的收發,非中斷方式。

現在改用中斷模式,無法清除中斷。

用戶手冊上寫,Sn_IR,清除需對應位寫1。但此寄存器為只讀寄存器,每次對此寄存器進行寫操作都會導致看門狗複位。

有沒有人遇到類似情況,求教

註:UDP方式

答:問題已解決,是迴環測試後又產生了SEND_OK中斷,最終因超時引起看門狗複位。

屏蔽發送中斷後一切正常。

原帖來自:9MCU

4.

問一下:無論是通用寄存器中斷IR還是socket中斷寄存器SN_IR中斷的清除都是我們使用MCU對該寄存器進行手動寫0XFF么?謝謝哦。期待回信。。。

問題描述:W5500的中斷是不是可以理解成二級中斷?首先判斷是不是通用寄存器IR的中斷,如果不是然後判斷中斷是不是來自SN_IR。如果來自SN那麼進行檢測SN的中斷觸發。。檢測到中斷之後,需要手動的向產生中斷的IR寄存器寫入0XFF進行中斷的清除?

請問是這種思路么?

答1:請看看 W5500中斷寄存器的理解

http://www.9mcu.com/9mcubbs/foru … ead&tid=1062343

答2:首先,可以類似的說成是二級中斷,通用寄存器的中斷和Socket中斷的細分不同。

其次,清中斷就是往對應位上寫1。

原帖來自:9MCU

5.

W5500中斷寄存器的理解

W5500中斷寄存器的理解

W5500中文手冊V1.0 寫的不夠清楚,該文是本人結合中英文手冊及自己理解,整理出有關中斷部分的理解,如有不正確的請指正。

一:引腳 INTn 為中斷輸出(Interrupt output)

低電平:W5500的中斷生效;

高電平:無中斷或者處於中斷生效等待中

二:中斷相關寄存器

2.1  IR (連接中斷寄存器) [R/W] [0x0015] [0x00]

該寄存器主要指示網絡連接錯誤或喚醒引起當的中斷。

某位為1 且 該位中斷沒有被屏蔽就可以引發中斷,INTn引腳將會被拉低,中斷處理完畢後,可以由主機寫為‘1’清除該位中斷. IR 為‘0×00’時,INTn引腳將會被拉高。

2.2  IMR (連接中斷屏蔽寄存器) [R/W][0x0016][0x00]

中斷屏蔽寄存器(IMR)是用來屏蔽中IR中斷的,某位寫‘1’,則開啟中斷;寫‘0’,關閉中斷。

每個中斷屏蔽位對應中斷寄存器(IR)中的一個位. 如果IMR某位寫0,即使IR中對應位為1了,也不會引發中斷,INTn引腳不會被拉低。

2.3 SIR ( Socket 中斷寄存器) [R/W] [0x0017] [0x00]

SIR就是指示哪個Socket發生的中斷的。

如果某個Socket發生的中斷,該寄存器的對應位將被置為1 ,直到被主機置‘1’清除。如果Sn_IR不等於‘0×00’, 就會引發中斷,INTn引腳將被拉低。

2.4  SIMR (Socket 中斷屏蔽寄存器) [R/W] [0x0018] [0x00]

SIMR寄存器來屏蔽中SIR中斷的,某位寫‘1’,則開啟中斷;寫‘0’,關閉中斷。

每個中斷屏蔽位對應中斷寄存器(SIR)中的一個位. 如果SIMR某位寫0,即使IR中對應位為‘1’了,也不會引發中斷,INTn引腳不會被拉低。

2.5 Sn_IR (Socket n 中斷寄存器) [R] [0x0002] [0x00]

Sn_IR 寄存器用於提供給Socket n 中斷類型信息,如建立(Establishment)、終止(Termination)、接收數據(Receiving data)和超時(Timeout)。當觸發一個中斷即Sn_IMR的對應位是’1′的時候,Sn_IR的對應位也將會變成‘1’。

如果想把Sn_IR位清零的話,主機應該將該位置‘1’

這裡的[R],而不是[R/W] 表示不能由主機寫‘1’讓W5500產生中斷,只能由主機設置‘1’ ,清除某一位中斷。

2.6 Sn_IMR (Socket n 中斷屏蔽寄存器) [R/W] [0x002C] [0xFF]

Sn_IMR 負責屏蔽Socket n的中斷。某位寫‘1’,則開啟中斷;寫‘0’,屏閉中斷。

每一位都對應了Sn_IR寄存器的相應位。Socket n的中斷觸發並且Sn_IMR的對應位為‘1’時,Sn_IR的對應位變為‘1’。如果Sn_IMR和Sn_IR的對應位均為‘1’且SIR 寄存器的相應為‘1’,INTn 引腳便會拉低並使主機產生中斷。

2.7  INTLEVEL (低電平中斷定時器寄存器) [R/W] [0x0013 – 0x0014] [0x0000]

該寄存器用於設置中斷生效等待的時間(IAWT)。當下一個中斷觸發,中斷引腳將會在INTLEVEL時間後,拉低中斷引腳(INTn)。

A.  當Socket 0的超時中斷被觸發,S0_IR[3] & SIR[0]設置為‘1’,然後 INTn 引腳才被拉低。

B.  當Socket 1的連接中斷在前一個中斷未處理完成之前被觸發,則INTn 引腳仍然為低,S1_IR[0] & SIR[1]位設置為‘1’。

C.  如果主機是通過完全清理S0_IR[3]位來完成中斷清除,則INTn引腳被拉高,但是此時S1_IR[0] & SIR[1]仍然保持為‘1’。

D.  即使S1_IR[0] &  SIR[1]位被設置為‘1’,但是在 INTLEVEL 期間,INTn不能被拉低。只有過了INTLEVEL時間,INTn才能被拉低。

三:中斷方式設計程序

通過以上介紹,可知幾個寄存器之間有如下關係:

A:3個中斷寄存器 IR,SIR ,Sn_IR,它們對應的3個中斷屏蔽寄存器IMR,SIMR,Sn_IMR(也可以認為是中斷使能寄存器)。只有使能對應位中斷,該位為‘1’時才能引發中斷,拉低INTn。

B:一次中斷處理結束,清除對應狀態位後,都會拉高INTn,如果還有別的中斷狀態寄存器為‘1’,就等待一定時間再拉低INTn。這個時間是由INTLEVEL寄存器來設定的。對於主機來說來一次中斷,只能處理一個事件。

C :IR寄存器與網絡連接狀態有關的寄存器,跟SIR,Sn_IR 沒有關係。而SIR 和Sn_IR 是同時出現的,SIR 指出是Socket n發生了中斷事件,Sn_IR指出了Socket n 發生了什麼中斷事件,如收到數據 超時等。

因此如果主機採用中斷方式,檢測到INTn才能被拉低了,進入中斷服務函數可以採用先判斷是不是IR中斷,不是就讀取SIR狀態,找到觸發中斷的那個Socket n。然後讀取 對應的Sn_IR 進行處理。每次處理完,就對相應寄存器的相應位清除。

原帖來自:9MCU

6.

W5500上傳數據錯誤

問題描述1:我現在使用CC2530單片機和MCU通過SPI接口和W5500連接,使用W5500庫函數,下載進去程序之後,在電腦中可以ping 通W5500設備,在電腦中打開TCP工具,程序中設置MCU自動上傳數據和接收到什麼數據就返回什麼數據,但是這兩個數據都出現錯誤,不能接收到正常的數據,這個數據通過串口發送出來,都是正常的數據,在TCP工具中偶爾可以見到幾包正確的數據,但是大多數時候都是錯誤數據包,搞不清楚哪裡設置錯誤,請大神指點一下。

答1:你好,你可以用Wireshark抓包看看有無丟包。

如果沒有丟包的話,就是說裸數據階段就出現問題了。

看一下你SPI的速率,試着提升一下SPI速率試一下。有可能你SPI處理數據太慢了導致的。

問題描述2:我單步執行的時候,數據還是錯誤的,但是沒有出現丟包的現象,在內部數據還是正確的,但是執行到W5500發送出來的時候,就是錯誤的。

//SCK時鐘4MHZ,時鐘頻率/8

U1BAUD = 0×00; // BAUD_M = 0

U1GCR |= 0×11; // BAUD_E = 17

SPI的速率我這是設置的4M,我也嘗試着提高了速率,但是沒什麼效果,減少速率也是不行,大多數數據都是錯誤的,中間偶爾會出現幾包正確數據。

答2:問題已經解決,是庫函數沒設置好,send_data_processing()和recv_data_processing()中,ptr一開始是16位,因為移位使數據溢出,可以設置成32位,或者在移位的時候,進行強制類型轉換的時候,多使用括號,不要因為優先級不同,不能安裝自己想要實現的功能來運行。

原帖來自:9MCU

7.

W5500作為客戶端直接連接電腦和交換機失敗。通過路由器可以

問題描述:/*********************************************

* 函數名  : Detect_Gateway

* 描述    : 檢查網關服務器

* 輸入    : 無

* 輸出    : 無

* 返回值  : 成功返回TRUE(0xFF),失敗返回FALSE(0×00)

* 說明    : 無

******************************************************/

unsigned char Detect_Gateway(void)

{

unsigned char ip_adde[4];

ip_adde[0]=IP_Addr[0]+1;

ip_adde[1]=IP_Addr[1]+1;

ip_adde[2]=IP_Addr[2]+1;

ip_adde[3]=IP_Addr[3]+1;

 

//檢查網關及獲取網關的物理地址

Write_W5500_SOCK_4Byte(0,Sn_DIPR,ip_adde);//向目的地址寄存器寫入與本機IP不同的IP值

Write_W5500_SOCK_1Byte(0,Sn_MR,MR_TCP);//設置socket為TCP模式

Write_W5500_SOCK_1Byte(0,Sn_CR,OPEN);//打開Socket

os_dly_wait (100);//Delay(5);//延時5ms

if(Read_W5500_SOCK_1Byte(0,Sn_SR) != SOCK_INIT)//如果socket打開失敗

{

Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//打開不成功,關閉Socket

return FALSE;//返回FALSE(0×00)

}

 

Write_W5500_SOCK_1Byte(0,Sn_CR,CONNECT);//設置Socket為Connect模式

 

do

{

u8 j=0;

j=Read_W5500_SOCK_1Byte(0,Sn_IR);//讀取Socket0中斷標誌寄存器

if(j!=0)

Write_W5500_SOCK_1Byte(0,Sn_IR,j);

os_dly_wait (10);//Delay(5);//延時5ms

if((j&IR_TIMEOUT) == IR_TIMEOUT)

{

return FALSE;

}

else if(Read_W5500_SOCK_1Byte(0,Sn_DHAR) != 0xff)

{

Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//關閉Socket

return TRUE;

}

}while(1);

}

直接連接電腦的時候死在了這個函數里。Read_W5500_SOCK_1Byte(0,Sn_DHAR) 的返回值一直是ff

答1:無法獲取目標MAC地址。應該是W5500發出ARP請求,沒有收到對應的回復。

你的交換機各個口之間是透明的嗎?如果是的話,用PC連在一個port上,用Wireshark抓包看一下。你也可以把抓包附上來看一下。

答2:問題找到了。用交叉網線就可以了

原帖來自:9MCU

8.

W5500工業方面有使用的嗎

問題描述:w5500抗干擾能力怎麼樣

答:你好,

W5500的抗干擾還是很好的,工業客戶還是蠻多的。其實,光說的話也沒有太大意義,你可以測試評估一下。

你可以給我一個郵箱,我發測試報告給你。

WIZnet的芯片都是工業級芯片。

原帖來自:9MCU

9.

W5500端口切換問題!

問題描述1:我是用的是自帶協議棧的W5500+STM32F103!

我想要實現的功能:向多個客戶端節點同時發出命令,然後每個節點接收到命令後要開始數據的上傳以及一些其他的節點操作;這樣的需求,按照常理,應該是服務器發布命令使用廣播,也就是UDP,為保證數據可靠性,數傳就使用TCP!這中間就存在了一個協議的切換問題,那我是不是可以在端口1使用UDP,在端口2使用TCP?!想問一下各位,W5500能夠輕鬆的實現切換嗎?!還有,UDP和TCP在切換中有什麼需要注意的?!

補充一點,現在我使用的是在TCP中加了一個for();循環,來給各個節點發布命令,相當於模擬了一個UDP廣播,但是這樣就浪費了大量的時間,請問有什麼好的改進方法!?

答1:w5500有8個socket,可以一個socket做UDP廣播,一個socket做TCP Server。這樣你可以使用socket_udp發送命令後,客戶端節點收到命令後,將數據發到TCP Server。當然需要處理的是TCPServer接收緩衝區的數據。 不知道這樣的方案您能接收不。   當然同理客戶端也是兩個socket,只不過除了udp,多了一個TCPClient。

另,你可以初始化2個socket,例: Socket 0 是UDP, Socket 1~7是TCP Server(參數配置成一樣的,意味着同時有7個客戶端可以連入)。使用Socket 0發布命令,使用Socket 1~7接收數傳。

問題描述2:再追加一個問題,您知道怎麼做可以提高UDP廣播的命令的可靠性!?

答2:首先udp就是面向不可靠連接,如果想做到可靠又想使用廣播,那麼你可以在udp的程序里自己加上一次握手。例如server發送udp(地址255.255.255.255)廣播後,每個接收到廣播的設備回復一個ack,server在得到ack後則認為數據送達。這裡有個問題就是server知道各個客戶端的ip地址,這樣收到的ack才有指向性。  但是這樣好麻煩啊。   還有就是你可以一段時間T內多次廣播命令,降低丟包概率。

問題描述3:請問W5500+STM32103 多個socket同時發送數據時候出現丟包應該怎麼處理啊

答3:這個主要看一下你SPI的讀取速率,是不是太慢造成buff溢出導致的。你可以提高SPI速率,或者使用小包多發的形式,將大數據包拆分成小包來發送。

 

原帖來自:9MCU

10.

W5500工作一段時間燈全亮

問題描述1:W5500工作一段時間(大概幾分鐘),有時會出現雙燈全亮的現象,此時,拔下網線,燈依舊亮。重啟斷電後上電,依然燈全亮。需要過很長時間才能恢復。

燈全亮階段,網口顯示斷開狀態。各DX有遇到過此類問題的嗎?如有,是什麼原因,該如何解決啊,謝謝!

答1:會不會是有個別的控制引腳懸空了?比較容易受到干擾。

比如reset之類的,狀態進入隨機,失去控制

問題描述2:ARM和W5500的控制線確實走線較遠,這樣是不是應該在RESET等信號端加上拉或下拉電阻啊?

答2:但就RESET而言,是應該加一個上拉,給芯片一個上電默認狀態!

問題描述3:恩恩,非常感謝!!

原帖來自:9MCU

11.

求助:W5500連續接收數據出錯。。。。。

問題描述:做的測試是W5500做TCP服務端 然後PC做客戶端,PC間隔50ms給 W5500 發 幾個字節如1234, W5500接收後,把接收的數據發到PC端 。經過大量測試,把問題鎖定在  W5500接收數據,當接收一定量時,就會出現這種情況:如 PC發送的是1234,這時候它只能接收 1  後面幾個字節都接收不到  (觀察SPI寄存器),但是過一段時間又可以正常接收有時候還有出現,一個字節都不能接收,但都是過一會又正常,而且出現的頻率比較規律。。。。。 各位有遇到過嗎   求助。。。。。。

答1:有沒有參考WIZnet 的TCP Server例程?建議你用Wireshark抓包看一下

答2:你這個是TCP Server Loopback。 W5500有這個例程,你可以參考一下(https://github.com)。感覺是你的函數地址定義問題。

原帖來自:9MCU

12.

發送NBNS響應包無效

問題描述1:W5500收到NBNS  Quer包後發了NBNS的響應包(自己構造的)出去,抓包工具也能抓到,看內容也沒有錯誤,但是詢問端好像對響應包沒反應,就和沒有響應包一樣,但實際上已經收到響應包了,不知問題出在哪裡,另附上抓包文件(抓包工具為:Wireshark Version 1.12.1)謝謝大家。

答1:ARP的那部分,做個斷點試試,是沒收到,還是數據沒對上?

問題描述2:管理員,您好,關於ARP的部分,W5500(192.168.1.5)收到 PC(192.168.1.8)的MAC而且能將其自身的MAC發給PC,這個是由W5500自身硬件完成的,這部分程序中未有涉及,程序中編寫部分是接收137端口消息並做出響應,那個響應包是程序構造的,不知道是不是這部分出了問題,我對了很久也沒對出哪裡有問題。

答2:建議通過斷點調試,在進入處理的位置開始就步步觀察

問題描述3:關於斷點調試我不太清楚要調試那個部分,從抓包文件上看不出程序執行本身有什麼錯誤

問題描述4:我已找到問題,是TRANSACTION ID不匹配導致的,謝謝。

原帖來自:9MCU

13.

W5500 正常工作幾天時間後,連不上,ping時候斷斷續續

問題描述:W5500有的 用幾天後 連接不上 ping時候 斷斷續續的,大俠們怎麼破。

答:建議將W5500的板子與電腦直連,配置到一個網段內,然後‘ping ip –t’不停的ping下。偶爾的ping不通可以理解,但是如果經常ping 不通就要檢查你的物理鏈路狀態了。有可能導致的問題:1.RJ-45部分網線沒有插好或者口松;2. 布板的時候信號線平行走線產生寄生電容電感。

原帖來自:9MCU

14.

如何在W5500中實現HTTPS(http+ssl)客戶端?

問題描述:

如何在W5500中實現HTTPS客戶端?跟HTTP客戶端實現的關鍵的區別?

HTTP/1.1 400 Bad Request

Server: nginx/1.2.0

Date: Thu, 24 Apr 2014 12:06:46 GMT

Content-Type: text/html

Content-Length: 270

Connection: close

<html>

<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>

<body bgcolor=”white”>

<center><h1>400 Bad Request</h1></center>

<center>The plain HTTP request was sent to HTTPS port</center>

<hr><center>nginx/1.2.0</center>

</body>

</html>

答:這個需要你熟悉應用層的SSL協議,然後調用傳輸層及網絡層的W5500協議。這個可能後續有示例代碼開放出來,但是在這之前只能各位朋友自己多摸索一下了。

原帖來自:9MCU

15.

W5500與FPGA連接

問題描述:有沒有人會W5500與FPGA連接啊

答:有但是比較少,用FPGA一般總線資源足夠而且線程夠快,所以一般使用BUS接口。W5500是SPI接口。按照經驗來看,發部分FPGA的用戶會用W5300。因為Buff夠大,實際帶寬高。雖然,W5300比W5500要貴,但是用FPGA的用戶追求的還是簡單高效一般是不會在乎這幾塊錢的。

原帖來自:9MCU

16.

請問W5500支持DNS域名解析嗎?我看了看datasheet,貌似沒有這方面的描述

答:DNS是應用層協議,W5500實現的是應用層以下的傳輸層及網絡層協議。不過,W5500有DNS的示例代碼(http://pan.baidu.com/s/1F7SzO)。你可以參考。

17.

 W5500斷開無法重聯

問題描述:CC2530單片機和W5500連接好可以正常通訊,斷開網線或者關閉TCP工具,過一段時間再打開,TCP工具無法正常打開進行通訊,W5500的狀態一直顯示為連接狀態,不能實現斷開重聯。添加心跳檢測包,也沒有任何作用,IINCHIP_WRITE(Sn_KPALVTR(s),0×02);    這個是添加的心跳包檢測語句。還需要其他地方進行設置嗎

答:1.IINCHIP_WRITE(Sn_KPALVTR(s),0×02)注意你KPALVTR寄存器的地址是否正確添加了。具體可以參考W5500 Keepalive的示例代碼https://github.com

2.添加心跳包可以實現斷線後,N個周期(基於RTR和RCT)後,若仍沒有收到對方的ACK信號,則會觸發超時中斷,並同時將Socket狀態變為Closed。程序里只要加上監聽Socket狀態變為Closed之後就重新開發Socket監聽/連接即可實現斷線重連。

原帖來自:9MCU

18.

W5500自動協商PMODE工作模式,AVR64跑TCP透傳可以吧?

問題描述:打算用W5500做物聯網比賽。所以過來問個問題咯。請知道的人指導下,歇歇咯。

N01:我將PMODE0  PMODE1  PMODE2接10k上拉電阻。根據手冊配置成所有功能自動協商。是不是W5500就可以自動協商PMODE的所有工作模式了呢?歇歇咯。

NO2:我使用AVR64跑TCP透傳應該可以吧??我通過百度資料看到arduino硬件使用的ATMEGA芯片有跑20M帶W5500。W5100有用51跑簡單的網絡連接。我用AVR64 8M跑應該沒問題的吧?

答:1.是的,PMODE全為1時為自動協商

2.可以的,沒有問題。WIZnet的S2E透傳模塊都是8051+W5XXX或者W7100A(內置8051)

原帖來自:9MCU

 

19.

W5500如何設置連接到外網服務器,不知如何實現?

答:只要你的PC可以訪問外網服務器,W5500就可以訪問外網服務器。如果你的外網服務器是在一個內網裡面的,沒有透明出來,需要設置路由使用端口映射,將其透明出來,即可訪問。

 

20.

W5500做server,通訊一段時間Client會斷開

問題描述:我用w5500作為server,用Client去連接,在通訊一段時間後會出現Client突然斷開,繼續進行連接一直連接不上,調試server端程序的時候發現出現這個情況的時候,SR寄存器讀出來的值是0×17,即還是處於SOCK_ESTABLISHED狀態,現在出現這個情況的頻率比較高,大概運行十多分鐘就會出現,求教?

 

答:這個是由於Client斷開沒有經過四次握手,非法斷開連接,導致Socket被佔用,無法恢復通信。

可以讓客戶加入斷線重連機制,有以下方式:

(1)  檢查PHY狀態寄存器的Link位,如果Link down 則重新初始化Socket;

主要針對網線插拔/斷開;

(2)  如果TCP通訊中斷,嘗試重新發起連接2-3次,若不能重新連接,則重新初始化Socket;

主要針對運行在TCP Client。您這裡是Server可以不予考慮;

(3) 設置Keep a live心跳包,若link斷開會在RTR和RCR規定時間之後,觸發超時中斷;

TCP 模式下可以使用。Server 或者Client都可以通過這種方法檢測。

21.

RTR值設定疑問

問題描述1:你好!請問下在W5500中要設置keep alive心跳包,通過配置RTR和RCR的值,觸發超時中斷。根據文檔的計算方法,最短時間是否只能是RTR=32768  RCR=0的情況,這樣算出來的時間是3.2s?能否把觸發時間設置的非常短?大概在10ms左右,現在我keep alive心跳包是通過手動發送的,不是自動發送。發送的時間大概在1ms之內。

 

答1:關於您下面的問題,可能是您對我們的用戶手冊有些誤解。觸發超時中斷的時間(ms) = RTR的值除以10,即,如果你把RTR的值設置為2000時,產生中斷的時間是200ms。如果想把產生中斷的時間設定為10ms,那麼把RTR的值設定為100即可。但是,不建議這麼操作,如果網絡反應過慢,會頻繁的重傳。根據10/100M以太網特性,200ms是一個比較通用的發送超時時間。請您參考。

問題描述2:如果按照你這樣說的,那RCR值設置代表的是什麼意思?  超時時間不是通過這兩個值來決定的嗎?

答2:RCR(Retransmission Counter Register) 是重傳次數,如果配置成3,表示發生超時中斷時會重傳一次,如果重傳還不成功,又發生了超時中斷,還會重傳,但,總次數不超過3。

建議您先看看我們用戶手冊,上面說明比較詳細。

閱讀:W5500問題集錦(一)