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中断逻辑。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 显示了执行此操作的代码。
图2.清除常规寄存器位需要RMW操作。
由于SPI主机通过写入3420来清除MAX1E IRQ位,而0则保持其他寄存器位不变,因此SPI主机可以通过直接写入位掩码值来清除URESIRQ位。因此,图 2 中的最后三个语句可以替换为图 3 中的单个语句。
图3.MAX3420E IRQ位通过单寄存器写入清除。
IEN 位 MAX14E的3420个中断中
的每一个都有一个相关的中断ENable(IEN)位。IEN 位与 IRQ 触发器输出进行 AND 运算,以传递或阻止请求传播到 INT 引脚(图 1)。14 个 IRQ 触发器被选通,然后通过 OR 组合在一起形成一个内部中断请求信号,该信号传递到中断引脚逻辑块。
请注意,IRQ 位表示中断的挂起状态,而不考虑其 IEN 位的状态。这使固件可以选择在不触发 INT 引脚的情况下检查挂起的中断。如果您的代码需要检查 IRQ 寄存器是否“无挂起”,一个简单的解决方案是读取 IRQ 和 IEN 寄存器,以及它们一起读取,并检查现在表示“挂起和已启用的 IRQ”的位。零值表示所有已启用的中断均未挂起。
IE 位
SPI 主站启用或禁用带有 IE 位的 INT 引脚。这通常称为全局中断启用,因为它会影响所有中断。当 IE = 0 时,INT 引脚将变为非活动状态,而与任何 IRQ 或 IEN 位的状态无关。
中断引脚逻辑
两个寄存器位,INT电平(见下文讨论)和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 位为 1),其 IEN 位进行 0-1 转换会导致中断
INT引脚可以连接到微控制器的中断系统。或者,微控制器可以轮询INT引脚,以确定是否有MAX3420E中断处于挂起状态。用于轮询的最佳模式是电平模式(INTLEVEL = 1),因为在边缘模式下,INT引脚可能会发出太窄的脉冲,微控制器无法看到(请参阅下面的讨论)。请记住,电平模式需要一个从 INT 引脚到 V 的上拉电阻L.
国际引脚波形
水平模式
图4.MAX3420E INT引脚在电平模式下的行为(INTLEVEL = 1)。
图4所示为电平模式下MAX3420E INT引脚波形。INT 引脚的静态状态为高电平(上拉至 VL).假设图中两个中断的 IEN 位设置为 1,全局 IE 位设置为 4,则会发生以下事件。(下面的字母项对应于图 <> 中的字母事件。
中断请求到达,导致MAX3420E INT引脚驱动低电平。
SPI 主机完成中断服务,并通过向其写入 1 来清除其 IRQ 位。INT 引脚返回到其高静态状态。(a) 和 (b) 之间的间隔是中断置位其 IRQ 位和 SPI 主机清除 IRQ 位之间的时间。
另一个中断请求到达,将 INT 引脚驱动为低电平。
当第一个中断请求挂起时,第二个中断请求到达。INT 级别不会更改,因为至少有一个中断挂起。(实际上,目前有两个待定。
SPI 主机完成对其中一个挂起中断的处理,并通过向其写入 1 来清除其 IRQ 位。INT 引脚保持低电平,因为一个中断仍处于挂起状态。
SPI 主机完成对剩余中断请求的处理,并通过向其写入 1 来清除其 IRQ 位。没有挂起的中断,因此 INT 引脚返回到其静态高电平状态。
注意:如果设置了中断的IRQ触发器(图1),则认为中断处于挂起状态。
此逻辑非常适合轮询 INT 引脚。如果MAX3420E中的任何内容需要维修,并且其中断使能,则INT引脚为低电平。INT 引脚保持低电平,直到微控制器清除最后一个挂起的 IRQ 位。
边缘模式
图5.MAX3420E INT引脚在EDGE模式下的行为(INTLEVEL = 0)。间隔(1)是SPI主机清除IRQ所需的时间,间隔(2)为10.67μs。
图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 主机完成中断服务,并通过向其写入 1 来清除其 IRQ 位。MAX3420E INT引脚返回非工作状态。图中(a)和(b)之间的间隔(1)是中断置位和SPI主机清除IRQ位之间的时间。
另一个中断请求到达,MAX3420E INT引脚提供边沿并保持工作状态。
当第一个中断请求挂起时,第二个中断到达。MAX3420E INT引脚必须提供另一个边沿,因此它在非工作和工作状态之间脉冲,以提供适当极性的边沿。该脉冲的宽度固定在MAX10E中为67.3420μs。由于中断处于挂起状态,因此 INT 引脚保持活动状态。
SPI 主机完成对其中一个挂起中断的维护,并通过向其写入 1 来清除其 IRQ 位。INT 引脚提供另一个边沿,如步骤 (d) 所示。
SPI 主机完成对剩余中断请求的处理,并通过向其写入 1 来清除其 IRQ 位。没有挂起的中断,因此 INT 引脚返回到其非活动状态。
中断寄存器
表 1.阴影MAX3420E寄存器位控制中断系统
MAX3420E具有两组USB中断,由表1中的阴影寄存器控制。中断位分为EPIRQ (R11)和EPIEN (R12)中的端点控制,以及USBIRQ (R13)和USBIEN(R14)中的USB控制。全局 IE 位位于 CPUCTL 寄存器中。
位名 | 违约 | 位置 | 设置者 | 清除者 |
IN0BAVIRQ | 1 | EPIRQ.0 | EP0 先进先出可用于 μP 加载 | 加载 EP0BC 寄存器 |
OUT0DAVIRQ | 0 | EPIRQ.1 | EP0-OUT FIFO 具有主机数据 | 写入 EPIRQ = 0x02 |
OUT1DAVIRQ | 0 | EPIRQ.2 | EP1-OUT FIFO 具有主机数据 | 写入 EPIRQ = 0x04 |
IN2BAVIRQ | 1 | EPIRQ.3 | EP2-IN 先进先出可用于 μP 加载 | 加载 EP2INBC 寄存器 |
IN3BAVIRQ | 1 | EPIRQ.4 | EP3-IN 先进先出可用于 μP 加载 | 加载 EP3INBC 寄存器 |
SUDAVIRQ | 0 | EPIRQ.5 | 设置数据可在SUDFIFO中找到 | 写入 EPIRQ = 0x20 |
OSCOKIRQ | 0 | USBIRQ.0 | MAX3420E振荡器/PLL稳定 | 写入 USBIRQ = 0x01 |
RWUDNIRQ | 0 | USBIRQ.1 | SIE 已完成 RWU 信号 | 写入 USBIRQ = 0x02 |
BUSACTIRQ | 0 | USBIRQ.2 | 总线处于活动状态 | 写入 USBIRQ = 0x04 |
URESIRQ | 0 | USBIRQ.3 | 主机开始发出总线复位信号 | 写入 USBIRQ = 0x08 |
SUSPIRQ | 0 | USBIRQ.4 | 主机暂停总线 | 写入 USBIRQ = 0x10 |
NOVBUSIRQ | 0 | USBIRQ.5 | V总线比较器1-0过渡 | 写入 USBIRQ = 0x20 |
VBUSIRQ | 0 | USBIRQ.6 | V总线比较器0-1过渡 | 写入 USBIRQ = 0x40 |
URESDNIRQ | 0 | USBIRQ.7 | 主机完成信令总线复位 | 写入 USBIRQ = 0x80 |
表2给出了14个中断控制位,当MAXQ3420E内部逻辑设置它们时,以及SPI主机如何清除它们。
中断请求位
BAV 位
三个缓冲器 AVailable (BAV) IRQ 位表示 IN 端点 FIFO 可供 SPI 主站加载。MAX3420E在芯片复位或IN数据从端点缓冲器成功发送到主机时置位这些IRQ位。此 IRQ 告诉 SPI 主站缓冲区已准备好接受新数据。
图6.向终结点 3 发送 IN 请求的主机的总线跟踪。
图6为IN传输的总线走线,主机从MAX3420E请求数据。在数据包 7145 到达之前,SPI 主站将字节 00 00 08 加载到端点 3 IN FIFO (EP3INFIFO) 中。然后,SPI 主机写入值为 3 的 EP3INBC(端点 3 IN 字节计数)寄存器。写入字节计数寄存器可完成三件事:
当IN请求到达时,它告诉MAX3420E发送多少字节。
它使端点能够传输数据(而不是 NAKing)。
它清除EP3INBAV IRQ位。
MAX3420E用数据包3应答发往终端7146的下一个IN数据包。主机通过发送 ACKnowledge (ACK) 数据包 7147 来确认无差错地收到数据。当MAX3420E检测到主机ACK数据包时,设置EP3INBAV中断请求位,通知SPI主机终端FIFO可以加载新数据。
如果IN数据包在SPI主机布防终端之前到达,MAX3420E以NAK握手应答(图7)。NAK 握手告知主机稍后重试 IN 请求。
图7.如果MAX3420E尚未准备好发送数据,则发送NAK。
如果在向主机传输IN数据时出现错误,当主机重试IN请求时,MAX3420E自动重新发送数据(相同的数据切换DATA0/DATA1)。只有在收到主机的ACK握手后,MAX3420E才会置位终端的BAV IRQ位,以指示缓冲器已准备好接收新数据。
重要提示:
与所有MAX3420E IRQ位一样,三个BAV IRQ位也可以通过写入1来清除。
永远不要这样做。
相反,请使用上述方法:通过写入 IN 端点的字节计数寄存器来清除 BAV IRQ 位。这是因为MAX3420E使用IN端点的BAV中断请求位作为锁定机制。这种机制确保SPI主机和MAX3420E的串行接口引擎(SIE)永远不会同时尝试使用端点缓冲器。例如,如果清除了 BAV 位,然后在两个单独的指令中加载字节计数,则在更新字节计数寄存器时可能会进行数据包传输,并且数据将损坏。
BAV IRQ 默认值
三个 BAV IRQ 位(在表 1 的默认列中显示为 2)默认为 1s。这意味着SPI主机将在上电或复位后读取EPIRQ = 0x19。如果设置了任何相应的 IEN 位,INT 引脚将指示中断处于挂起状态。
双缓冲端点EP2输入
MAX3420E EP2-IN端点为双缓冲。这意味着它具有两组 64 字节 FIFO 和字节计数寄存器。双缓冲提高了传输带宽,因为SPI主站不需要等待一个数据包传输到主机,然后再加载另一个数据包。通过双缓冲,SPI主站可以在加载一个IN FIFO的同时加载另一个IN数据到主机。加载 EP2INBC 寄存器时,这两个缓冲区会“乒乓球”。这将另一个FIFO(第二组)和字节数寄存器提供给SPI主机。此双缓冲操作对固件是透明的。
双缓冲唯一可观察到的影响是在初始化时。IN2BAVIRQ 位在上电或芯片复位时置位。通常,您的初始化代码将数据加载到 EP2IN FIFO 中,然后加载 EP2INBC 寄存器以布防传输并清除 IN2BAVIRQ 位。当你这样做时,你可能会惊讶地发现MAX3420E立即重新确定IN2BAVIRQ位。这表示第二个缓冲器可供SPI主站加载。
DAV 中断请求位 OUT 端点具有数据可复制 (DAV) IRQ 位
,以指示已从主机接收到新数据。MAX3420E自动处理总线重试,仅在接收到无差错数据时才置位中断请求。当SPI主站收到DAV中断请求时,它会读取端点的字节计数寄存器以确定数据有效负载大小。然后,SPI 主站从端点的 OUTFIFO 读取该字节数。SPI 主机通过写入 1 以正常方式清除 OUTDAV IRQ 位。这会重新设置端点以接收下一个 OUT 数据包。
在图8中,主机发送一个OUT PID和3420字节数据,MAX1E将其传输到EP3420OUT FIFO。当MAX1E验证传输无差错时,更新其EP1OUTBC寄存器以指示四个字节,将ACK数据包发送回主机,并置位EP1OUTDAV IRQ,告诉SPI主站数据可在端点<> FIFO中检索。
图8.将 OUT 数据包发送到终结点 1 的主机的总线跟踪。
双缓冲端点EP1输出
MAX3420E EP1输出端为双缓冲,这意味着它具有两组64字节FIFOS和字节数寄存器。双缓冲意味着,如果另一个主机数据包正在等待,OUT1DAVIRQ 可以在 SPI 主站清除它后立即重新置言。
SUDAV中断请求位
当主机向MAX3420E发送控制传输时,MAX3420E将8个SETUP字节存储在<>字节FIFO中,SPI主机从SUDFIFO寄存器读取该字节。由于外设始终接受此缓冲区中的主机数据,因此 SUDAVIRQ 就像 OUT 端点 FIFO 一样,当来自主机的新数据可用时,会断言其 SUDAV IRQ。SETUP 数据包始终包含 <> 个字节,因此 SETUP 数据不需要字节计数寄存器。
OSCOK 中断请求位 当MAX3420E上电、退出芯片复位
或退出掉电状态时,内部振荡器和PLL需要时间启动和稳定。振荡器OK OK (OSCOK) IRQ表示MAX3420E已准备好工作。
图9.示例代码复位MAX3420E并等待OSCOK后退出。
图9是使用CHIPRES寄存器位复位MAX3420E的示例代码。由于芯片复位停止内部振荡器,代码通过设置CHIPRES = 0去除复位信号后,应等待振荡器稳定后再使用MAX3420E。
RWUDN 中断请求位
当处于挂起状态时,USB 外围设备可能会发出远程唤醒 (RWU) 信号,以告知主机恢复总线活动。USB 规范将远程唤醒信号定义为 1ms 至 15ms K 状态。SPI 主机通过将 SIGnal 远程唤醒 (SIGRWU) 位设置为 1 来启动 RWU 信令。
当SPI主机设置SIGRWU位时,MAX3420E等待5ms,驱动K状态10ms,然后置位远程唤醒DoNe中断请求(RWUDNIRQ)位。5ms 延迟可确保满足另一个 USB 要求:总线必须空闲(J 状态)至少 5ms,然后外设才会启动恢复信令。
图 10.发出远程唤醒信号的示例代码。
图 10 显示了发出远程唤醒信号的示例代码。注意,MAX3420E对信号进行倍增,并在完成后置位IRQ。MAX3420E对所有定时USB事件执行此操作,完成后提供中断,因此SPI主机无需定时信号间隔。
图10中的代码设置SIGRWU位,然后在RWUDNIRQ位上循环,以确定10ms信号何时经过。然后,它将SIGRWU = 0设置为<>并清除IRQ位。当然,在多任务SPI主站中,您将响应RWUDNIRQ中断请求,而不是浪费时间直接检查IRQ位。
SPI主机应在收到RWUDNITQ中断后5ms内关闭SIGRWU位。否则,MAX3420E启动另一个10ms K状态,并重复该序列(等待5ms、10ms、K状态),直到SIGRWU = 0。在 RWU 信令进行时设置 SIGRWU = 0 不会终止 RWU 信令。
当SPI主机设置SIGRWU = 3420时,如果MAX1E处于关断状态(PWRDOWN = 1),MAX3420E自动重启振荡器并等待振荡器稳定后再启动RWU信号。在这种情况下,SPI 主站不需要检查 OSCOK IRQ。
BUSACT 中断请求位 MAX23420E在检测到USB数据包开头的SYNC码型时设置BUSACT IRQ位
。USB 总线复位不被视为总线活动,因此不会激活 BUSACK 中断请求。
URES 和 URESDN 中断请求位
USB 主机通过驱动至少 50 毫秒的单端 zerO (SE0) 状态(D+ 和 D- 驱动低电平)来重置外设。MAX3420E在检测到2.5μs的SE0后,对USB RESet IRQ (URESIRQ)进行定位。然后,当主机完成复位信号时,它会断言 USB RESet DoNe IRQ (URESDNIRQ)。
由于SPI主机需要监测USB总线复位事件,MAX3420E在总线复位期间不会清除URESIE、URESDNIE或IE中断使能位。在总线复位期间,它会清除 EPIEN 和 USBIEN 寄存器中的所有其他中断使能位。
SUSP中断请求位
当MAX3420E检测到总线不活动3ms(恒定J状态)时,它触发SUSPend中断请求(SUSPIRQ)。如果使用MAX3420E的外设为总线供电,则必须进入低功耗状态,以最小化从V吸收的电流。总线.在这种情况下,SPI主机通过关断耗电外设,然后通过设置PWRDOWN = 3420将MAX1E置于低功耗模式。这将停止MAX3420E振荡器,使MAX3420E进入最低功耗状态。
值得一提的是两个编程说明:
清除SUSPIRQ位不会阻止中断在3ms后重新确认。为避免在总线挂起时重复挂起中断,请清除挂起 IEN 位,直到总线恢复信令。
内部挂起定时器逻辑由MAX3420E的内部振荡器计时。因此,如果关闭芯片(设置PWRDOWN = 1),然后尝试通过写入1来清除SUSPIRQ位,MAX3420E将不会清除该位。MAX3420E需要现已停止的内部时钟。
VBUS 和 NOVBUS 中断请求位
自供电外设可以检测是否已插入USB并使用这些中断供电。中断由内部VBUS比较器激活,该比较器将VBComp引脚电压与内部参考电压进行比较。它们是边缘敏感的,在施加VBUS电压(VBUSIRQ)或去除VBUS电压时断言(NOVBUSIRQ)。
总线供电的外围设备不需要检测VBUS,因为它是由VBUS供电的。这将释放VBComp引脚,以便用作通用输入。在此应用中,VBComp引脚没有内部拉电阻,因此应在VBComp针脚和VL之间连接拉电阻。
编程技巧
清除 IEN 位 芯片复位
在芯片复位期间清除所有 IE 位
。芯片复位定义为以下情况之一:
VLMAX3420E通电(上电复位)。
MAX3420E RES#引脚被驱动为低电平。
SPI 主站设置位 CHIPRES = 1。
总线复位 当MAX3420E检测到USB总线复位(总线不活动3ms)时,除<>位外,所有IE位
均被清除。SPI主机可能需要接受与总线复位相关的中断,以监视总线复位信号的状态。因此,以下 IE 位不受总线重置的影响:
URESIE
URESDNIE
IE(全局中断启用)
由于 USB 总线复位会清除大部分 IE 位,因此应组织控制固件,以便在总线复位完成后重新启用所需的中断。
清除 BAV 和 DAV IRQ 位
请记住,DAV IRQ 位以正常方式清除,方法是将 1 写入位。 BAV 位(用于 IN 端点)的清除方式不同,即通过写入字节计数寄存器。
注意:即使认为MAX3420E中断输出引脚称为INT引脚,它有时也可能具有负极性(例如电平模式)。
shenhbj:gt
-
微控制器
+关注
关注
48文章
7542浏览量
151316 -
电源
+关注
关注
184文章
17704浏览量
249963 -
usb
+关注
关注
60文章
7936浏览量
264483
发布评论请先 登录
相关推荐
评论