128 lines
3.8 KiB
Markdown
128 lines
3.8 KiB
Markdown
|
|
# 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 功能测试
|
|||
|
|
- [ ] 正常数据传输
|
|||
|
|
- [ ] CRC校验失败处理
|
|||
|
|
- [ ] 包长度边界测试
|
|||
|
|
- [ ] 传感器ID有效性验证
|
|||
|
|
|
|||
|
|
### 7.2 性能测试
|
|||
|
|
- [ ] 最大带宽压力测试
|
|||
|
|
- [ ] 实时性延迟测试
|
|||
|
|
- [ ] 长时间稳定性测试
|
|||
|
|
|
|||
|
|
### 7.3 异常测试
|
|||
|
|
- [ ] 通信中断恢复
|
|||
|
|
- [ ] MCU复位后同步
|
|||
|
|
- [ ] SoC内存不足处理
|