MAX3420E中断系统
max3420e可与任何spi主控制器相连,构成全速usb外设器件。尽管由max3420管理底层usb信令,但是需要处理usb事件时,spi主控制器必须参与处理。max3420的int引脚指示有中断发生,spi主控制器读取14个中断请求位,确定需要服务的中断。主要由这些中断请求(irq)位确定max3420e的工作过程。
注意:spi主控制器可以是微控制器、dsp、asic或者任何具备spi端口的器件,并能提供sclk信号。本文档使用的术语“spi主控制器”和“微控制器”含义相同。
max3420e中断逻辑

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


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

发生一个中断请求,使max3420e int引脚置低。
spi主控制器完成中断服务后,向irq位写入1,将其清零。int引脚返回至静态高电平。(a)和(b)之间的间隔是中断置位其irq位和spi主控制器清除irq位之间的时间。
产生另一个中断请求,将int引脚拉低。
当第一个中断请求处于悬挂状态时,产生了第二个中断请求。int电平没有变化,因为至少有一个中断处于悬挂状态。(实际上,此刻有两个中断处于悬挂状态。)
spi主控制器完成一个中断服务后,向irq位写入1,将其清零。由于仍有一个中断处于悬挂状态,int引脚保持低电平。
spi主控制器处理完剩下的中断请求,向irq位写入1,将其清零。没有中断处于悬挂状态,因此int引脚返回至静态高电平。
注意:如果一个中断的irq触发器(图1)置位,则认为该中断处于悬挂状态。
这种逻辑可以很好地处理int引脚轮询。如果max3420e的任何部分需要服务,并且其中断已被使能,那么int引脚变为低电平。在微控制器清除最后一个悬挂irq位之前,int引脚一直保持低电平。
边沿模式

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

表2. 14个max3420e中断源

表2说明了14个中断控制位,maxq3420e内部逻辑何时对它们进行置位,以及spi主控制器怎样清除它们。
中断请求位
bav位
三个缓冲区就绪(bav) irq位指示spi主控制器可以装入一个in端点fifo。芯片复位或者in数据由端点缓冲区成功地发送给主机后,max3420e置位这些irq位。该irq通知spi主控制器缓冲区可以装入新数据。

图6所示为in传输的总线过程,主机从max3420e申请数据。在数据包7145到达前,spi主控制器先将字节00 00 08装入端点3-in fifo (ep3infifo)。然后,spi主控制器将数值3写入ep3inbc (端点3 in字节计数)寄存器。写入字节计数寄存器,可完成以下三项功能:
通知max3420e当in请求到达时有多少字节要发送。
使端点为传输数据做好准备(而不是非应答)。
清除ep3inbav irq位。
max3420e以数据包7146响应以端点3为地址的in数据包。主机发送应答(ack)数据包7147,响应接收到的无误码数据。当max3420e检测到主机ack包后,设置ep3inbav中断请求位,通知spi主控制器端点fifo可以装入新数据。
如果在spi主控制器准备好端点之前到达in数据包,max3420e会响应一个nak握手信号(图7)。nak握手信号通知主机稍后重发in请求。

如果在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内已经准备好的数据。

双缓冲端点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所示为实例代码,采用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所示为发送远程唤醒的实例代码。注意,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位被清除。出现以下情况时,芯片复位:
vl电源为max3420e供电(上电复位)。
max3420e res#引脚置低。
spi主控制器设置chipres = 1。
总线复位
当max3420e探测到一个usb总线复位(总线暂停3ms)后,除了三个ie位外,其他ie位全部清零。spi主控制器可能需要处理总线复位中断,以监视总线复位信号的状态。因此,总线复位不会影响以下ie位:
uresie
uresdnie
ie (全局中断使能)
由于usb总线复位清除大部分ie位,当总线完成复位后,控制固件应重新使能所需的中断。
清除bav和dav irq位
请注意,dav irq位以正常的写1方式进行清除。bav位(用于in端点)的清除方式不同,采用的方法是写入字节计数寄存器。
评论