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位地址范围: 0x00 ~ 0x7F(共128个地址),但其中一部分被保留用于特殊用途(见3.3节)。实际可用的从机地址为0x08 ~ 0x77。
3.2 10位地址格式
当系统中从机数量超过128个时,I2C规范定义了10位地址模式。10位地址的传输需要两个字节:第一个字节的前5位为特殊标识位(11110xx),后跟地址的高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 硬件匹配流程
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配置一致。
3.6 本章小结
- 7位地址是I2C最常用的模式,地址范围0x08~0x77可供用户自由分配。
- 10位地址通过双字节传输扩展地址空间,S32K3硬件原生支持。
- 广播地址(0x00)和保留地址(0x00~0x07、0x78~0x7F)需特殊处理,从机不应答保留地址。
- S32K3的地址匹配由硬件自动完成,通过SADR寄存器配置,支持掩码实现多地址匹配。
- 中断响应优化应聚焦于优先级设置、快速清标志、数据预取和DMA卸载。
- 地址冲突可通过BCF标志检测,并在系统设计阶段通过地址规划避免。