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)。
如果某一時段 先後發生2個中斷 ,Socket 0 和scoket1
A. 當Socket 0的超時中斷被觸發。 SIR[0]& S0_IR[3]設置為‘1’,指出是第0個Socket發生了超時中斷。
接著 INTn 引腳才被拉低,告知主機發生了中斷。
B. 當Socket 1的連接中斷在前一個中斷未處理完畢之前被觸發,則INTn 引腳仍然為低,S1_IR[0] & SIR[1]位設置為‘1’。
C. 假設主機處理完中斷。然後清理S0_IR[3]位及SIR[0],盡管此時S1_IR[0] & SIR[1]仍然保持為‘1’,INTn引腳仍將被拉高。
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 指出是第n個Socket 發生了中斷事件,Sn_IR指出了Socket n 發生了什麽類型中斷事件,如收到數據 超時等。
因此假設主機採用中斷方式,檢測到INTn才幹被拉低了。進入中斷服務函數能夠採用先推斷是不是IR中斷。不是再讀取SIR狀態,找到觸發中斷的那個Socket n,接著讀取對應的Sn_IR 進行處理。每次處理完,須要主機對應寄存器的對應位清除。
By William
歡迎與我們很多其它交流:[email protected]
WIZnet官方中文站點:http://www.iwiznet.cn
WIZnet官方中文博客:http://blog.iwiznet.cn
WIZnet MakerSpace博物館:http://wiznetmuseum.com/
W5500中斷寄存器的理解