时序
SPI 总线:直来直去的“行动派”
SPI 是全双工,时序比 I2C 简单得多,它没有复杂的 Start/Stop 组合信号,完全靠 CS (片选) 和 SCK (时钟) 控制。
1. 开始与结束
- 开始:CS 引脚从 高 -> 低。只要 CS 变低,从机就开始从 MOSI 听指令。
- 结束:CS 引脚从 低 -> 高。CS 一变高,从机立马切断与总线的联系(MISO 变高阻态)。
2. 写/读 数据时序 (同时进行!)
SPI 是环形移位寄存器结构。主机发出的每一个 bit,同时也对应着从机发回来的一个 bit。
具体情况结合 极性 和 相位:
- 写指令/数据:
CS_Low()- MOSI 线:主机在时钟边沿(比如上升沿)把数据放上去。
- 从机采样:从机在对应的边沿读取数据。
CS_High()
- 读数据 (最经典的坑):
- 你想读数据,不能只等着收。
- 你必须在 MOSI 线上发送一个 Dummy Byte (哑字节,通常是 0xFF 或 0x00)。
- 你发出去 8 个时钟脉冲的同时,MISO 线上就会把从机的数据“挤”进你的单片机。
| 特征 | I2C (IIC) | SPI |
|---|---|---|
| 开始信号 | SCL高时,SDA 下降沿 | CS 拉低 |
| 结束信号 | SCL高时,SDA 上升沿 | CS 拉高 |
| 读/写控制 | 靠地址字节的最后1位 (0写/1读) | 靠发送具体的指令字节 (如 0x03 读) |
| 数据采样 | SCL高电平期间保持数据稳定 | SCK 的上升沿或下降沿(看模式) |
| 应答机制 | 必须有 ACK/NACK (第9个时钟) | 无硬件应答 (发出去就不管了) |
| 空闲状态 | SDA 和 SCL 都是高电平 (上拉电阻) | CS 高,MOSI/MISO/SCK 看配置 |