深入解析RA8M2 IIC从机操作:SCL同步、SDA延时与噪声滤波实战
1. 项目概述与I2C核心价值在嵌入式系统开发中I2CInter-Integrated Circuit总线协议因其简洁的两线制串行数据线SDA和串行时钟线SCL和强大的多主多从能力成为了连接各类低速外设的首选方案。无论是读取传感器数据、配置外设寄存器还是与EEPROM进行数据交换I2C都扮演着不可或缺的角色。然而在实际项目中尤其是在复杂的多主系统或对时序要求严苛的SMBus应用中仅仅理解I2C的基础读写时序是远远不够的。开发者常常会遇到诸如总线竞争导致时钟拉低、从机响应不及时造成数据丢失或者因环境噪声引发通信错误等棘手问题。瑞萨电子的RA8M2微控制器集成的IIC模块远不止是一个简单的I2C协议控制器。它内置了诸如SCL同步、可编程SDA输出延时和数字噪声滤波等高级硬件机制这些正是解决上述工程难题的关键。本文将深入RA8M2 IIC模块的从机操作内核不仅拆解从机发送和接收的标准流程更将重点放在这些高级功能的原理、配置和实战应用上。我会结合手册中的时序图与寄存器操作解释每一个关键步骤背后的硬件行为并分享在调试多主通信、满足SMBus规范以及提升抗干扰能力时如何精准地配置这些功能。无论你是正在调试RA8M2上的I2C通信还是希望深入理解现代I2C控制器的高级特性以优化系统设计这篇文章都将提供从理论到实践的完整参考。2. RA8M2 IIC从机操作核心流程拆解理解从机操作是掌握I2C总线仲裁、错误恢复等高级特性的基础。RA8M2的IIC模块作为从设备时其行为完全由主设备发起的时钟和数据驱动但内部状态机的转换、中断的触发以及数据的缓冲管理则需要开发者通过寄存器精准控制。2.1 从机发送Slave Transmit操作详解从机发送模式指主设备读取从设备数据的过程。根据手册流程图Figure 39.15和时序图其核心状态迁移围绕几个关键标志位展开地址匹配标志AASy、发送数据空标志TDRE、传输结束标志TEND、无应答标志NACKF和停止条件标志STOP。操作流程与硬件协同初始化与待命完成IIC模块的基本初始化设置时钟频率、使能模块等后从机进入待命状态持续监听总线上的地址帧。此时ICSR2.TDRE通常为1发送数据寄存器空但ICCR2.TRS位为0表示处于接收模式。地址匹配与模式切换当总线上的7位或10位从机地址与SARy寄存器匹配且R/W#位为1读时硬件在SCL第9个时钟的上升沿自动完成两件大事一是设置对应的AASy标志二是将ICCR2.TRS位和ICSR2.TDRE标志同时置1。TRS1意味着模块硬件上已切换到发送模式TDRE1则触发发送数据空中断如果使能通知CPU需要准备数据。数据写入与发送在中断服务程序或轮询中检测到TDRE1后应立即将待发送数据写入ICDRT寄存器。写入后TDRE被清零。硬件会在后续的SCL时钟节拍中自动将ICDRT中的数据移位到SDA线上。这里有一个关键细节必须在当前字节的ACK周期第9个SCL时钟结束前将下一个字节的数据写入ICDRT否则总线会因从机未准备好而进入等待SCL被拉低。传输结束处理传输结束有两种情况主设备发送NACK当主设备读取到所需数据后会在最后一个数据字节的第9个时钟周期回复NACK高电平。此时IIC模块会设置NACKF标志。根据手册若ICFER.NACKE位为1模块在检测到NACK后会暂停后续数据传输。正常结束当开发者写入最后一个数据字节后需要等待TEND标志置1。TEND1表示最后一个字节的数据包括ACK/NACK位已经完成在总线上的传输。SCL释放与后续清理在NACKF或TEND标志置1后必须进行一次对ICDRR寄存器的“哑读”Dummy Read。这个操作非常关键其作用是通知硬件释放内部可能正在拉低的SCL线见图39.17中“Dummy read ICDRR”的标注使总线恢复正常。随后当检测到停止条件STOP时硬件会自动清零AASy、TDRE、TEND、TRS等标志模块切回从机接收模式。最后软件需手动清除NACKF和STOP标志为下一次传输做准备。实操心得从机发送最常见的坑是“SCL被意外拉低导致主设备超时”。这通常源于步骤5的哑读操作缺失或时机不对。务必在TEND或NACKF置位后、进行任何可能改变模块模式的操作前执行ICDRR的读取。另一个要点是数据写入的及时性建议在TDRE中断中立即写入下一字节数据避免主设备等待。2.2 从机接收Slave Receive操作详解从机接收模式指主设备向从设备写入数据。其流程与发送类似但核心标志是接收数据满标志RDRF。操作流程与“哑读”机制初始化与地址匹配初始化后等待地址匹配。当匹配的地址帧中R/W#位为0写时硬件在SCL第9个时钟上升沿置位AASy和RDRF标志。RDRF1触发接收数据满中断。首次“哑读”地址进入中断后首先要进行一次哑读操作读取ICDRR寄存器。在7位地址格式下这次读出的值是“7位从机地址 R/W#位”在10位地址格式下读出的是地址的低8位。这个操作的目的同样是释放SCL线。因为在地址匹配后硬件可能会自动拉低SCL称为自动低电平保持Automatic low hold以等待CPU读取地址信息防止错过后续数据。哑读后RDRF被清零。循环接收数据随后主设备开始发送数据字节。每接收完一个字节第8位后硬件会再次置位RDRF。软件需在下一个字节的传输周期内读取ICDRR获取数据并清零RDRF。如果读取ICDRR的速度过慢导致下一个字节的传输已经开始而RDRF仍为1硬件会再次拉低SCL线等待直到读取操作完成。停止条件处理检测到停止条件STOP1时如果RDRF也为1说明最后一个数据字节还未读取必须完成读取。之后硬件自动清零AASy等标志。软件最后需手动清除STOP标志。注意事项从机接收模式下的“哑读”操作是理解RA8M2 IIC工作机制的关键。它并非无用操作而是硬件流控的一部分。忽略首次哑读会导致SCL被持续拉低通信卡死。在10位地址模式下流程更为复杂需要处理两次地址帧但“哑读”释放SCL的核心原则不变。2.3 关键状态标志与中断策略高效可靠的从机驱动离不开对状态标志的精准管理。下面这个表格梳理了在发送和接收模式中最需要关注的几个核心标志位及其含义标志位寄存器全称与含义发送模式下的关键作用接收模式下的关键作用清除方式AASy (ICSR1)Address As Slave (y0~2)从机地址匹配指示本次通信是由匹配的地址y触发并标志传输开始。同左标志接收开始。检测到停止条件后硬件自动清零。TDRE (ICSR2)Transmit Data Register Empty发送数据寄存器空核心标志。为1时表示可以写入下一个数据到ICDRT。写入后硬件清零。在从机发送模式下由硬件置1接收模式下无关。写入ICDRT后硬件清零或模式切换时硬件清零。RDRF (ICSR2)Receive Data Register Full接收数据寄存器满在从机发送模式下无关。核心标志。为1时表示ICDRR中有新数据地址或数据可读。读取后硬件清零。读取ICDRR后硬件清零。TEND (ICSR2)Transmit END传输结束为1时表示最后一个字节包括ACK/NACK已发送完毕。之后需哑读ICDRR。在从机接收模式下无关。检测到停止条件或模式改变时硬件自动清零。NACKF (ICSR2)NACK Flag无应答标志主设备回复NACK时置1表示主设备不再要求数据。之后需哑读ICDRR。从机在接收数据时若想发出NACK可设置ACKBT位此标志不用于此。软件写0清零。STOP (ICSR2)STOP condition detected停止条件检测检测到总线停止条件时置1。标志本次传输会话结束。同左标志本次传输会话结束。软件写0清零。BBSY (ICCR2)Bus BUSY总线忙指示总线正处于通信中从START到STOP之间。可用于监控总线状态。同左。由总线状态硬件自动控制。中断配置建议对于从机应用通常使能以下中断发送中断 (IICn_TXI)由TDRE触发。在中断服务程序中写入发送数据。接收中断 (IICn_RXI)由RDRF触发。在中断服务程序中读取接收数据并注意首次的哑读操作。停止条件中断 (IICn_SPI)由STOP触发。用于检测传输结束进行资源清理和标志复位。NACK检测中断 (IICn_NAKI)如果需要特别处理主设备发送NACK的情况可以启用。采用“中断驱动状态机”的设计是最佳实践。例如在从机发送中TXI中断用于填充数据SPI或NAKI中断用于处理传输结束和SCL释放。3. SCL同步电路多主竞争下的时钟仲裁机制在单主系统中SCL时钟由主设备独家控制时序简单。但在多主系统中当两个或以上主设备同时发起传输时就会发生总线仲裁。除了常见的SDA线仲裁谁先输出低电平谁赢SCL线的同步也至关重要它确保了所有参与竞争的主设备能在统一的时钟节拍下进行仲裁和数据传输。3.1 SCL同步的工作原理RA8M2的SCL同步电路是一个纯硬件机制其核心思想是“线与”逻辑和周期对齐。I2C总线的SCL线是开源输出任何设备都可以将其拉低。SCL同步正是利用了这一特性。工作流程解析高电平计数与监听当RA8M2作为主设备驱动SCL高电平时它并不是简单地输出一个固定时长的高电平。相反它在检测到SCL线上升沿后启动一个计数器开始对ICBRH寄存器设定的高电平周期进行计数。与此同时它持续监听SCL线的实际电平。外部拉低介入如果在计数期间另一个主设备也将SCL拉低因为它也在尝试驱动时钟那么RA8M2会立即检测到这个下降沿。同步动作一旦检测到外部拉低RA8M2会立刻执行三步操作停止当前计数停止对高电平周期的计数。加入拉低主动驱动SCL线为低电平实际上由于是“线与”它只是维持低电平状态。开始低电平计数转而启动对ICBRL寄存器设定的低电平周期进行计数。低电平释放与对齐当RA8M2自身的低电平计数结束时它会释放SCL线停止驱动低电平。但如果另一个主设备设定的低电平周期更长SCL线将由于该设备的持续驱动而保持低电平。只有当所有主设备都完成各自的低电平计数并释放SCL线后SCL线才会通过上拉电阻回到高电平。产生同步时钟随后所有主设备又会在检测到这个上升沿后开始各自的高电平计数。如此循环最终总线上的SCL时钟的高电平周期等于所有主设备中设定最短的高电平周期而低电平周期等于所有主设备中设定最长的低电平周期。这个过程在图39.21中得到了清晰展示当“其他主设备的低电平输出”出现时本机的“高电平周期计数”被中断转而开始“低电平周期计数”从而实现时钟同步。3.2 工程意义与配置要点这个机制保证了在多主竞争时总线依然能产生一个所有设备都能接受的、统一的SCL时钟避免因时钟不同步导致的数据错位。要使能此功能必须将ICFER寄存器中的SCLE位设置为1。配置与避坑指南速率一致性参与多主通信的所有设备其ICBRH和ICBRL的设定值应尽可能相同以确保同步后的时钟频率接近预期值。如果差异过大同步后的实际通信速率会显著低于单个主设备的设定速率。时钟精度SCL同步依赖于对SCL边沿的精确检测。总线电容、上拉电阻强度以及数字噪声滤波器的设置都会影响边沿检测的及时性。在高速模式如400kHz或1MHz下需要更精细地调整这些参数。与超时功能的权衡SCL同步可能导致SCL低电平期被意外拉长。如果你的应用同时使能了超时检测功能ICMR3.TMOE需要合理设置超时阈值避免因同步等待而误触发超时错误。实操心得在调试多主系统时如果发现通信速率远低于设定值或者偶尔出现超时首先应该检查SCL同步是否被意外使能SCLE1并确认各主设备的比特率设置。可以使用逻辑分析仪捕获SCL波形观察其高电平和低电平的实际宽度与理论值进行对比这是诊断同步问题最直接的方法。4. SDA输出延时功能满足严苛时序规范的利器在高速I2C或兼容SMBus的应用中数据保持时间tHD;DAT是一个容易违反的时序参数。它要求数据在SCL时钟下降沿之后必须继续保持稳定一段时间SMBus规范要求至少300ns。如果从设备的数据变化太靠近SCL下降沿主设备可能无法稳定采样。4.1 延时功能的工作原理RA8M2的SDA输出延时功能就是为了精确解决这个问题而设计的。它允许开发者将SDA引脚上的所有输出信号包括起始条件S、重复起始条件Sr、停止条件P、数据位以及ACK/NACK位相对于SCL的下降沿进行延迟。机制剖析触发与计数该功能在检测到SCL的下降沿时触发。延时的时间长度由ICMR2寄存器中的SDDL[2:0]位控制。DLCS位用于选择延时计数器的时钟源可以是IIC模块的内部基准时钟IICφ也可以是IICφ/2。延迟输出计数器开始对设定的周期数进行计数。在计数期间SDA引脚保持原状态不输出新数据。只有当计数达到设定值时IIC模块才将新的电平值输出到SDA线上。覆盖范围此延时作用于所有由本机驱动的SDA输出阶段。如图39.22所示无论是在主模式还是从模式发送数据还是接收后回复ACK输出的变化点都被统一延迟了。4.2 如何计算与配置延时值延时时间的计算公式为tSDADELAY (SDDL[2:0] 设定值) * tIICφ当DLCS0时 或tSDADELAY (SDDL[2:0] 设定值) * 2 * tIICφ当DLCS1时其中tIICφ是IIC模块的输入时钟周期即PCLKB的周期。配置步骤与示例假设系统PCLKB 100MHztIICφ 10ns需要满足SMBus的300ns最小数据保持时间要求。评估固有延迟首先需要知道在不使能该功能时从SCL下降沿到SDA实际变化之间的固有延迟。这包括数字噪声滤波器的延迟如果使能和GPIO本身的翻转延迟。这部分需要通过测量或查阅数据手册估算假设为100ns。计算需补偿的延迟所需总延迟 规范要求 - 固有延迟 300ns - 100ns 200ns。选择时钟源与配置值若选择DLCS0IICφ时钟则所需计数周期 200ns / 10ns 20个周期。但SDDL[2:0]最大值为7对应8个周期无法满足。此路不通。若选择DLCS1IICφ/2时钟此时钟周期为20ns。所需计数周期 200ns / 20ns 10个周期。SDDL[2:0]最大为7对应8个周期延时为8 * 20ns 160ns仍不足。结论在100MHz PCLKB下仅靠SDA输出延时无法独立满足300ns要求。需要降低PCLKB频率或接受更小的tIICφ。重新计算将PCLKB配置为50MHztIICφ20ns。固有延迟假设变为120ns。需补偿延迟300ns-120ns180ns。选择DLCS1IICφ/2周期40ns。所需周期180ns/40ns4.5向上取整为5个周期。设置SDDL[2:0] 5注意手册中通常0代表1个周期1代表2个周期以此类推需仔细核对寄存器描述。实际延时5 * 40ns 200ns。总延迟固有120ns 延时200ns 320ns 300ns满足要求。注意事项过度增加SDA输出延时会压缩数据有效窗口可能违反SCL高电平期间的数据建立时间tSU;DAT要求。因此这是一个权衡过程。务必使用逻辑分析仪或示波器测量最终的SDA/SCL时序确保建立时间和保持时间都在规范范围内。对于标准模式100kHz和快速模式400kHz通常不需要启用此功能在快速模式1MHz或SMBus应用中则必须仔细配置。5. 数字噪声滤波电路提升通信鲁棒性的硬件保障在电气环境复杂的工业或车载应用中I2C总线容易受到噪声干扰导致错误的起始/停止条件检测或数据位误判。RA8M2的IIC模块集成了两级噪声滤波模拟噪声滤波和数字噪声滤波。5.1 数字噪声滤波电路原理如图39.23所示数字噪声滤波电路本质上是一个多级同步器加一个表决电路。采样SCLn和SDAn引脚上的输入信号首先经过一个模拟噪声滤波器通常是一个简单的RC低通滤波然后被IICφ时钟的下降沿采样。移位与比较采样值被送入一个4级的移位寄存器链。ICMR3.NF[1:0]位用于选择有效的级数1到4级。比较器会持续检查当前输入采样值与这N级N由NF[1:0]决定寄存器中的值是否一致。滤波判决只有当连续N个IICφ时钟周期的采样值都相同时比较器才认为这是一个稳定的信号并输出该电平到内部电路。如果其中任何一次采样值发生变化则输出保持之前的值不变。滤波效果这个机制可以有效地滤除宽度小于N * tIICφ的毛刺噪声。例如当NF[1:0]22级滤波IICφ50MHztIICφ20ns时可以滤除宽度小于40ns的脉冲噪声。5.2 配置策略与常见问题排查配置考量滤波强度选择 (NF[1:0])滤波级数越高抗噪能力越强但也会引入更大的信号延迟。这个延迟会影响总线最高通信速率。需要根据环境噪声水平和通信速率折中选择。使能控制 (ICFER.NFE)NFE位控制数字噪声滤波器的开关。在极高通信速率下例如400kbps比特率但PCLKB频率相对较低时滤波引入的延迟可能占整个比特周期的很大比例甚至可能将有效的窄脉冲误滤除。此时可能需要关闭数字滤波NFE0仅依靠模拟滤波。与通信速率的平衡手册中特别警告当内部操作时钟PCLKB与传输速率比值较小时例如在PCLKB4MHz下进行400kbps传输数字滤波器的特性可能导致将所需信号当作噪声滤除。这是因为每个I2C位周期只有10个PCLKB周期4MHz/400kHz10数字滤波的延迟可能达到数个周期严重干扰位采样。问题排查流程当通信出现偶发性错误、起始条件无法识别或数据位错误时可以按以下步骤排查噪声问题硬件检查首先检查硬件包括上拉电阻值是否合适通常3.3V系统用4.7kΩ5V系统用2.2kΩ、电源是否干净、走线是否远离噪声源、是否添加了必要的旁路电容。示波器观察使用示波器观察SDA和SCL线上的波形看是否存在明显的过冲、振铃或毛刺。调整滤波如果观察到窄毛刺尝试增加数字滤波级数NF[1:0]。如果通信速率接近极限尝试关闭数字滤波NFE0。降低速率如果问题依旧尝试降低I2C通信速率调整ICBRH和ICBRL给信号边沿更多稳定时间。实操心得数字噪声滤波器的配置没有“银弹”需要在实际环境中测试。一个实用的方法是在代码中预留滤波器配置接口在产品EMC测试或高噪声环境测试时动态调整NF[1:0]和NFE位观察通信误码率的变化从而找到最优配置。同时务必注意关闭数字滤波器后系统的抗噪能力将完全依赖于硬件布板和模拟滤波设计时需要更加谨慎。6. 地址匹配与高级寻址模式解析RA8M2的IIC模块提供了灵活的地址匹配机制支持3个独立的从机地址、广播呼叫地址、主机地址以及设备ID地址检测这使其能够适应复杂的多从机网络和系统管理总线协议。6.1 多从机地址匹配与标志位管理模块可以通过SARUy和SARLy寄存器独立设置三个从机地址y0,1,2并通过ICSER.SARyE位分别使能。当地址匹配发生时硬件会置位ICSR1中对应的AASy标志从而可以区分是哪个地址被呼叫。这在实现一个物理设备模拟多个逻辑设备时非常有用。混合7位与10位地址格式如图39.26所示RA8M2可以同时配置7位和10位地址。例如可以将SAR0配置为7位地址0x50SAR1配置为另一个7位地址0x68而SAR2配置为一个10位地址0x123。硬件会自动识别地址长度并进行匹配。AASy标志的置位和清除时序在图中清晰展示需要注意的是在10位地址模式下需要两次地址匹配过程。6.2 广播呼叫与主机地址广播呼叫地址地址0x00被定义为广播呼叫地址。使能ICSER.GCAE位后设备可以响应此地址用于主机向总线上的所有从机广播消息。匹配时ICSR1.GCA标志置1。主机地址在SMBus协议中地址0x08被保留为主机地址。当ICMR3.SMBS1SMBus模式使能且ICSER.HOAE1时从机可以识别该地址。匹配时ICSR1.HOA标志置1。这用于SMBus的“主机通知”协议。6.3 设备ID地址检测这是一个符合I2C规范v03的高级功能用于动态识别和枚举设备。当ICSER.DIDE1时模块会检测特殊的设备ID头字节0xFA二进制1111 100b W。检测流程如果接收到0xFAW则设置ICSR1.DID标志并继续比较后续字节制造商ID、产品ID等与自身配置的从机地址是否匹配。如果匹配则再设置相应的AASy标志。读取设备ID如果接收到0xFAR则模块不进行后续地址比较直接设置ICSR2.TDRE标志通知CPU准备发送设备ID数据。此时软件需要将3字节的设备ID信息12位制造商代码9位产品代码3位版本号作为普通数据写入ICDRT进行发送。应用场景此功能在需要热插拔或自动配置的系统中非常有用主机可以通过此协议查询总线上存在的设备类型和版本。配置要点使用设备ID功能时需要仔细规划从机地址寄存器的用途因为设备ID的比较依赖于这些寄存器。同时需要查阅相关规范如NXP的I2C规范或供应商文档以获取正确的制造商ID等信息。7. 低功耗唤醒功能实战指南RA8M2的IIC模块支持在软件待机模式下被I2C总线通信唤醒这对于电池供电的物联网设备至关重要。唤醒功能允许在CPU内核和大部分外设时钟停止的情况下IIC模块仍能异步监听总线并在地址匹配时产生中断唤醒MCU。7.1 唤醒模式概览与选择模块提供四种唤醒模式如表39.9所示主要区别在于ACK响应时机和SCL线在唤醒期间的状态操作模式ACK响应时机唤醒期间的ACK响应SCL线在唤醒期间状态适用场景普通唤醒模式1切换到PCLKB同步操作之前发送ACK固定为低电平通用唤醒需快速响应ACK。普通唤醒模式2切换到PCLKB同步操作之后唤醒前保持NACK唤醒后发送ACK固定为低电平需要在MCU完全就绪后才确认通信。命令恢复模式切换到PCLKB同步操作之前发送ACK释放高阻适用于主机在唤醒期间可能继续发送时钟的场景。EEP响应模式恢复到PCLKB同步操作之前发送NACK释放高阻模拟EEPROM行为用NACK应答表示忙。模式选择建议模式1最常用它在唤醒过程中就回复ACK最符合标准从机行为能最快响应主机且通过拉低SCL为主机提供等待信号。模式2更安全它确保MCU核心和软件完全恢复运行后才回复ACK避免因软件未初始化完成而处理后续数据出错。命令恢复与EEP模式用于需要与SCL线释放行为配合的特殊协议或模拟特定设备。7.2 普通唤醒模式1的配置与代码流程图39.30详细描述了模式1的完整操作流程。以下是关键的配置步骤和代码片段思路进入低功耗前的配置// 1. 确保总线空闲 (BBSY0)IIC处于从机接收模式 (MST0, TRS0) while((ICU.IICn.ICSR2 ICSR2_BBSY_Msk) ! 0); // 等待总线空闲 // 2. 配置唤醒相关寄存器 ICU.IICn.ICWUR (1 ICWUR_WUE_Pos); // 使能唤醒功能 ICU.IICn.ICWUR (1 ICWUR_WUIE_Pos); // 使能唤醒中断 ICU.IICn.ICMR3 | (1 ICMR3_WUACK_Pos); // 设置ACK响应模式为模式1 // 3. 禁用所有其他IIC中断TIE, RIE, SPIE等只保留唤醒中断 ICU.IICn.ICIER 0x00; // 4. 切换到PCLKB异步操作模式开始监听总线 ICU.IICn.ICWUR2 | (1 ICWUR2_WUSEN_Pos); while((ICU.IICn.ICWUR2 ICWUR2_WUASYF_Msk) 0); // 等待切换完成进入软件待机模式// 停止PCLKB时钟供给IIC模块由低功耗管理单元完成 // 执行WFI (Wait For Interrupt) 指令CPU进入待机。 __WFI();唤醒中断服务程序void IICn_WUI_IRQHandler(void) { // 1. 检查唤醒标志 WUF if((ICU.IICn.ICWUR ICWUR_WUF_Msk) ! 0) { // 2. 清除唤醒标志必须先读后写0 ICU.IICn.ICWUR ~ICWUR_WUF_Msk; // 3. 等待切换回PCLKB同步操作模式 while((ICU.IICn.ICWUR2 ICWUR2_WUASYF_Msk) ! 0); // 4. 禁用唤醒中断和唤醒功能可选也可在应用层处理 ICU.IICn.ICWUR ~(ICWUR_WUIE_Msk | ICWUR_WUE_Msk); // 5. 重新使能所需的IIC中断TIE, RIE等 ICU.IICn.ICIER (1 ICIER_RIE_Pos) | (1 ICIER_SPIE_Pos); // 6. 此时IIC已处于正常操作模式。 // 根据ICSR1中的AASy/GCA/HOA标志判断是哪个地址唤醒了设备 // 然后进入标准的从机接收或发送处理流程。 if((ICU.IICn.ICSR1 ICSR1_AAS0_Msk) ! 0) { // 地址0匹配开始处理数据... // 注意由于是地址匹配唤醒此时RDRF可能已置位需要进行哑读。 volatile uint8_t dummy ICU.IICn.ICDRR; // 哑读地址字节 } } }避坑指南与重要警告寄存器访问时机在异步操作模式WUASYF1期间切勿修改除ICWUR2.WUSEN以外的任何IIC操作相关寄存器如ICMR3,ICSER,SARLy等否则可能导致不可预测的行为。中断冲突如果唤醒是由非IIC中断如外部IRQ触发的且此时WUSEN1流程会变得复杂见图39.31。通常需要在唤醒后复位IIC模块并重新初始化。超时功能禁用使用唤醒功能时必须禁用超时功能ICMR3.TMOE0因为异步操作下的时序会干扰超时计数器。标志位查询在异步操作期间不要查询ICSR1、ICSR2和BBSY的标志位因为它们可能无效。停止条件处理如果设置WUSEN1时总线处于空闲状态模块会持续监听。当检测到下一个数据帧的停止条件时才会切换回同步模式。这意味着在总线空闲时进入待机可能会被下一个无关的通信帧唤醒。设计时需要考量这一点。