W5100中断问题

Home / 博客 / 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用户手册