zoukankan      html  css  js  c++  java
  • W5500中断寄存器的理解

    W5500中断部分,W5500中文手冊V1.0 写的不够清楚,该文是本人结合中英文手冊及自己理解,整理出有关中断部分的理解,如有不对的请指正。

     

    一:引脚 INTn 为中断输出(Interrupt output)

    低电平:W5500的中断生效。

    高电平:无中断或者处于中断生效等待中

     

    二:中断相关寄存器

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

    该寄存器主要指示网络连接错误或唤醒引起当的中断。

    某位为1 且 该位中断没有被屏蔽就能够引发中断,INTn引脚将会被拉低。中断处理完成后,能够由主机写为‘1’清除该位中断. IR 为‘0×00’时,INTn引脚将会被拉高。 5500中断1

    5500中断2

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

    中断屏蔽寄存器(IMR)是用来屏蔽中IR中断的,某位写‘1’。则开启中断。写‘0’,关闭中断。

    每一个中断屏蔽位相应中断寄存器(IR)中的一个位. 假设IMR某位写0,即使IR中相应位为1了。也不会引发中断。INTn引脚不会被拉低。

    5500中断3

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

    SIR就是指示哪个Socket发生的中断的。

    假设某个Socket发生的中断。该寄存器的相应位将被置为1 ,直到被主机置‘1’清除。

    假设Sn_IR不等于‘0×00’, 就会引发中断,INTn引脚将被拉低。

    5500中断4

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

    SIMR寄存器来屏蔽中SIR中断的,某位写‘1’,则开启中断。写‘0’。关闭中断。

    5500中断5

    每一个中断屏蔽位相应中断寄存器(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’

    5500中断6

    这里的[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 引脚便会拉低并使主机产生中断。 5500中断7

    2.7  INTLEVEL (低电平中断定时器寄存器) [R/W] [0x0013 – 0x0014] [0x0000]

    该寄存器用于设置中断生效等待的时间(IAWT)。当下一个中断触发。中断引脚将会在INTLEVEL时间后。拉低中断引脚(INTn)。 5500中断8

    如果某一时段 先后发生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

    欢迎与我们很多其它交流:wiznetbj@wiznet.co.kr

    WIZnet官方中文站点:http://www.iwiznet.cn

    WIZnet官方中文博客:http://blog.iwiznet.cn

    WIZnet MakerSpace博物馆:http://wiznetmuseum.com/

  • 相关阅读:
    bzoj1951 [Sdoi2010]古代猪文
    bzoj2693 jzptab
    数学一本通第三章总结
    poj1019 Number Sequence
    SGU179 Brackets light
    字母组合2
    字母组合
    Java基础知识强化之集合框架笔记09:Collection集合迭代器使用的问题探讨
    Java基础知识强化之集合框架笔记08:Collection集合自定义对象并遍历案例(使用迭代器)
    Java基础知识强化之集合框架笔记07:Collection集合的遍历之迭代器遍历
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6917252.html
Copyright © 2011-2022 走看看