W5100中斷問題

W5100是WIZnet研發的TCP/IP芯片,出色的網絡接入表現使它為用戶所廣泛使用,基於它的以太網方案的表現優異穩定,經歷住了市場的考驗。在使用它的過程中,有朋友對其的中斷問題還有些疑問,讓我們一起看看吧

來自阿莫電子論壇:http://www.amobbs.com/thread-4046080-1-1.html

樓主問題:“W5100接收中斷問題請教”

“最近在調試stm32和w5100,spi接口,tcp模式。在建立連接後,接收到數據後recv中斷髮生,接着讀取一次數據。但是之後雖然沒有再次發送數據,recv中斷還是會發生,再次讀出的數據就是w5100 rx memory中之後的數據,地址是連續的。”

回帖:

——“你讀完數據得清除SOCKETn Interrupt Register中的RECV位啊……”

——“你得清除終端位 方法是寫那個中斷位 記得是寫1就行的”

這是回帖的朋友給出的意見。^^

——————————————-

另外關於W5100的中斷方式,我們可以看看來自“電子工程世界”的這位朋友的調試心得(是否原創不詳)。

來自電子工程世界:http://home.eeworld.com.cn/my/space-uid-415548-blogid-71889.html

“w5100是自帶網絡協議的芯片,具體我不講了,我就講下中斷方式應用,這個應用是採用TCP/IP網絡協議,單片機是客戶端跟服務器進行相連的。

    這裡先講兩種寄存器,W5100_IR和W5100_S0_IR,後面這個這個芯片總共有4個S0\S1\S2\S3,這裡我只用一個端口0,也就是W5100_S0_IR。W5100_IR是W5100中斷寄存器,W5100_S0_IR是W5100端口0寄存器,是兩個不同的寄存器。如果端口0有了一個連接信號,則W5100_IR裡面的端口0中斷位置1,同時W5100_S0_IR裡面的連接位置1。其他的斷開信號、接收到數據信號、超時信號類似。

    w5100有一個引腳INT,這個引腳正常的時候是高電平,當5100的端口產生連接、斷開、接收到數據或超時時會產生低電平,這個低電平會一直保持低電平直到W5100_IR這個寄存器裡面的值為0才會恢復成高電平。我就是用這個引腳來設計。將這個INT與單片機的某一個中斷引腳相連就可以檢測W5100模塊是否有信號來了。

    當單片機檢測到INT中斷信號,進入中斷服務程序,先讀W5100_IR寄存器裡面的值,如果端口0位置1了,就繼續讀W5100_S0_IR寄存器裡面的值,如果寄存器裡面的接收到數據位置1了,就置端口0接收到數據標誌,下面就可以隨功能進行設置了。

  …某代理商例程void W5100_Interrupt_Process(void)這個中斷處理程序框架,這個程序裡面只進行了一次中斷處理。如果有多個中斷連續來了,這個程序就會導致以太網連接失敗。我們只需要在這個函數最後再次讀一下W5100_IR寄存器是不是等於0了,如果不是要返回到程序的開始重新執行下。這樣一改,中斷方式就沒有問題了。

…我的單片機在W5100接收到很多中斷的時候無法處理好,就是W5100_IR裡面的值在我清了後會立即置位,也就是多中斷的問題。後來前輩說你只要在中斷處理程序後面再確認一下中斷都處理好了再跳出程序就好了。最終是改好了,也就是上一個段落的方法。”

————————————————————————————

小結:

W5100的中斷寄存器IR位於通用寄存器中,CPU通過訪問該寄存器獲得產生中斷的來源。任何中斷都可以在中斷寄存器(IMR)中被屏蔽。當任何一個未屏蔽的中斷位為“1”,/INT (中斷輸出引腳,低電平有效)的信號將保持低電平。只有當所有未屏蔽的中斷位為 0,/INT 才恢復高電平。

當端口n(n=0~3)產生中斷時,Sn_INT將被置“1”,當端口寄存器中的Sn_IR清0時,該位自動清零。當S0_INT~S3INT均為0時,/INT引腳恢復高電平。

在端口n中斷寄存器Sn_IR中,該寄存器指示建立和終止連接、接受數據、發送完成以及時間溢出等信息。寄存器中相應的位被置“1”後必須寫入“1”才清 0。

具體圖示如下:

以上就是一些關於W5100中斷問題可能會遇到的問題,注意在處理完一次中斷後注意清除Sn_IR,還有朋友遇到無法同時開通多個Socket口的問題,這就要注意正確建立socket以及區分各自的Socket號,更多信息,歡迎參考一下的鏈接文檔。

 

相關文檔:W5100評估板W5100E01-AVR用戶手冊

W5100用戶手冊