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