完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 Katrina_WIZnet 于 2014-11-10 17:13 编辑
中断部分,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 |
|
相关推荐
4 个讨论
|
|
只有小组成员才能发言,加入小组>>
479个成员聚集在这个小组
加入小组5100 浏览 1 评论
12125 浏览 5 评论
3505 浏览 2 评论
2973 浏览 0 评论
12707 浏览 2 评论
w5500 作为tcp server,客户端异常发送【RST,ACK】断开连接问题
1691浏览 1评论
1092浏览 0评论
使用stm32,通过spi的dma 收发,运行多次读写以后w5500发送正常,接收卡死,高人帮忙看看
6303浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 18:14 , Processed in 0.742991 second(s), Total 67, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号