1. 项目概述与I2C总线核心价值
在嵌入式系统开发中,设备间的通信是构建复杂功能的基础。面对众多传感器、存储器和外设,如何用最少的硬件资源实现可靠、高效的数据交换,是每个工程师都要面对的挑战。I2C总线协议,正是为解决这一痛点而生的经典方案。它仅凭两根线——串行数据线(SDA)和串行时钟线(SCL),就能构建起一个支持多主机、多从机的通信网络,这种简洁与高效使其成为板级设备通信的事实标准。
我接触过不少通信协议,从UART、SPI到CAN,但I2C在系统复杂度与灵活性之间的平衡做得尤为出色。它的主从架构和基于地址的寻址方式,使得系统扩展变得异常简单:只需为每个新设备分配一个唯一地址,然后挂到总线上即可,无需增加额外的片选线。这对于PCB空间和引脚资源都极其宝贵的嵌入式设计来说,无疑是巨大的优势。然而,I2C的优雅背后,是一套精密的协同工作机制,尤其是当时钟线上出现多个“指挥官”(主机)时,系统如何避免混乱?当两个主机同时想发言时,谁先谁后?这些问题的答案,就藏在时钟同步与仲裁机制这两大核心原理之中。
理解这些机制,不仅仅是读懂协议手册,更是为了在调试时,当通信出现异常、数据发生错乱、或者从机无响应时,你能快速定位问题是出在硬件连接、时序配置,还是逻辑竞争上。本文将以德州仪器(TI)的TMS320F2837xS系列高性能微控制器为例,深入剖析其I2C模块的实现细节。我们将从最底层的时钟同步与仲裁机制讲起,一直深入到每个关键寄存器的配置位,并结合实际工程中的配置步骤、中断处理和调试技巧,为你呈现一份即学即用的I2C实战指南。无论你是正在评估通信方案,还是已经深陷I2C调试泥潭,相信这些从芯片手册和项目实践中提炼出的细节,都能给你带来直接的帮助。
2. I2C总线核心机制深度解析
2.1 时钟同步机制:总线上唯一的“心跳”
在单主机系统中,时钟由主机独占生成,一切井然有序。但I2C协议允许存在多个主机,这就带来了一个根本性问题:如果两个主机同时开始传输,它们的时钟频率和相位可能不同,SCL线上就会产生冲突的信号。I2C的巧妙之处在于,它利用SCL线的“线与”(Wired-AND)物理特性,天然地实现了时钟同步。
所谓“线与”,是指所有设备的SCL引脚都通过上拉电阻连接到高电平,且输出为开漏或集电极开路模式。任何设备都可以将线拉低(输出低电平),但只有当所有设备都释放总线(输出高阻态)时,线才能被上拉电阻拉高。这就形成了一条规则:低电平具有优先权。
当时钟同步发生时,过程是这样的:所有主机都在SCL线上产生自己的时钟信号。一旦某个主机(比如主机A)率先拉低了SCL线,由于“线与”特性,整条SCL线都会被拉低,所有其他主机(如主机B)都会检测到这个从高到低的跳变。此时,协议规定,所有主机必须从检测到下降沿的那一刻起,开始自己时钟的低电平周期。换句话说,最先拉低SCL的设备,为所有设备设定了低电平周期的开始时刻。
关键在于低电平周期的结束。每个主机内部都有一个计数器,决定其低电平的持续时间。当主机A的低电平计时结束时,它会尝试释放SCL线(输出高阻态)。但如果此时主机B的低电平计时还未结束,它仍然在驱动SCL为低,那么SCL线将保持低电平。主机A只能等待,直到检测到SCL线被释放为高电平后,才能开始自己的高电平周期。因此,同步后的SCL时钟,其低电平周期长度由所有主机中最长的那个决定,而高电平周期长度则由最快结束低电平、并最先开始高电平的那个主机决定。
这个过程带来了一个非常重要的副作用:时钟拉伸。如果一个从机设备处理数据较慢(例如,从EEPROM读取数据需要时间),它可以主动拉低SCL线,强制让高速的主机等待。主机在输出一个时钟脉冲后,会检查SCL是否被真正释放。如果发现SCL仍被拉低,主机就会进入等待状态,直到从机完成操作并释放SCL。这种机制使得不同速度的设备可以安全地共享同一条总线,高速的MCU可以迁就低速的传感器,而无需复杂的超时或重试逻辑。在实际配置TMS320F2837xS的I2C模块时,你需要通过I2CCLKL和I2CCLKH寄存器来分别设置时钟的低电平和高电平分频值,最终的SCL频率由公式F_{SCL} = F_{module} / ( (I2CCLKL + d) + (I2CCLKH + d) )决定,其中d是取决于预分频器的调整因子。务必注意,这两个寄存器值必须为非零,否则无法产生正确的时钟。
2.2 仲裁机制:总线上的“文明谦让”
时钟同步解决了“步伐一致”的问题,但还没解决“谁先说话”的问题。当两个或更多主机几乎同时发起传输时,仲裁机制就开始发挥作用了。仲裁的目标是,在不破坏任何正在进行的数据传输的前提下,只让一个主机赢得总线控制权,其他主机退出并转为监听模式。
仲裁完全依赖于SDA线上的数据。在起始条件(START)之后,每个主机开始逐位发送地址和数据。I2C总线规定,SDA线上的数据必须在SCL高电平期间保持稳定。仲裁过程就发生在SCL高电平期间,每个主机在发送一位后,会同时回读SDA线的状态,并与自己发送的值进行比较。
核心规则是:发送“1”(释放SDA线为高)的主机,如果检测到SDA线为低(被其他主机拉低),则立即判定自己仲裁失败。因为“线与”特性下,低电平覆盖高电平。这意味着,发送二进制值更小的设备(即更早出现‘0’)将赢得仲裁。例如,主机A发送地址0x68(二进制0110 1000),主机B发送地址0x72(二进制0111 0010)。在前6位(0110 1-)它们都相同。到了第7位,A发送0,B发送1。当B发送1(释放SDA)但检测到SDA线被A拉低为0时,B就知道自己输了,它会立即关闭其SDA输出驱动器,转为从机接收模式,并监听后续数据。获胜的主机A则完全察觉不到总线上的竞争,继续它的传输。
在TMS320F2837xS的I2C模块中,仲裁失败会触发一系列硬件自动操作:模块会将模式寄存器(I2CMDR)中的主模式位(MST)和停止条件位(STP)清零,自身切换为从机-接收器模式。同时,状态寄存器(I2CSTR)中的仲裁丢失标志位(ARBL)会被置位。如果中断使能寄存器(I2CIER)中的ARBL位已使能,还会产生一个仲裁丢失中断。在中断服务程序中,你可以通过读取中断源寄存器(I2CISRC)来确认中断原因,并进行相应的错误处理,例如记录日志或重新发起传输。
这里有三个重要的边界情况需要注意,仲裁不允许在以下情况之间发生:
- 重复起始条件(Repeated START)与数据位之间。
- 停止条件(STOP)与数据位之间。
- 重复起始条件与停止条件之间。 这意味着仲裁只在完整的数据帧(包括地址和数据字节)传输期间进行。一旦主机发出了重复起始或停止条件,总线状态就确定了,不再进行仲裁比较。这保证了总线状态转换的确定性。
2.3 数字回环模式:无需连线的自我验证
在硬件开发初期,或者进行固件自测试时,可能还没有实际的外部I2C设备可供连接。此时,TMS320F2837xS的I2C模块提供的数字回环模式就成了一项极其宝贵的功能。通过将模式寄存器(I2CMDR)中的DLB位置1,即可启用该模式。
在此模式下,模块内部的信号路径被重定向。从数据发送寄存器(I2CDXR)写出的数据,不会真的送到SDA引脚上,而是经过一个内部延迟路径后,直接送入数据接收寄存器(I2CDRR)。这个延迟周期数n = 8 * (SYSCLK) / (I2C模块时钟频率)。同时,发送时钟也直接作为接收时钟使用。外部SDA引脚上出现的地址,则是自身地址寄存器(I2COAR)中的值。
数字回环模式的巨大价值在于,它允许你在不焊接任何外部器件、甚至不连接任何导线的情况下,完整地测试I2C模块的发送、接收、中断生成、FIFO操作等所有软件功能。你可以编写代码,让MCU作为主机发送一串数据,然后立刻以从机身份接收,并验证数据是否正确。这能有效排除硬件连接问题,将调试焦点集中在驱动程序和配置逻辑上。但务必记住一个限制:自由数据格式(I2CMDR.FDF = 1)在数字回环模式下不被支持。这意味着测试时必须使用标准的7位或10位地址格式。
3. TMS320F2837xS I2C模块配置与操作详解
3.1 关键功能寄存器精讲
要驾驭TMS320F2837xS的I2C模块,必须对其寄存器了如指掌。这些寄存器是软件与硬件沟通的桥梁,每一个比特位的状态都直接影响着总线的行为。
3.1.1 模式寄存器(I2CMDR)—— 模块的大脑
I2CMDR寄存器控制着I2C模块的全局行为模式,是配置的核心。
IRS位:这是模块的总开关。任何配置操作都必须在IRS=0(模块复位)的状态下进行。配置完成后,将IRS置1以启用模块。在调试时,如果遇到总线锁死或状态异常,将IRS清零再置1是最直接的软复位方法。MST/TRX位:这两个位决定了模块的角色。MST=1为主模式,MST=0为从模式。在主模式下,TRX=1为发送器,TRX=0为接收器。注意,在从模式下,TRX位由接收到的主机读/写命令决定,软件通常只读。BC[2:0]位:设置数据字节的位数(1-8位)。这是一个容易忽略但至关重要的配置。必须确保主从双方的数据位宽设置一致。例如,与一个只支持7位数据(某些老式设备)的从机通信时,需要设置BC=7。写入I2CDXR的数据必须右对齐。STT/STP位:主模式下,由软件置位STT来产生起始条件,置位STP来产生停止条件。硬件会在操作完成后自动清除这些位。一个常见的坑是:在非重复模式(RM=0)下,必须至少传输一个字节后才能产生停止条件。同时,硬件会延迟清除STP位,直到状态寄存器中的SCD(停止条件检测)位被置位。安全的做法是,在设置STP=1后,等待SCD=1,再开始下一次传输。RM位:重复模式。当RM=1时,模块会忽略数据计数寄存器(I2CCNT)的值,持续传输数据,直到软件手动设置STP=1。这在流式数据传输(如读取传感器连续数据)时非常有用,可以配合FIFO和中断,实现高效的数据搬运。
3.1.2 时钟与数据寄存器 —— 通信的脉搏与内容
I2CPSC、I2CCLKL、I2CCLKH:这三个寄存器共同决定SCL时钟频率。I2CPSC用于对输入时钟进行预分频,得到模块时钟:F_{module} = F_{input} / (IPSC + 1)。然后,模块时钟再通过I2CCLKL和I2CCLKH分频产生最终的SCL高低电平时间。修改这三个寄存器的值,必须在IRS=0时进行,否则更改无效。I2CDXR与I2CDRR:分别是数据发送和接收寄存器。写入I2CDXR的数据会被硬件自动搬移到发送移位寄存器(I2CXSR)并串行发出。从SDA线接收到的数据,在接收移位寄存器(I2CRSR)中组装成一个字节后,会被搬移到I2CDRR供CPU读取。当使能FIFO模式后,这两个寄存器将作为FIFO的访问端口。I2CSAR与I2COAR:I2CSAR存储主模式时要访问的从机地址。I2COAR存储本设备作为从机时的自身地址。注意地址模式由I2CMDR.XA位决定:XA=0为7位地址模式,此时只使用寄存器的低7位,高3位应写0。
3.1.3 状态与中断寄存器 —— 系统的耳目
I2CSTR:状态寄存器,实时反映模块状态。例如,RRDY=1表示I2CDRR有新数据可读;XRDY=1表示I2CDXR已空,可以写入新数据;ARDY=1表示地址、数据、命令等寄存器已就绪,可被访问;NACK=1表示未收到从机应答;ARBL=1表示仲裁丢失。ARDY、RRDY、XRDY这三个标志位比较特殊:它们不会因为读取I2CISRC寄存器而被清除,必须通过向该位写1来手动清除。I2CIER:中断使能寄存器。你可以根据需要使能特定的中断源,例如使能RRDYINT以便在收到数据时触发中断,而不是不断轮询RRDY位。I2CISRC:中断源寄存器。当发生I2C中断时,CPU读取此寄存器可以知道是哪个具体事件触发的。读取操作会自动清除该中断源标志(ARDY、RRDY、XRDY除外)并更新为下一个最高优先级的中断代码。中断优先级从高到低依次为:仲裁丢失、无应答、寄存器就绪、接收就绪、发送就绪、停止条件检测、被寻址为从机。
3.2 FIFO模式配置与使用技巧
TMS320F2837xS的I2C模块集成了深度为16的发送和接收FIFO,这能极大减轻CPU的中断负担,提升数据传输效率。
3.2.1 启用与配置FIFO
首先,必须通过设置I2CFFTX寄存器的I2CFFEN位为1来全局使能FIFO功能。然后,分别通过TXFFRST和RXFFRST位来复位并使能发送和接收FIFO。
关键配置项是中断触发水平(TXFFIL和RXFFIL)。对于发送FIFO,当FIFO中剩余的数据量(TXFFST)小于或等于TXFFIL设定的值时,会触发发送FIFO中断(TXFFINT),提示CPU需要补充数据。对于接收FIFO,当FIFO中累积的数据量(RXFFST)大于或等于RXFFIL设定的值时,会触发接收FIFO中断(RXFFINT),提示CPU来读取数据。你可以根据数据块大小和系统实时性要求来灵活设置这个水平值。例如,如果你每次传输32字节,可以将接收FIFO中断水平设为16,这样在收到一半数据时就会产生中断,CPU有足够的时间在FIFO满之前将数据取走,避免溢出。
3.2.2 使用FIFO时的注意事项
- 模式切换:一旦使能FIFO模式(
I2CFFEN=1),就不能再使用XRDY和RRDY这类非FIFO中断,而应使用TXFFINT和RXFFINT。寄存器描述中明确指出了这一点。 - 初始中断问题:有一个硬件细节需要注意。当FIFO使能且I2C模块退出复位(
IRS从0变1)时,如果TXFFST(发送FIFO状态)为0(空),且TXFFIL也为0(默认值),那么条件“TXFFST<=TXFFIL”立即成立,会导致TXFFINT标志被立即置位,从而可能产生一个不必要的初始中断。为了避免这个问题,安全的做法是:在使能FIFO和模块后,立即向TXFFINTCLR位写1,以清除这个可能产生的伪中断标志。对于接收FIFO,则建议在设置RXFFRST位使能FIFO的同一指令或之前,就配置好RXFFIL的值,避免因默认值0导致立即中断。 - 数据搬运:在FIFO模式下,你只需连续向
I2CDXR写入数据,或从I2CDRR读取数据。硬件会自动管理FIFO指针。��中断服务程序中,你需要检查TXFFST或RXFFST来确定当前FIFO中的数据量,并进行批量操作。
3.3 完整的主机发送流程示例
假设我们需要配置TMS320F2837xS的I2CA模块作为主机,向地址为0x50的EEPROM发送3个字节数据{0x01, 0x02, 0x03}。以下是基于寄存器直接操作的步骤和代码思路:
- 引脚复用与初始化:首先通过GPIO复用功能寄存器,将对应的SDAA和SCLA引脚配置为I2C功能。
- 模块复位与基础配置:
// 1. 将模块置于复位状态,以便安全配置 I2caRegs.I2CMDR.bit.IRS = 0; // 2. 配置时钟(假设系统时钟SYSCLK为100MHz,目标I2C时钟为400kHz) // 先配置预分频器,得到模块时钟。假设取IPSC=9,则 Fmod = 100MHz / (9+1) = 10MHz I2caRegs.I2CPSC.all = 9; // 再配置高低电平分频器。标准模式下,高低电平时间需>=4us。 // 计算:10MHz周期为0.1us。要得到4us低电平,I2CCLKL = 4us / 0.1us - d。d值需查手册,假设为7。 // 则 I2CCLKL = 40 - 7 = 33。同理设置I2CCLKH。 I2caRegs.I2CCLKL = 33; I2caRegs.I2CCLKH = 33; // 3. 配置自身地址(从机模式下使用,此处可随意设置,如0x00) I2caRegs.I2COAR.all = 0x00; // 4. 配置模式:主模式、发送器、7位地址、非重复模式、8位数据 I2caRegs.I2CMDR.all = 0x0000; // 先清零 I2caRegs.I2CMDR.bit.BC = 0; // 8 bits per byte I2caRegs.I2CMDR.bit.XA = 0; // 7-bit addressing I2caRegs.I2CMDR.bit.TRX = 1; // Transmitter I2caRegs.I2CMDR.bit.MST = 1; // Master I2caRegs.I2CMDR.bit.IRS = 1; // 最后,使能模块! - 启动传输:
在实际项目中,强烈建议使用中断或FIFO中断来管理数据传输,而不是忙等待。可以将// 1. 设置目标从机地址 I2caRegs.I2CSAR.all = 0x50; // 2. 设置要发送的数据字节数 I2caRegs.I2CCNT = 3; // 3. 将要发送的数据写入数据寄存器 I2caRegs.I2CDXR = 0x01; // 可以等待XRDY位或ARDY位,但更高效的方式是使用中断或FIFO。 // 这里以轮询ARDY为例,等待第一个数据字节和地址被处理。 while(I2caRegs.I2CSTR.bit.ARDY == 0); // 4. 设置STT位,产生START条件,开始传输 I2caRegs.I2CMDR.bit.STT = 1; // 5. 继续写入剩余数据,并等待传输完成 I2caRegs.I2CDXR = 0x02; while(I2caRegs.I2CSTR.bit.ARDY == 0); I2caRegs.I2CDXR = 0x03; // 等待所有数据发送完毕,且ARDY就绪 while(I2caRegs.I2CSTR.bit.ARDY == 0); // 6. 设置STP位,产生STOP条件,结束本次传输 I2caRegs.I2CMDR.bit.STP = 1; // 等待STOP条件真正在总线上产生 while(I2caRegs.I2CSTR.bit.SCD == 0);ARDYINT或TXFFINT使能,在中断服务程序中写入下一个数据或处理结束流程。
4. 实战问题排查与调试经验
4.1 常见故障现象与诊断思路
即使按照手册配置,I2C通信也常常会遇到问题。以下是一些典型现象和我的排查步骤:
现象一:总线死锁,SCL线被持续拉低。
- 可能原因1:从机正在进行时钟拉伸(Clock Stretching),但主机代码没有等待SCL释放的机制。有些主机驱动库在产生时钟脉冲后,不会检查SCL是否被从机拉低,而是直接进入下一个周期。
- 排查:用示波器或逻辑分析仪观察SCL和SDA线。如果SCL长时间为低,且主机已停止驱动,则很可能是某个从机在拉伸时钟。检查从机设备(如传感器、EEPROM)的时序要求,看其是否需要额外的处理时间。在主机软件中,确保在发送每个时钟脉冲后,有检测SCL状态的逻辑。
- 可能原因2:仲裁过程中出现异常,导致某个主机未能正确释放总线。
- 排查:检查多主机系统中的仲裁逻辑。在TMS320F2837xS上,可以检查
I2CSTR.ARBL标志是否被置位。如果频繁仲裁丢失,可能需要优化各主机的总线访问策略,或检查硬件上拉电阻是否合适(阻值太大会导致上升沿过慢,影响仲裁检测)。
现象二:主机发送地址后,收不到从机的应答(NACK)。
- 可能原因1:从机地址错误。这是最常见的原因。7位地址和8位读写位容易混淆。注意,主机发送的第一个字节是7位地址+1位读写方向(0写,1读)。例如,访问地址为0x50的EEPROM进行写操作,主机应发送
0xA0(0x50 << 1 | 0)。 - 排查:用逻辑分析仪抓取第一个字节,确认地址和读写位是否正确。检查
I2CSAR寄存器的设置。 - 可能原因2:从机设备不存在、未上电或损坏。
- 排查:测量从机设备的电源和地。检查I2C总线的上拉电阻(通常4.7kΩ)是否已正确连接。尝试用该从机的地址进行“通用呼叫”(地址0x00),看是否有应答。
- 可能原因3:总线时序不满足从机要求。速度太快,或高低电平时间不足。
- 排查:降低SCL频率(增大
I2CCLKL和I2CCLKH的值)。用示波器测量SCL频率、高低电平时间,与从机器件手册中的最小值要求对比。
- 可能原因1:从机地址错误。这是最常见的原因。7位地址和8位读写位容易混淆。注意,主机发送的第一个字节是7位地址+1位读写方向(0写,1读)。例如,访问地址为0x50的EEPROM进行写操作,主机应发送
现象三:数据读写错误,收到的数据与发送的不符。
- 可能原因1:主从双方数据位宽(
BC设置)不一致。主机按8位发送,从机可能按7位解析。 - 排查:核对双方设备的数据格式。确保
I2CMDR.BC设置正确。 - 可能原因2:FIFO模式下,中断水平设置不当导致数据溢出或取空。
- 排查:检查
TXFFST和RXFFST的状态。如果接收FIFO满了(RXFFST=16)但CPU未及时读取,会导致RSFULL标志置位,新数据丢失。同样,如果发送FIFO空了(TXFFST=0)但CPU未及时填充,会导致XSMT标志置位,可能重复发送旧数据。调整TXFFIL和RXFFIL,优化中断触发时机。 - 可能原因3:电源噪声或信号完整性差,导致位跳变误判。
- 排查:观察SDA和SCL波形,看上升沿/下降沿是否陡峭,是否有过冲、振铃或毛刺。可以尝试减小通信速率,或在信号线上串联小电阻(如22Ω-100Ω)来阻尼反射。
- 可能原因1:主从双方数据位宽(
4.2 调试工具与技巧
- 逻辑分析仪是你的最佳伙伴:一个支持I2C协议解码的逻辑分析仪(如Saleae)能直观地显示起始、停止、地址、数据、ACK/NACK位,极大提升调试效率。没有逻辑分析仪时,可以用示波器的双通道模式,同时观察SCL和SDA,手动分析波形。
- 充分利用数字回环模式:在硬件焊接完成前,或怀疑硬件有问题时,首先在
DLB=1模式下测试软件。如果数字回环测试通过,但连接实际设备失败,问题大概率出在硬件或外部设备上。 - 状态寄存器是诊断窗口:发生通信错误时,第一时间读取
I2CSTR寄存器。NACK、ARBL、AL、RSFULL、XSMT这些标志位直接指明了错误类型。 - 中断服务程序要精简高效:I2C总线对时序敏感,中断服务程序应尽可能快地处理标志位、读写数据,然后退出。避免在I2C中断中进行复杂计算或长时间操作。如果需要处理大量数据,可以考虑使用DMA(如果芯片支持)或在主循环中处理,中断只负责设置标志。
- 上拉电阻的选择:总线的上升时间由RC常数决定(R是上拉电阻,C是总线电容)。电阻值太小(如1kΩ)会增加功耗,且在多个设备争抢低电平时可能无法拉低;电阻值太大(如10kΩ)会导致上升沿过慢,在高速模式下可能无法满足时序要求。通常3.3V系统下,4.7kΩ是一个不错的起点。如果总线较长、设备较多(总线电容大),可能需要减小电阻值,如使用2.2kΩ。
4.3 软件设计建议与避坑指南
- 超时机制��不可少:任何等待状态寄存器(如
ARDY、RRDY)或总线状态(如BB)的循环,都必须添加超时退出机制。否则,一旦从机无响应或总线异常,程序将永远卡死。uint32_t timeout = MAX_TIMEOUT_COUNT; while((I2caRegs.I2CSTR.bit.ARDY == 0) && (timeout > 0)) { timeout--; } if(timeout == 0) { // 超时处理:复位I2C模块、记录错误、尝试恢复等 I2caRegs.I2CMDR.bit.IRS = 0; // 复位模块 DELAY_US(100); I2caRegs.I2CMDR.bit.IRS = 1; return ERROR_TIMEOUT; } - 正确处理重复起始条件:在复合格式中(如先写寄存器地址,再读数据),需要在两次传输之间发送重复起始条件(Repeated START),而不是停止条件。在TMS320F2837xS上,这可以通过在第一次传输完成(
ARDY置位)后,不设置STP,而是直接设置新的从机地址和R/W位,然后再次设置STT位来实现。 - 注意10位地址模式:如果使用10位地址(
XA=1),地址传输需要两个字节。第一个字节是11110xx加上地址的最高两位,其中xx是读写位。第二个字节是地址的低8位。从机在收到第一个字节后,会像7位地址一样回复ACK。主机软件需要处理好这个双字节地址的发送流程。 - 电源管理与唤醒:在低功耗应用中,I2C模块可以被关闭以省电。但要注意,当I2C作为从机被唤醒时,总线上的起始条件可能是一个唤醒源。需要配置好相应的中断,确保模块在唤醒后能及时响应。