MAX3420E 中断系统
引言
MAX3420E 可与任何 SPI 主控制器相连,构成全速 USB 外
设器件。尽管由 MAX3420 管理底层 USB 信令,但是需要处
理 USB 事件时,SPI 主控制器必须参与处理。MAX3420 的
INT 引脚指示有中断发生,SPI 主控制器读取 14 个中断请求
位,确定需要服务的中断。主要由这些中断请求(IRQ)位确
定 MAX3420E 的工作过程。
注意:SPI 主控制器可以是微控制器、DSP、ASIC 或者任何
具备 SPI 端口的器件,并能提供 SCLK 信号。本文档使用的
术语“SPI 主控制器”和“微控制器”含义相同。
MAX3420E 中断逻辑
图 1 所示为 MAX3420E 中断逻辑。阴影部分是可通过 SPI
访问的寄存器位。
IRQ 位
每一个中断源都有一个用于锁存服务请求的触发器。触发器
的输出即为 IRQ,它出现在 MAX3420E 寄存器中。IRQ 位
提供两种功能:
读取一个 IRQ 位,将返回 IRQ 触发器的状态。
写入一个“1”至 IRQ 位,将清除 IRQ 触发器,写入“0”至 IRQ
位,不改变触发器状态。
可以在任意时刻读取 IRQ 位,它反映了 IRQ 触发器的状态。
按照上面第 2 条,写入 1 而不是 0 来清除所选的 IRQ 位,这
一过程不需要读-修改-写周期。举例说明,假设 MAX3420E
的 IRQ 位与普通的寄存器位一样,写 1 置位,写 0 清除。现
在,我们想要清除 USBIRQ 寄存器的 URESIRQ 位。图 2 所
示为实现该操作的代码。
由于 SPI 主控制器通过写 1 来清除一个 MAX3420E IRQ 位,
而写 0 不改变其他寄存器位,因此 SPI 主控制器可以直接写
入位屏蔽值来清除 URESIRQ 位。所以,图 2 中的最后三条
语句可以由图 3 中的单条语句替代。
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 中,请注意以下几方面:
如果一个 IRQ 位置位,而其对应的 IEN 位清零,则 IRQ 不
会影响 INT 输出引脚。但是,中断仍处于悬挂状态。永远可
以读取 IRQ 位以获得其状态,可向对应的寄存器位写 1,将
IRQ 位清零。
悬挂中断(IRQ 位是 1)的 IEN 位出现 0-1 跳变时将产生中断
INT 引脚可连接至微控制器的中断系统。此外,微控制器可
以轮询 INT 引脚,以确定 MAX3420E 是否有中断处于悬挂
状态。最适合轮询的模式是电平模式(INTLEVEL = 1),这是
因为在边沿模式中,INT 引脚输出的脉冲可能太窄,微控制
器无法探测到(参考下面的讨论)。请注意,电平模式需要在
INT 引脚和 VL 之间连接一个上拉电阻。
INT 引脚波形
电平模式
图 4 所示为电平模式下的 MAX3420E INT 引脚波形。INT 引
脚静态为高电平(上拉至 VL)。假设图中两个中断的 IEN 位
置为 1,全局 IE 位置为 1,那么将出现以下事件。(下面标有
字母的条目对应图 4 中相同字母标出的事件。)
发生一个中断请求,使 MAX3420E 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 引脚一直保持低电平。
边沿模式
图 5 所示为两种极性边沿模式下的 MAX3420E INT 引脚波
形,极性由 POSINT 位控制。波形与电平模式的相似,但有
两处不同。在两种条件下,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 中,该脉冲的宽度固定为
μs。由于还有中断处于悬挂状态,INT 引脚保持在有效
状态。
SPI 主控制器完成一个悬挂中断服务后,向其 IRQ 位写入 1,
将其清除。与第(d)步一样,INT 引脚产生另一个边沿跳变。
SPI 主控制器处理完剩下的中断请求,向其 IRQ 位写入 1,
将其清除。没有中断处于悬挂状态,因此,INT 引脚返回至
无效状态。
中断寄存器
表 1. 阴影部分的 MAX3420E 寄存器位控制中断系统
MAX3420E 具有两类 USB 中断,由表 1 中阴影部分的寄存
器控制。中断位分为两类:位于 EPIRQ (R11)和 EPIEN (R12)
寄存器的端点控制,以及位于 USBIRQ (R13)和 USBIEN
(R14)寄存器的 USB 控制。全局 IE 位在 CPUCTL 寄存器中。
表 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-
同时驱动至低电平),来复位外设。探测到 μ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 端点)的清除方式不同,采用的方法是写入字节计数
寄存器。