Files
ESP32_COMM/docs/can_protocol.md
T
小龙虾 5db3f66b8e feat(protocol): 更新SPI Link协议至v2版本并优化CAN通信
- 将SPI OTA帧格式升级为SPI Link v2,采用新的帧格式:
  | SOF0 0xA5 | SOF1 0x5A | VER 0x02 | FLAGS | SESSION 4B LE |
  TX_SEQ | ACK_SEQ | CREDIT | TYPE | LEN 2B LE | RSV 2B | PAYLOAD |
  CRC32 4B LE |
- 新增V2_OVERHEAD=20字节开销,APP最大payload为236字节,BOOT为108字节
- 修改帧类型定义:ENTER_BOOT从0xB5合并至0xB0,新增CAN业务类型0xC0~C3
- 更新CAN协议文档,支持SPI Link v2-only模式,调整最大业务payload计算
- 扩展0xC1帧功能,支持双向通信和1Hz主动推送ID快照
- 添加0xC3完整ID快照帧类型,包含seq/rx_count等完整字段
- 更新协议文档中的错误码定义和反馈payload格式

refactor(main): 重构主程序入口并添加CAN反馈任务

- 在main.cpp中添加CAN反馈任务,更新启动流程注释
- 创建createCriticalTask辅助函数,统一关键任务创建逻辑
- 调整SPI初始化顺序,确保CAN反馈任务依赖正确
- 优化错误处理机制,关键任务失败时立即重启
- 将GD32版本探测移至ota_relay任务处理
- 更新版本号至0.3.48,调整编译时间和Git哈希

config: 更新SPI和BLE配置参数

- 添加SPI主机相关配置参数,包括CS GPIO、READY GPIO等引脚定义
- 配置SPI缓冲区大小:APP为256字节,BOOT为128字节
- 更新BLE滑动窗口参数,ACK窗口设为32,数据队列深度为72
- 调整SPI工作队列大小至5120字节,增加任务堆栈监控说明
2026-07-16 23:00:15 +08:00

141 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CAN 通信协议文档
> 更新日期:2026-07-16
> 涉及固件:GD32 DCU_APP + ESP32 ESP32_COMM
> SPI:**Link v2 only** · 时钟 4 MHz
> APP 最大业务 payload:`kTxBufSize(256) - V2_OVERHEAD(20) = 236`
> BOOT 最大业务 payload:`kTxBufSize(128) - V2_OVERHEAD(20) = 108`
---
## 1. 概述
ESP32 通过 SPI Link v2 与 GD32 通信,实现三路 CAN/CANFD 的收发控制。CAN 相关 SPI 命令占用 `0xC0` ~ `0xC3`。
| 帧类型 | 名称 | 方向 | 用途 |
|--------|------|------|------|
| `0xC0` | kTypeCanSend | ESP32 → GD32 | 发送一帧 CAN 数据 |
| `0xC1` | kTypeCanFeedback | 双向 | 通道统计 + ID 快照页;GD32 亦可 1Hz 主动推送 |
| `0xC2` | kTypeCanSetMode | ESP32 → GD32 | 切换三路 CAN 接收过滤模式 |
| `0xC3` | kTypeIdSnapshot | ESP32 → GD32 | 完整 ID 条目(含 seq/rx_count) |
---
## 2. SPI 协议帧格式(v2)
所有 SPI 帧遵循 SPI Link v2(`spi_link/spi_link_v2.h`):
```
[SOF0 A5][SOF1 5A][VER 02][FLAGS][SESSION 4LE][TX_SEQ][ACK_SEQ][CREDIT][TYPE][LEN 2LE][RSV 2][PAYLOAD][CRC32 4LE]
```
- 开销 `V2_OVERHEAD = 20`
- CRC32 MPEG-2(`0x04C11DB7`,无反射)
- **无** v1 单字节 SOF + CRC8 路径
应答 TYPE 常用:`0x80` ACK · `0x81` WAIT · `0x82` ERROR
---
## 3. 0xC0 — CAN 发送
### 请求 payload
```
[0] channel 0/1/2
[1..4] ext_id 扩展帧 ID(Big-Endian,29 位)
[5..N] data CAN 数据负载(0~64 字节;可无,对应 DLC=0)
```
最短 payload 为 **5** 字节(仅 ch+id,DLC=0,例如 `CANFD_BOOT`)。
### 应答 payload
```
[0] 0x00(ACK)或错误码 E0~E5
```
| 码 | 含义 |
|----|------|
| E0 | payload 过短(< 5 字节) |
| E1 | 通道非法 |
| E2 | BUS_OFF |
| E3 | TEC 过高(>96,对端 ACK 失败率高) |
| E4 | 邮箱满 |
| E5 | 参数无效 |
---
## 4. 0xC1 — 通道统计 + ID 快照(核心)
GD32 可 1Hz 主动 `requestEsp32Read(0xC1)` 推送;ESP32 亦支持被动查询。
打包上限:`kFeedbackPayloadLen = kTxBufSize - V2_OVERHEAD = 236`。
### 请求 payload(被动)
```
[0] channel 0/1/2
[1] page 0 = 条目 0~7,1 = 条目 8~15
```
### 应答 / 推送 payload(变长)
固定头 **28** 字节 + 条目区:
```
[0] channel
[1] page
[2] total_count
[3] entry_count
[4] mode 0=全收 1=过滤 2=桥接
[5..8] snapshot_seq LE
[9..12] rx_count LE
[13..16] tx_count LE
[17..20] rx_drop_count LE
[21..24] error_count LE
[25] tec
[26] rec
[27] bus_state bit0=init … bit3=bus_off bit4=EW
[28..] 条目
```
### 单条目(8 + dlc)
```
[+0..+3] id LE
[+4] dlc
[+5] flags bit0=FD bit1=BRS bit2=ESI
[+6..+7] reserved
[+8..] data
```
---
## 5. 0xC2 — 模式切换
```
req[0] mode 0=全收 1=过滤 2=CAN0→1/2 桥接
rsp[0] actual 生效 mode
```
---
## 6. 0xC3 — ID 快照(完整字段)
固定头 4B + 条目 `(16 + dlc)`(含 id/seq/rx_count/dlc/flags/rsv/data)。
上限同 APP:`256 - V2_OVERHEAD = 236`。
---
## 7. 实现索引
| 端 | 文件 |
|----|------|
| GD32 0xC1/C2 | `DCU_APP/.../app_spi_cmd_can_feedback.cpp` |
| GD32 0xC3 | `app_spi_cmd_id_snapshot.cpp` |
| GD32 0xC0 | `app_spi_cmd_can_bridge.cpp` |
| ESP32 解析/桥 | `ESP32_COMM/main/transport/canfd_bridge.*` |
| ESP32 读预算 | `spi_master.cpp` → `spiRespReadBudget()` |
| 帧格式 | `spi_link/spi_link_v2.h` |
| 图示文档 | `SPEC/communication_ids.html` · `SPEC/spi_flow_diagram.html` |