144 lines
3.9 KiB
Markdown
144 lines
3.9 KiB
Markdown
|
|
# UART通信协议详细规范
|
|||
|
|
|
|||
|
|
## 1. 协议概述
|
|||
|
|
|
|||
|
|
UART通道主要用于SoC健康状态监控和关键传感器状态报告,作为SPI主通道的补充和备份。
|
|||
|
|
|
|||
|
|
## 2. 物理层参数
|
|||
|
|
|
|||
|
|
| 参数 | 值 | 说明 |
|
|||
|
|
|------|-----|------|
|
|||
|
|
| 波特率 | 1000000 | 1Mbps,满足实时性要求 |
|
|||
|
|
| 数据位 | 8 | 标准8位数据 |
|
|||
|
|
| 停止位 | 1 | 标准1位停止位 |
|
|||
|
|
| 校验位 | None | 无校验位 |
|
|||
|
|
| 流控 | None | 无硬件流控 |
|
|||
|
|
|
|||
|
|
## 3. 帧格式定义
|
|||
|
|
|
|||
|
|
### 3.1 基本帧结构
|
|||
|
|
```
|
|||
|
|
[Header: 2B] [Payload: N B] [CRC16: 2B]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.2 Header定义
|
|||
|
|
- **固定值**: `0xAA55`
|
|||
|
|
- **用途**: 帧同步和识别
|
|||
|
|
|
|||
|
|
### 3.3 Payload结构
|
|||
|
|
| 字段 | 长度 | 类型 | 描述 |
|
|||
|
|
|------|------|------|------|
|
|||
|
|
| cpu_load | 1字节 | uint8_t | CPU负载百分比 (0-100) |
|
|||
|
|
| memory_usage | 1字节 | uint8_t | 内存使用百分比 (0-100) |
|
|||
|
|
| temp_soc | 2字节 | int16_t | SoC温度 (℃ × 10,范围-400~850) |
|
|||
|
|
| critical_sensors | 4字节 | uint32_t | 关键传感器状态位图 |
|
|||
|
|
| timestamp_ms | 4字节 | uint32_t | 时间戳 (毫秒) |
|
|||
|
|
|
|||
|
|
### 3.4 CRC16计算
|
|||
|
|
- **算法**: CRC16-CCITT
|
|||
|
|
- **初始值**: 0xFFFF
|
|||
|
|
- **多项式**: 0x1021
|
|||
|
|
- **输入数据**: Header + Payload
|
|||
|
|
|
|||
|
|
## 4. 通信时序
|
|||
|
|
|
|||
|
|
### 4.1 发送频率
|
|||
|
|
- **正常状态**: 每100ms发送一次
|
|||
|
|
- **异常状态**: 每10ms发送一次(CPU负载>90%或内存使用>95%)
|
|||
|
|
|
|||
|
|
### 4.2 超时机制
|
|||
|
|
- **MCU接收超时**: 300ms(3个周期)
|
|||
|
|
- **超时处理**: 触发GPIO RESET_N复位信号
|
|||
|
|
|
|||
|
|
### 4.3 状态机
|
|||
|
|
```
|
|||
|
|
IDLE → SEND_FRAME → WAIT_ACK → IDLE
|
|||
|
|
↓ (timeout)
|
|||
|
|
TRIGGER_RESET
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 5. 关键传感器状态位图
|
|||
|
|
|
|||
|
|
| 位 | 传感器 | 状态值 | 说明 |
|
|||
|
|
|----|--------|--------|------|
|
|||
|
|
| 0 | 摄像头 | 0=离线, 1=在线 | 视频流状态 |
|
|||
|
|
| 1 | 温度传感器 | 0=正常, 1=异常 | 超出工作范围 |
|
|||
|
|
| 2 | 加速度计 | 0=正常, 1=异常 | 数据异常或离线 |
|
|||
|
|
| 3 | GPS | 0=无信号, 1=有信号 | 定位状态 |
|
|||
|
|
| 4-31 | 预留 | - | 未来扩展 |
|
|||
|
|
|
|||
|
|
## 6. 错误处理
|
|||
|
|
|
|||
|
|
### 6.1 CRC校验失败
|
|||
|
|
- **处理方式**: 丢弃当前帧,记录错误计数
|
|||
|
|
- **阈值**: 连续5次CRC失败触发告警
|
|||
|
|
|
|||
|
|
### 6.2 帧同步丢失
|
|||
|
|
- **检测**: 连续3帧Header不匹配
|
|||
|
|
- **恢复**: 重新同步,从下一个0xAA55开始
|
|||
|
|
|
|||
|
|
### 6.3 数据异常
|
|||
|
|
- **检测**: CPU负载>100%、内存使用>100%、温度超出范围
|
|||
|
|
- **处理**: 标记为异常状态,提高发送频率
|
|||
|
|
|
|||
|
|
## 7. MCU端实现要求
|
|||
|
|
|
|||
|
|
### 7.1 接收缓冲区
|
|||
|
|
- **大小**: 128字节环形缓冲区
|
|||
|
|
- **处理**: 中断驱动接收,DMA可选
|
|||
|
|
|
|||
|
|
### 7.2 解析逻辑
|
|||
|
|
```c
|
|||
|
|
typedef struct {
|
|||
|
|
uint8_t header[2]; // 0xAA55
|
|||
|
|
uint8_t cpu_load; // 0-100%
|
|||
|
|
uint8_t memory_usage; // 0-100%
|
|||
|
|
int16_t temp_soc; // ℃ * 10
|
|||
|
|
uint32_t critical_sensors;
|
|||
|
|
uint32_t timestamp_ms;
|
|||
|
|
uint16_t crc16;
|
|||
|
|
} uart_health_report_t;
|
|||
|
|
|
|||
|
|
int parse_uart_frame(uint8_t* buffer, size_t len, uart_health_report_t* report);
|
|||
|
|
int validate_health_report(uart_health_report_t* report);
|
|||
|
|
void handle_health_report(uart_health_report_t* report);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 7.3 超时监控
|
|||
|
|
```c
|
|||
|
|
// 300ms超时定时器
|
|||
|
|
void start_uart_timeout_timer(void);
|
|||
|
|
void stop_uart_timeout_timer(void);
|
|||
|
|
void uart_timeout_handler(void); // 触发GPIO复位
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 8. 性能指标
|
|||
|
|
|
|||
|
|
| 指标 | 要求 | 测试方法 |
|
|||
|
|
|------|------|----------|
|
|||
|
|
| 传输延迟 | ≤10ms | 示波器测量 |
|
|||
|
|
| 误码率 | ≤10⁻⁶ | 长时间压力测试 |
|
|||
|
|
| CPU占用 | ≤5% | 性能分析工具 |
|
|||
|
|
| 内存占用 | ≤1KB | 内存分析 |
|
|||
|
|
|
|||
|
|
## 9. 测试用例
|
|||
|
|
|
|||
|
|
### 9.1 正常通信测试
|
|||
|
|
- 发送标准健康报告帧
|
|||
|
|
- 验证MCU正确解析和处理
|
|||
|
|
|
|||
|
|
### 9.2 异常处理测试
|
|||
|
|
- CRC校验失败帧
|
|||
|
|
- 超时场景模拟
|
|||
|
|
- 数据异常场景
|
|||
|
|
|
|||
|
|
### 9.3 边界条件测试
|
|||
|
|
- 最大CPU负载 (100%)
|
|||
|
|
- 最大内存使用 (100%)
|
|||
|
|
- 极端温度值 (-40℃, 85℃)
|
|||
|
|
|
|||
|
|
## 10. 与SPI协议的关系
|
|||
|
|
|
|||
|
|
- **主备关系**: SPI为主通道,UART为监控通道
|
|||
|
|
- **独立性**: UART不依赖SPI状态,独立工作
|
|||
|
|
- **协同**: UART超时可触发SPI复位,反之亦然
|