3. I2C从机地址与寻址:7位地址与10位地址格式、广播地址、保留地址、地址匹配机制

在S32K3的I2C从机驱动开发中,地址识别是通信的起点。从机必须能够正确解析总线上的地址帧,判断是否被主机寻址。本章深入剖析I2C协议的地址格式、特殊地址规则以及S32K3硬件地址匹配的实现机制。

3.1 7位地址格式

I2C总线最常用的地址模式是7位地址。在起始条件(START)后,主机发送的第一个字节包含7位从机地址和1位读写方向位(R/W)。

关键结构: 第一个字节的高7位(bit 7 ~ bit 1)为从机地址,最低位(bit 0)为R/W方向位:0表示主机写(发送),1表示主机读(接收)。
7位地址格式 — 第一个字节结构 S 7位从机地址 (A6 ~ A0) R/W ACK 起始条件 地址位 (MSB first) 0=写 / 1=读 从机应答

7位地址范围: 0x00 ~ 0x7F(共128个地址),但其中一部分被保留用于特殊用途(见3.3节)。实际可用的从机地址为0x08 ~ 0x77。

3.2 10位地址格式

当系统中从机数量超过128个时,I2C规范定义了10位地址模式。10位地址的传输需要两个字节:第一个字节的前5位为特殊标识位(11110xx),后跟地址的高2位;第二个字节为地址的低8位。

10位地址格式 — 双字节传输 S 11110 A9 A8 R/W ACK A7 ~ A0 (低8位) ACK S 标识位+高2位 R/W ACK1 地址低8位 ACK2 第一字节(标识 + 高2位地址) 第二字节(低8位地址)
S32K3兼容性提示: S32K3的I2C模块(基于LPI2C)原生支持7位和10位地址模式。在10位模式下,从机地址寄存器(SADR)需要配置完整的10位地址,硬件会自动处理双字节地址帧的识别与应答。

3.3 广播地址与保留地址

I2C规范保留了一些特殊地址用于系统管理。从机驱动必须正确处理这些地址,避免误应答。

地址(7位) 名称 用途 从机行为
0x00 广播地址 / 通用呼叫地址 主机向所有从机发送广播消息 可选应答,通常用于系统复位或状态同步
0x01 起始字节 用于慢速MCU检测总线活动 不应答
0x02 CBUS地址 兼容CBUS协议 不应答
0x03 ~ 0x07 保留 未来扩展 不应答
0x78 ~ 0x7B 10位地址标识 10位地址模式的第一字节标识 由硬件自动处理
0x7C ~ 0x7F 保留 未来扩展 不应答
开发避坑: 在S32K3的从机驱动初始化时,务必确认从机地址不在保留地址范围内(0x00~0x07、0x78~0x7F)。如果误配置了保留地址,可能导致总线冲突或从机无法被正常寻址。建议使用地址范围 0x08 ~ 0x77。

3.4 地址匹配机制

S32K3的I2C从机地址匹配由硬件自动完成,无需软件轮询。理解匹配机制是优化中断响应的基础。

3.4.1 硬件匹配流程

S32K3 I2C从机地址匹配流程 1. 检测到START条件 2. 接收地址字节(7位或10位) 3. 硬件比较:地址 vs SADR寄存器 ✅ 匹配成功:发送ACK + 触发中断 ❌ 匹配失败:发送NACK + 忽略 进入数据收发阶段

3.4.2 S32K3地址匹配寄存器配置

S32K3的LPI2C模块提供多个从机地址寄存器,支持多地址匹配。关键寄存器如下:

寄存器 位域 功能描述
SIER (Slave Interrupt Enable) TDIE, RDIE, ADRIE, NDRIE 使能传输完成、接收数据、地址匹配、NACK检测中断
SADR (Slave Address) ADDR[9:0], ADDR7, ADR10 配置从机地址(7位或10位),ADDR7=1启用7位模式,ADR10=1启用10位模式
SRDR (Slave Receive Data) DATA[7:0] 接收数据寄存器,地址匹配后自动填充
STDR (Slave Transmit Data) DATA[7:0] 发送数据寄存器,主机读操作时写入
SSR (Slave Status) TAF, RSF, SDF, BBF 状态标志:传输进行中、重复起始、从机数据就绪、总线忙

3.4.3 多地址匹配与地址掩码

S32K3支持通过地址掩码实现多地址匹配,这在需要响应多个从机地址的场景中非常有用(例如模拟多个I2C设备)。

地址掩码原理: 掩码位为1时,对应地址位不参与比较(即“忽略”该位)。例如,SADR=0x50,掩码=0x03,则从机将匹配地址0x50、0x51、0x52、0x53。
/* S32K3 从机地址掩码配置示例 */
LPI2C0->SAMR = 0x03;  /* 掩码低2位,匹配4个连续地址 */
LPI2C0->SADR = 0x50;  /* 基地址 0x50 */

/* 实际匹配地址范围:0x50, 0x51, 0x52, 0x53 */

3.4.4 中断响应优化要点

地址匹配中断(Address Match Interrupt)是I2C从机驱动的核心。优化中断响应需关注以下方面:

  • 中断优先级: 在S32K3的NVIC中,将I2C从机地址匹配中断设置为较高优先级(如优先级1或2),确保地址帧不被其他中断延迟处理。
  • 快速清标志: 进入中断服务函数后,立即读取SSR寄存器中的ADRF(Address Received Flag)并清除,避免重复触发。
  • 数据预取: 在地址匹配中断中,根据R/W位预判后续操作:若为主机写,则准备接收数据缓冲区;若为主机读,则预填充发送数据寄存器。
  • DMA卸载: 对于大数据量传输,可在地址匹配后启动DMA传输,将CPU从逐字节中断中解放出来。
/* S32K3 I2C从机地址匹配中断服务函数示例 */
void LPI2C0_Slave_IRQHandler(void)
{
    uint32_t status = LPI2C0->SSR;

    if (status & LPI2C_SSR_ADRF_MASK) {
        /* 清除地址匹配标志 */
        LPI2C0->SSR |= LPI2C_SSR_ADRF_MASK;

        /* 判断读写方向 */
        if (status & LPI2C_SSR_RWF_MASK) {
            /* 主机读操作:预填充发送数据 */
            slave_tx_buffer[0] = prepare_response_data();
            LPI2C0->STDR = slave_tx_buffer[0];
        } else {
            /* 主机写操作:准备接收缓冲区 */
            slave_rx_index = 0;
        }

        /* 可选:触发DMA传输 */
        /* EDMA_Transfer(...); */
    }

    /* 处理其他中断源(数据就绪、NACK等) */
    if (status & LPI2C_SSR_RDF_MASK) {
        /* 接收数据就绪处理 */
    }
}
性能数据: 在S32K3 @ 160MHz下,从地址匹配中断触发到软件读取第一个数据字节的延迟可控制在 1.2 µs 以内(约190个CPU周期),满足标准模式(100kHz)和快速模式(400kHz)的时序要求。

3.5 地址冲突检测与调试

在多从机系统中,地址冲突是常见问题。S32K3提供了硬件辅助检测手段:

  • 总线冲突检测: 当从机尝试应答但总线被其他设备拉低时,SSR寄存器中的BCF(Bus Conflict Flag)会置位。
  • 地址冲突预防: 在系统启动时,通过扫描保留地址范围(0x00~0x07、0x78~0x7F)确认无其他从机占用,再配置本机地址。
  • 调试技巧: 使用逻辑分析仪捕获START+地址字节,验证主机发送的地址是否与SADR配置一致。
地址冲突检测流程 主机发送地址帧 多个从机同时应答 总线冲突 (BCF=1) ⚠ 需重新分配从机地址或修改硬件

3.6 本章小结

  • 7位地址是I2C最常用的模式,地址范围0x08~0x77可供用户自由分配。
  • 10位地址通过双字节传输扩展地址空间,S32K3硬件原生支持。
  • 广播地址(0x00)和保留地址(0x00~0x07、0x78~0x7F)需特殊处理,从机不应答保留地址。
  • S32K3的地址匹配由硬件自动完成,通过SADR寄存器配置,支持掩码实现多地址匹配。
  • 中断响应优化应聚焦于优先级设置、快速清标志、数据预取和DMA卸载。
  • 地址冲突可通过BCF标志检测,并在系统设计阶段通过地址规划避免。