应用笔记 3661

MAX3420E中断系统


摘要 : MAX3420E可为微控制器等任何SPI主控制器加入USB外设功能。MAX3420E的工作主要通过中断请求(IRQ)位协助完成,这些中断请求位提示SPI主控制器处理USB事件。本应用笔记对MAX3420E中断系统和每一个中断请求位进行了阐述。

引言

MAX3420E可与任何SPI主控制器相连,构成全速USB外设器件。尽管由MAX3420管理底层USB信令,但是需要处理USB事件时,SPI主控制器必须参与处理。MAX3420的INT引脚指示有中断发生,SPI主控制器读取14个中断请求位,确定需要服务的中断。主要由这些中断请求(IRQ)位确定MAX3420E的工作过程。


注意:SPI主控制器可以是微控制器、DSP、ASIC或者任何具备SPI端口的器件,并能提供SCLK信号。本文档使用的术语“SPI主控制器”和“微控制器”含义相同。

MAX3420E中断逻辑

图1. MAX3420E中断逻辑。阴影部分为寄存器位。
图1. MAX3420E中断逻辑。阴影部分为寄存器位。

图1所示为MAX3420E中断逻辑。阴影部分是可通过SPI访问的寄存器位。

IRQ位
每一个中断源都有一个用于锁存服务请求的触发器。触发器的输出即为IRQ,它出现在MAX3420E寄存器中。IRQ位提供两种功能:
  1. 读取一个IRQ位,将返回IRQ触发器的状态。
  2. 写入一个“1”至IRQ位,将清除IRQ触发器,写入“0”至IRQ位,不改变触发器状态。
可以在任意时刻读取IRQ位,它反映了IRQ触发器的状态。按照上面第2条,写入1而不是0来清除所选的IRQ位,这一过程不需要读-修改-写周期。举例说明,假设MAX3420E的IRQ位与普通的寄存器位一样,写1置位,写0清除。现在,我们想要清除USBIRQ寄存器的URESIRQ位。图2所示为实现该操作的代码。

图2. 清除通用寄存器位需要一次RMW操作
图2. 清除通用寄存器位需要一次RMW操作

由于SPI主控制器通过写1来清除一个MAX3420E IRQ位,而写0不改变其他寄存器位,因此SPI主控制器可以直接写入位屏蔽值来清除URESIRQ位。所以,图2中的最后三条语句可以由图3中的单条语句替代。

图3. 用一次寄存器写操作来清除MAX3420E IRQ位
图3. 用一次寄存器写操作来清除MAX3420E IRQ位

IEN位
14个MAX3420E中断的每一个都有相应的中断使能(IEN)位。IEN位和IRQ触发器输出进行“与”操作,决定是否向INT引脚传送中断请求(图1)。14个IRQ触发器通过门控电路后,进行“或”操作,形成一个内部中断请求信号,传送至中断引脚逻辑模块。

注意,无论IEN位的状态如何,IRQ位都指示中断悬挂状态。这样,即使中断不触发INT引脚,固件仍可以检查该悬挂中断。如果您的程序需要检查一个IRQ寄存器“是否悬挂中断”,一个简单的方法是读取IRQ和IEN寄存器,对它们进行“与”操作,检查现在指示“等待和被使能的IRQ”位。零值表示没有使能的中断处于悬挂状态。

IE位
SPI主控制器通过IE位使能或者禁止INT引脚。由于该位影响到所有的中断,因此通常称之为全局中断使能。不论IRQ或者IEN位的状态如何,当IE = 0时,INT引脚无效。

中断引脚逻辑
两个寄存器位INTLEVEL (参考下面的讨论)和POSINT控制INT引脚的工作方式。在设置IE = 1之前,应先设置这两个配置位。

电平模式,INTLEVEL = 1
某些微控制器系统使用低电平有效中断。采用这种配置时,MAX3420E采用一个开漏极晶体管驱动INT引脚至地。由于引脚只能驱动为低电平,因此,需要在INT引脚和逻辑电源之间接一个上拉电阻。该模式支持多个芯片的INT引脚输出(每个均为开漏输出)连接在一起,并使用单个上拉电阻。由于任何一个芯片输出都可将该引脚拉低,因此这种逻辑有时也称为“线或”。对于这种类型的系统,设置INTLEVEL = 1。

边沿模式,INTLEVEL = 0 (缺省值)
MAX3420E INT引脚也可以驱动边沿有效的中断系统,此时微控制器在其中断输入引脚上检查0-1或者1-0跳变。这是MAX3420E的缺省模式,INTLEVEL = 0。SPI主控制器通过第二个POSINT位设置边沿极性。当POSINT = 1时,MAX3420E为悬挂中断输出一个0-1跳变。当POSINT = 0 (缺省值)时,MAX3420E为悬挂中断输出一个1-0跳变。

在图1中,请注意以下几方面:
  1. 如果一个IRQ位置位,而其对应的IEN位清零,则IRQ不会影响INT输出引脚。但是,中断仍处于悬挂状态。永远可以读取IRQ位以获得其状态,可向对应的寄存器位写1,将IRQ位清零。
  2. 悬挂中断(IRQ位是1)的IEN位出现0-1跳变时将产生中断
  3. INT引脚可连接至微控制器的中断系统。此外,微控制器可以轮询INT引脚,以确定MAX3420E是否有中断处于悬挂状态。最适合轮询的模式是电平模式(INTLEVEL = 1),这是因为在边沿模式中,INT引脚输出的脉冲可能太窄,微控制器无法探测到(参考下面的讨论)。请注意,电平模式需要在INT引脚和VL之间连接一个上拉电阻。

INT引脚波形

电平模式

图4. 电平模式下MAX3420E INT引脚的变化(INTLEVEL = 1)
图4. 电平模式下MAX3420E INT引脚的变化(INTLEVEL = 1)

图4所示为电平模式下的MAX3420E INT引脚波形。INT引脚静态为高电平(上拉至VL)。假设图中两个中断的IEN位置为1,全局IE位置为1,那么将出现以下事件。(下面标有字母的条目对应图4中相同字母标出的事件。)

  1. 发生一个中断请求,使MAX3420E INT引脚置低。
    注意:尽管MAX3420E中断输出引脚被称为INT引脚,它有时也是负极性(例如在电平模式下)。
  2. SPI主控制器完成中断服务后,向IRQ位写入1,将其清零。INT引脚返回至静态高电平。(a)和(b)之间的间隔是中断置位其IRQ位和SPI主控制器清除IRQ位之间的时间。
  3. 产生另一个中断请求,将INT引脚拉低。
  4. 当第一个中断请求处于悬挂状态时,产生了第二个中断请求。INT电平没有变化,因为至少有一个中断处于悬挂状态。(实际上,此刻有两个中断处于悬挂状态。)
  5. SPI主控制器完成一个中断服务后,向IRQ位写入1,将其清零。由于仍有一个中断处于悬挂状态,INT引脚保持低电平。
  6. SPI主控制器处理完剩下的中断请求,向IRQ位写入1,将其清零。没有中断处于悬挂状态,因此INT引脚返回至静态高电平。

注意:如果一个中断的IRQ触发器(图1)置位,则认为该中断处于悬挂状态。


这种逻辑可以很好地处理INT引脚轮询。如果MAX3420E的任何部分需要服务,并且其中断已被使能,那么INT引脚变为低电平。在微控制器清除最后一个悬挂IRQ位之前,INT引脚一直保持低电平。

边沿模式

图5. 边沿模式下MAX3420E INT引脚的变化(INTLEVEL = 0)。间隔(1)是SPI主控制器清除IRQ的时间,间隔(2)是10.67µs。
图5. 边沿模式下MAX3420E INT引脚的变化(INTLEVEL = 0)。间隔(1)是SPI主控制器清除IRQ的时间,间隔(2)是10.67µs。

图5所示为两种极性边沿模式下的MAX3420E INT引脚波形,极性由POSINT位控制。波形与电平模式的相似,但有两处不同。在两种条件下,INT引脚产生边沿跳变:
  1. 一个IRQ位变为有效状态(其IRQ触发器产生0-1跳变)。
  2. 处理器清除一个IRQ位(向其写入1),其他IRQ处于悬挂状态。
第二个条件确保还有中断需要服务时处理器能够检测到边沿跳变。

除了产生边沿跳变外,与电平模式一样,INT引脚也具有有效和无效状态。INT引脚的无效状态取决于POSINT位设置的边沿极性。在这点上,边沿模式与电平模式相似,查看INT引脚的状态就可以知道是否有中断处于悬挂状态:
  • 在负极性边沿模式下,如果没有悬挂中断,INT引脚为高电平;如果有悬挂中断,则为低电平。
  • 在正极性边沿模式下,如果没有悬挂中断,INT引脚为低电平;如果有悬挂中断,则为高电平。
以下说明解释了INT引脚的有效和无效状态。有效状态意味着至少有一个中断处于悬挂状态;无效状态是指没有中断处于悬挂状态。假设中断已被使能,将出现以下事件。(下面标有字母的条目对应图5中相同字母标出的事件。)
  1. 产生一个中断请求时,MAX3420E INT引脚出现一个边沿跳变。边沿的极性取决于POSINT位的设置。由于中断仍处于悬挂状态,INT引脚保持其有效状态。
  2. SPI主控制器完成中断服务后,向IRQ位写入1,将其清零。MAX3420E INT引脚返回至无效状态。图中(a)和(b)之间的间隔(1)是产生中断和SPI主控制器清除IRQ位之间的时间。
  3. 产生另一个中断请求时,MAX3420E INT引脚产生一个边沿跳变,并保持其有效状态。
  4. 当第一个中断请求处于悬挂状态时,又产生了第二个中断请求。MAX3420E INT引脚必须产生另一个边沿跳变,因此该引脚在无效和有效状态之间产生跳变脉冲,从而提供正确的边沿极性。在MAX3420E中,该脉冲的宽度固定为10.67µs。由于还有中断处于悬挂状态,INT引脚保持在有效状态。
  5. SPI主控制器完成一个悬挂中断服务后,向其IRQ位写入1,将其清除。与第(d)步一样,INT引脚产生另一个边沿跳变。
  6. SPI主控制器处理完剩下的中断请求,向其IRQ位写入1,将其清除。没有中断处于悬挂状态,因此,INT引脚返回至无效状态。

中断寄存器

表1. 阴影部分的MAX3420E寄存器位控制中断系统


MAX3420E具有两类USB中断,由表1中阴影部分的寄存器控制。中断位分为两类:位于EPIRQ (R11)和EPIEN (R12)寄存器的端点控制,以及位于USBIRQ (R13)和USBIEN (R14)寄存器的USB控制。全局IE位在CPUCTL寄存器中。

表2. 14个MAX3420E中断源
Bit Name Default Location Set By Cleared By
IN0BAVIRQ 1 EPIRQ.0 EP0 FIFO is ready for µP loading Load the EP0BC register
OUT0DAVIRQ 0 EPIRQ.1 EP0-OUT FIFO has host data Write EPIRQ = 0x02
OUT1DAVIRQ 0 EPIRQ.2 EP1-OUT FIFO has host data Write EPIRQ = 0x04
IN2BAVIRQ 1 EPIRQ.3 EP2-IN FIFO is ready for µP loading Load the EP2INBC register
IN3BAVIRQ 1 EPIRQ.4 EP3-IN FIFO is ready for µP loading Load the EP3INBC register
SUDAVIRQ 0 EPIRQ.5 Setup Data is available in SUDFIFO Write EPIRQ = 0x20
OSCOKIRQ 0 USBIRQ.0 MAX3420E Oscillator/PLL is stable Write USBIRQ = 0x01
RWUDNIRQ 0 USBIRQ.1 SIE has finished signaling RWU Write USBIRQ = 0x02
BUSACTIRQ 0 USBIRQ.2 Bus is active Write USBIRQ = 0x04
URESIRQ 0 USBIRQ.3 Host started signaling bus reset Write USBIRQ = 0x08
SUSPIRQ 0 USBIRQ.4 Host suspended the bus Write USBIRQ = 0x10
NOVBUSIRQ 0 USBIRQ.5 VBUS comparator made 1-0 transition Write USBIRQ = 0x20
VBUSIRQ 0 USBIRQ.6 VBUS comparator made 0-1 transition Write USBIRQ = 0x40
URESDNIRQ 0 USBIRQ.7 Host finished signaling bus reset Write USBIRQ = 0x80

表2说明了14个中断控制位,MAXQ3420E内部逻辑何时对它们进行置位,以及SPI主控制器怎样清除它们。

中断请求位

BAV位
三个缓冲区就绪(BAV) IRQ位指示SPI主控制器可以装入一个IN端点FIFO。芯片复位或者IN数据由端点缓冲区成功地发送给主机后,MAX3420E置位这些IRQ位。该IRQ通知SPI主控制器缓冲区可以装入新数据。

图6. 主机向端点3发送一个IN请求的总线过程
图6. 主机向端点3发送一个IN请求的总线过程

图6所示为IN传输的总线过程,主机从MAX3420E申请数据。在数据包7145到达前,SPI主控制器先将字节00 00 08装入端点3-IN FIFO (EP3INFIFO)。然后,SPI主控制器将数值3写入EP3INBC (端点3 IN字节计数)寄存器。写入字节计数寄存器,可完成以下三项功能:
  1. 通知MAX3420E当IN请求到达时有多少字节要发送。
  2. 使端点为传输数据做好准备(而不是非应答)。
  3. 清除EP3INBAV IRQ位。
MAX3420E以数据包7146响应以端点3为地址的IN数据包。主机发送应答(ACK)数据包7147,响应接收到的无误码数据。当MAX3420E检测到主机ACK包后,设置EP3INBAV中断请求位,通知SPI主控制器端点FIFO可以装入新数据。

如果在SPI主控制器准备好端点之前到达IN数据包,MAX3420E会响应一个NAK握手信号(图7)。NAK握手信号通知主机稍后重发IN请求。

图7. 如果MAX3420E还没有准备好发送数据,则发出一个NAK包。
图7. 如果MAX3420E还没有准备好发送数据,则发出一个NAK包。

如果在IN数据传输至主机过程中出现误码,当主机重发IN请求时,MAX3420E自动重发数据(以及相同的数据触发DATA0/DATA1)。只有接收到来自主机的ACK握手信号后,MAX3420E才会置位端点的BAV IRQ位,指示缓冲区准备好接收新数据。


重要提示:与所有的MAX3420E IRQ位一样,也可以通过写入1来三个清除BAV IRQ位。千万不要这样做。相反,应采用上面列出的方法:通过写入IN端点的字节计数寄存器来清除BAV IRQ位。这是因为MAX3420E使用一个IN端点的BAV中断请求位作为锁定机制。该机制确保SPI主控制器和MAX3420E的串行接口引擎(SIE)不会同时使用端点缓冲区。例如,如果清除BAV位,然后以两条单独指令装入字节计数器,那么当您更新字节计数寄存器时,可能开始了数据包传输,从而导致数据出错。


BAV IRQ缺省值
三个BAV IRQ位(见表2 Default列中的1)的缺省值为1。这表明,上电或者复位后SPI主控制器将读取到EPIRQ = 0x19。如果任何一个对应的IEN位置位,INT引脚将指示中断处于悬挂状态。

双缓冲端点EP2-IN
MAX3420E EP2-IN端点为双缓冲结构。这表明它有两组64字节FIFO和字节计数寄存器。双缓冲提高了传输带宽,这是因为在装入另一个数据包之前,SPI主控制器不需要等待数据包传输至主机。采用双缓冲结构,SPI主控制器可以在一个IN FIFO向主机传输其IN数据的同时装入另一个IN FIFO。当您装载EP2INBC寄存器时,两个缓冲区“自动轮换”。这将另一个FIFO (第二组)和字节计数寄存器提供给SPI主控制器使用。这种双缓冲机制对固件来说是透明的。

双缓冲机制使我们能够观察到的唯一影响出现在初始化过程中。上电或者芯片复位时,IN2BAVIRQ位置位。一般情况下,初始化程序把数据装入EP2IN FIFO,然后装载EP2INBC寄存器,为传输做好准备,同时清除了IN2BAVIRQ位。这样做时,您会很奇怪地发现MAX3420E立即重新置位IN2BAVIRQ位。这表明第二个缓冲区已经准备就绪,允许SPI主控制器装入第二个数据包。

DAV中断请求位
OUT端点的数据就绪(DAV) IRQ位指示已经从主机接收到了新数据。MAX3420E自动处理总线重试操作,只有当接收到的数据无误码时,才会产生中断请求。当SPI主控制器收到DAV中断请求时,它将读取端点字节计数寄存器,确定有效数据的大小。然后SPI主控制器从端点的OUTFIFO读取相应数目的字节。SPI主控制器以向OUTDAV IRQ位写入1的正常方式对其清零。这样,使端点再次准备好接收下一个OUT数据包。

图8中,主机发送一个OUT PID和四个字节的数据,MAX3420E将其传送至EP1OUT FIFO。当MAX3420E验证传送无误码后,将更新其EP1OUTBC寄存器,指示四个字节,向主机发送ACK包,并置位EP1OUTDAV IRQ,通知SPI主控制器可以提取端点1 FIFO内已经准备好的数据。

图8. 主机向端点1发送OUT包的总线过程
图8. 主机向端点1发送OUT包的总线过程

双缓冲端点EP1-OUT
MAX3420E EP1-OUT端点为双缓冲结构,这表明它具有两组64字节FIFO和字节计数寄存器。双缓冲意味着SPI主控制器对OUT1DAVIRQ清零后,如果有另一个主机数据包在等待,它可以立即重新置位。

SUDAV中断请求位
当主机向MAX3420E发送一个CONTROL传输时,MAX3420E在一个8字节FIFO中存储8个SETUP字节,SPI主控制器可从SUDFIFO寄存器中读取该数据。由于外设总是从该缓冲区中接收主机数据,SUDAVIRQ的作用类似一个OUT端点FIFO,当主机来的新数据接收完毕后,MAX3420E置位其SUDAV IRQ。一个SETUP数据包总是包含8个字节,因此,SETUP数据不需要字节计数寄存器。

OSCOK中断请求位
当MAX3420E上电、芯片复位完毕、或者退出关电状态时,需要时间来启动内部振荡器和PLL,以达到稳定。振荡器就绪(OSCOK) IRQ指示MAX3420E已经准备好工作。

图9. 复位MAX3420E,在结束前等待OSCOK的实例代码。
图9. 复位MAX3420E,在结束前等待OSCOK的实例代码。

图9所示为实例代码,采用CHIPRES寄存器位复位MAX3420E。由于芯片复位将停止内部振荡器工作,代码设置CHIPRES = 0清除复位信号后,在使用MAX3420E之前应该等待振荡器稳定下来。

RWUDN中断请求位
处于挂起状态时,USB外设可以发出远程唤醒(RWU)信号,通知主机恢复总线工作。USB规范定义了一个1ms至15ms K-state的远程唤醒信号。SPI主控制器通过设置远程唤醒信号(SIGRWU)位等于1,来触发RWU信号。

当SPI主控制器置位SIGRWU位时,MAX3420E等待5ms,驱动K-state 10ms,然后置位远程唤醒完成中断请求(RWUDNIRQ)位。5ms延时保证符合另一USB要求:在外设发出恢复信号前,总线必须至少空闲(J-state) 5ms。

图10. 发送远程唤醒信号的实例代码
图10. 发送远程唤醒信号的实例代码

图10所示为发送远程唤醒的实例代码。注意,MAX3420E实现信号定时,完成后置位IRQ。MAX3420E对于所有的定时USB事件均这样处理,完成时产生一个中断,因此SPI主控制器不需要定时控制信号间隔。

图10中的代码置位SIGRWU位,然后循环等待RWUDNIRQ置位,以确定持续10ms信号时间。然后,SPI主控制器设置SIGRWU = 0,并清除IRQ位。一般地,在多任务SPI主控制器中,应响应RWUDNIRQ中断请求,而不要浪费时间直接检查IRQ位。

接收到RWUDNITQ中断后的5ms内,SPI主控制器应关闭SIGRWU位。如果没有这样做,MAX3420E将启动另一个10ms K-state,重复这一过程(等待5ms, 然后10ms K-state),直到SIGRWU = 0。在RWU信号处理过程中设置SIGRWU = 0,不会终止RWU信号。

如果SPI主控制器设置SIGRWU = 1时MAX3420E正处于关电状态(PWRDOWN = 1),那么MAX3420E会自动重新启动振荡器,等待其达到稳定,然后开始发送RWU信号。在这种情况下,SPI主控制器不需要检查OSCOK IRQ。

BUSACT中断请求位
当MAX23420E探测到在USB数据包的开始位置有SYNC模式时,置位BUSACT IRQ位。USB总线复位过程不是总线活动状态,因此不会触发BUSACK中断请求。

URES和URESDN中断请求位
USB主机通过至少保持50ms的单端零(SE0)状态(D+和D-同时驱动至低电平),来复位外设。探测到2.5µs的SE0状态后,MAX3420E置位USB复位IRQ (URESIRQ)。然后,当主机完成复位后,MAX3420E置位USB复位完成IRQ (URESDNIRQ)。

由于SPI主控制器需要监视USB总线复位事件,在总线复位期间,MAX3420E不会清除URESIE、URESDNIE或IE中断使能位。但在总线复位期间它会清除EPIEN和USBIEN寄存器中的所有其他中断使能位。

SUSP中断请求位
当MAX3420E探测到总线停止工作3ms (持续J-state)后,它产生挂起中断请求(SUSPIRQ)。如果使用MAX3420E的外设是由总线供电的,它必须进入低功耗状态,以最大程度降低从VBUS上吸收的电流。在这种情况下,SPI主控制器应关断消耗功率的外设,然后设置PWRDOWN = 1,使MAX3420E进入低功耗模式。这样一来,MAX3420E振荡器停止工作,并进入最低功耗状态。

需要注意下面两条编程提示:
  • 清除SUSPIRQ位不能阻止3ms后中断重新产生。总线挂起时,为避免产生重复的挂起中断,在总线恢复工作之前,应清除挂起IEN位。
  • 内部挂起定时器逻辑由MAX3420E的内部振荡器提供时钟。因此,如果您将器件置为关断模式(设置PWRDOWN = 1),然后试图向SUSPIRQ位写入1来清除该位,MAX3420E将不会清除该位。MAX3420E离不开现在已停止工作的内部时钟。
VBUS和NOVBUS中断请求位
一个自供电外设可以探测自己是否插入USB接口,利用这些中断进行上电。内部VBUS比较器触发这些中断,它比较VBCOMP引脚电压和内部基准电压。它们均为边沿触发,当VBUS电压(VBUSIRQ)进行供电或者停止供电(NOVBUSIRQ)时置位。

总线供电的外设不需要探测VBUS,因为它由VBUS供电。这样,可以释放VBCOMP引脚,用作通用输入。在这种应用中,VBCOMP引脚没有内部上拉电阻,因此,应在VBCOMP引脚和VL之间连接一个上拉电阻。

编程提示

清除IEN位
芯片复位
芯片复位期间,所有IE位被清除。出现以下情况时,芯片复位:
  1. VL电源为MAX3420E供电(上电复位)。
  2. MAX3420E RES#引脚置低。
  3. SPI主控制器设置CHIPRES = 1。
总线复位
当MAX3420E探测到一个USB总线复位(总线暂停3ms)后,除了三个IE位外,其他IE位全部清零。SPI主控制器可能需要处理总线复位中断,以监视总线复位信号的状态。因此,总线复位不会影响以下IE位:
  1. URESIE
  2. URESDNIE
  3. IE (全局中断使能)
由于USB总线复位清除大部分IE位,当总线完成复位后,控制固件应重新使能所需的中断。

清除BAV和DAV IRQ位
请注意,DAV IRQ位以正常的写1方式进行清除。BAV位(用于IN端点)的清除方式不同,采用的方法是写入字节计数寄存器。