SPI通信协议详细规范
1. 物理层参数
- 时钟频率: 10MHz (可配置范围: 1-20MHz)
- 数据位宽: 8位
- 时钟极性: CPOL=0 (空闲时低电平)
- 时钟相位: CPHA=0 (第一个边沿采样)
- MSB/LSB: MSB first
- 最大包长: 512字节 (包含头部和CRC)
2. 协议帧格式
2.1 基本帧结构
| 字段 |
长度 |
描述 |
| SOF |
1字节 |
起始标志 (0xAA) |
| Command |
1字节 |
命令类型 |
| Length |
2字节 |
数据长度 (大端序) |
| Payload |
N字节 |
有效载荷 |
| CRC32 |
4字节 |
CRC32校验 (IEEE 802.3) |
| EOF |
1字节 |
结束标志 (0x55) |
2.2 命令类型定义
| 命令值 |
命令名称 |
描述 |
| 0x01 |
POWER_MODE_REQ |
电源模式请求 |
| 0x02 |
POWER_MODE_ACK |
电源模式确认 |
| 0x03 |
DATA_TRANSFER |
传感器数据传输 |
| 0x04 |
DATA_ACK |
数据接收确认 |
| 0x05 |
STATUS_REPORT |
状态报告 |
| 0x06 |
ERROR_REPORT |
错误报告 |
| 0x07 |
CONFIG_UPDATE |
配置更新 |
| 0x08 |
CONFIG_ACK |
配置确认 |
3. 传感器数据传输协议 (DATA_TRANSFER)
3.1 数据包格式
SOF(0xAA) + CMD(0x03) + LEN(2B) + [SensorID(1B) + Timestamp(4B) + DataLength(2B) + SensorData(NB)] + CRC32(4B) + EOF(0x55)
3.2 传感器数据结构
| 字段 |
长度 |
描述 |
| SensorID |
1字节 |
传感器标识符 |
| Timestamp |
4字节 |
时间戳 (毫秒, 大端序) |
| DataLength |
2字节 |
传感器数据长度 (大端序) |
| SensorData |
N字节 |
传感器原始数据 |
3.3 传感器ID映射表
| ID |
传感器类型 |
数据格式 |
更新频率 |
| 0x01 |
摄像头 |
JPEG/YUV帧 |
30Hz |
| 0x02 |
温度传感器 |
float32 (℃) |
1Hz |
| 0x03 |
加速度计 |
int16[3] (X,Y,Z) |
100Hz |
| 0x04 |
GPS |
struct {double lat, lon; float alt;} |
1Hz |
| 0x05 |
陀螺仪 |
int16[3] (X,Y,Z) |
100Hz |
| 0x06 |
磁力计 |
int16[3] (X,Y,Z) |
10Hz |
| 0x07 |
气压计 |
float32 (hPa) |
1Hz |
| 0x08 |
湿度传感器 |
float32 (%) |
1Hz |
| 0x09-0xFF |
预留 |
- |
- |
4. 流量控制与错误处理
4.1 ACK机制
- SoC收到DATA_TRANSFER后,必须在10ms内回复DATA_ACK
- ACK包包含接收到的SensorID和Timestamp用于确认
4.2 重传机制
- 如果MCU在20ms内未收到ACK,则重传数据包
- 最大重传次数: 3次
- 重传间隔: 10ms
4.3 错误码定义
| 错误码 |
描述 |
处理方式 |
| 0x01 |
CRC校验失败 |
丢弃数据包,记录错误 |
| 0x02 |
包长度超限 |
丢弃数据包,记录错误 |
| 0x03 |
无效传感器ID |
丢弃数据包,记录错误 |
| 0x04 |
内存不足 |
丢弃数据包,触发内存清理 |
| 0x05 |
通信超时 |
触发UART健康检查 |
5. 性能指标
5.1 带宽计算
- 摄像头(720p@30fps): ~8Mbps
- 其他传感器总和: ~100kbps
- 总带宽需求: ~8.1Mbps
- SPI实际带宽(10MHz): 10Mbps
- 带宽利用率: ~81%
5.2 实时性要求
| 传感器类型 |
最大端到端延迟 |
SPI传输延迟 |
| 摄像头 |
100ms |
<10ms |
| 加速度计 |
50ms |
<5ms |
| 温度传感器 |
500ms |
<1ms |
| GPS |
1000ms |
<1ms |
6. 实现注意事项
6.1 MCU端实现
- 使用DMA传输提高效率
- 实现双缓冲区避免数据丢失
- 定期发送心跳包维持连接
6.2 SoC端实现
- 使用中断驱动接收
- 实现环形缓冲区处理突发流量
- 定期检查MCU健康状态
7. 测试用例
7.1 功能测试
7.2 性能测试
7.3 异常测试