前置基础规则硬件SCL 时钟线、SDA 双向开漏数据线外部 4.7k 上拉空闲均为高电平比特传输高位先行 MSB FirstSCL 高电平时采样 SDA 电平SCL 低电平时切换 SDA基础时序单元START、STOP、Repeated START、ACK/NACK 应答单字节结构8bit 数据 1bit 应答位共 9 个 SCL 周期。一、4 种基础信号时序1. 起始信号 START通信开启条件SCL 高电平期间SDA 由高 → 拉低 时序步骤总线空闲SCL1SDA1保持 SCL 不变为高SDA 拉低产生下降沿 → START 之后 SCL 拉低准备传输字节2. 停止信号 STOP通信结束释放总线条件SCL 高电平期间SDA 由低 → 释放拉高 时序步骤传输完最后一字节 ACK 后SCL 拉低SDA 先拉低SCL 拉高保持不变SDA 释放变高上升沿 → STOP 总线回到空闲状态 SCL1、SDA13. 应答位 ACK / NACK每 8bit 后必传主机发 8bit 数据后释放 SDA等待从机控制 SDAACK确认收到从机在第 9 个 SCL 低周期把 SDA 拉低NACK无应答从机不动作SDA 保持高 主机收到 NACK 后应发送 STOP 终止通信。4. 重复起始 Repeated START不发送 STOP直接再次生成 START用于「写寄存器地址→连续读数据」场景不释放总线避免总线冲突。二、I2C 写寄存器完整时序主机写从机需求向从机地址 0x51寄存器 0x02 写入数值 0xAA 完整时序流程START 起始信号发送 1 字节寻址字节7位从地址 读写位(0写)例0x51 1 | 0 0xA2等待从机拉低 SDA 返回 ACK发送 1 字节寄存器偏移地址 0x02等待从机 ACK发送待写入数据 0xAA等待从机 ACKSTOP 停止信号传输结束时序分层说明第 1 段寻址从设备告知 “我要写你”第 2 段发送目标寄存器编号指定写入位置第 3 段发送要存入寄存器的数据对应代码里的底层逻辑python运行i2c.write(0x02) # 先发寄存器地址 i2c.write(0xAA) # 再发写入数据三、I2C 读寄存器完整时序主机读取从机数据I2C 读不能直接读必须先写寄存器地址使用 Repeated START 切换读模式 需求读取 0x51 设备寄存器 0x01 的 1 字节数据 时序流程START发送写寻址字节 0xA20x51 写ACK发送寄存器偏移 0x01ACKRepeated START 重复起始关键不发 STOP发送读寻址字节 0xA30x51 | 1 读标志ACK从机确认读指令从机在 SCL 节拍下把寄存器数据逐位输出到 SDA主机读取 8bit主机输出 NACK告诉从机不再继续读STOP 结束对应你代码的操作逻辑python运行i2c.write(0x01) # 第一步发送寄存器地址 val i2c.read(1) # 第二步发起读时序获取数据四、时序关键约束开发避坑SDA 电平切换只能在 SCL 低 时操作SCL 高时 SDA 电平代表有效数据 / START/STOP所有字节高位先输出不能低位先行读操作读完所需字节后主机必须发 NACK持续 ACK 会触发从机持续输出下一个寄存器总线挂死故障若从机拉死 SDA 为低无法产生 STOP整条 I2C 总线卡死软件需增加超时复位逻辑速率与时序裕量标准 100kHz高低电平最小 4.7us快速 400kHz高低电平最小 0.6usRDK 默认常用 400kHz。五、读写时序对比简表表格操作类型核心时序特征核心信号I2C 写寄存器START→写地址→ACK→寄存器→数据→ACK→STOP单次 START、无重复起始I2C 读寄存器START→写地址→ACK→重复 START→读地址→读取数据→NACK→STOP必须 Repeated START 切换读写方向六、时序和之前 i2cdev 代码的关联使用的i2c.read()/i2c.write()是底层裸字节接口不会自动生成寄存器寻址时序读寄存器必须手动先 write (reg) 发送偏移地址再 read库内部自动封装 START、STOP、ACK 时序无需用户操作电平如果直接调用i2c.read(1)不先发寄存器地址从机无目标地址读出随机无效乱码