Skip to content

时序对比

特征I2C (IIC)SPI
开始信号SCL高时,SDA 下降沿CS 拉低
结束信号SCL高时,SDA 上升沿CS 拉高
读/写控制靠地址字节的最后1位 (0写/1读)靠发送具体的指令字节 (如 0x03 读)
数据采样SCL高电平期间保持数据稳定SCK 的上升沿下降沿(看模式)
应答机制必须有 ACK/NACK (第9个时钟)无硬件应答 (发出去就不管了)
空闲状态SDA 和 SCL 都是高电平 (上拉电阻)CS 高,MOSI/MISO/SCK 看配置

⚠️ 必须记住的 3 个“反直觉”细节:

  1. I2C 的读操作最后的 NACK
    • 很多新手在写 I2C 读函数时,读完最后一个字节习惯性给个 ACK,结果从机以为你还要读,死锁总线。记住:主机读完最后字节,必须发 NACK!
  2. SPI 的“采样”与“切换”
    • SPI 有 CPOL (极性) 和 CPHA (相位)。
    • 如果 CPHA=0:数据在第一个边沿采样(读),在第二个边沿切换(变)。
    • 如果 CPHA=1:数据在第一个边沿切换(变),在第二个边沿采样(读)。
    • 坑: 主机和从机如果不一致,读到的数据就会错位(比如向左移了一位)。
  3. I2C 的 Restart 信号
    • 在模拟 I2C 时,很多人写完 Register Address 后直接 Stop 然后再 Start。虽然大部分芯片支持这样做,但标准协议推荐 Repeated Start(中间没有 Stop)。这样做能防止多主机系统中总线被抢占。