[嵌入式系统-152]:CAN总线最大数据只有8个字节,CAN FD最大才64个字节,这么小的数据量,如何进行稍大一点的数据传输?
- 经典 CAN:单帧最大 8 字节
- CAN FD:单帧最大 64 字节
虽然 CAN FD 提升了 8 倍,但对于传输固件升级包、传感器配置、诊断数据、状态日志等稍大一点的数据(如几 KB 到几 MB),仍然远远不够。
那么,如何在 CAN/CAN FD 总线上实现“大”数据传输?
答案是:通过分包传输协议(Segmented Transfer Protocol),将大数据“拆成小包”,在总线上一帧一帧发送,接收端再“重新组装”。
一、核心解决方案:分包传输协议
1. ISO 15765-2:传输协议与网络层(TP)
这是最主流、最标准的解决方案,常被称为 CAN TP 或 DoCAN(Diagnostic communication over CAN)。
✅ 它是 ISO 14229 UDS(统一诊断服务)和 ISO 15031(车载排放诊断)的基础。
🔧 工作原理
帧类型 | 说明 |
---|---|
单帧(Single Frame, SF) | 数据 ≤ 7 字节(CAN)或 ≤ 62 字节(CAN FD),一帧发完 |
首帧(First Frame, FF) | 数据 > 7/62 字节时,发送首帧,包含总长度(0–4095 字节) |
连续帧(Consecutive Frame, CF) | 后续数据帧,按序发送,带序列号(0–15 循环) |
流控帧(Flow Control, FC) | 接收方控制发送节奏(避免溢出) |
🔄 传输流程(以 CAN 为例,传输 200 字节)
发送方(Tester) 接收方(ECU)│ ││ FF: [0x10][0xC8][data_0..5] ││─────────────────────────────────────▶│ ← 首帧:总长 200 字节,发前 6 字节│ ││ FC: [0x30][0x03][0xFF] ││◀─────────────────────────────────────│ ← 流控:允许发3帧,间隔≥1ms│ ││ CF: [0x21][data_6..13] ││─────────────────────────────────────▶││ CF: [0x22][data_14..21] ││─────────────────────────────────────▶││ CF: [0x23][data_22..29] ││─────────────────────────────────────▶│ ← 连续帧,每帧8字节│ ││ FC: [0x30][0x03][0xFF] ││◀─────────────────────────────────────│ ← 再次流控│ ││ ...(继续发送 CF)... ││ ││ CF: [0x18][...][data_199] ││─────────────────────────────────────▶│ ← 最后一帧│ ││ ← ECU 处理完成,返回响应 │
✅ 总数据量:200 字节,通过 1 FF + 25 CF = 26 帧完成。
2. CAN FD 下的 UDS TP(ISO 15765-2 扩展)
CAN FD 支持最大 64 字节数据,因此分包效率更高:
帧类型 | CAN FD 可用数据字节数 |
---|---|
SF | 最多 62 字节(2 字节控制信息) |
FF | 最多 61 字节(3 字节控制信息) |
CF | 最多 61 字节(3 字节控制信息) |
📈 效率对比:
- 传输 1000 字节:
- CAN:需 ~125 帧(每帧 8 字节有效数据)
- CAN FD:仅需 ~17 帧(每帧 61 字节有效数据) → 效率提升 7 倍!
二、其他大数传方案(非 UDS)
1. 基于应用层的自定义分包协议
适用于非诊断场景,如:
- 固件升级(Bootloader)
- 参数批量写入
- 日志上传
示例:自定义分包格式
// 首帧
[0x01] [总长度低8] [总长度高8] [数据...]
// 连续帧
[0x02] [序号] [数据...]
// 结束帧(可选)
[0x03] [校验和]
优点:灵活、轻量
缺点:需自定义,无标准工具支持
2. 使用 CANopen 协议栈(工业领域)
- SDO(Service Data Object):支持分段上传/下载对象字典数据
- PDO(Process Data Object):用于实时小数据,不适用大数传
3. 网关 + 其他高速总线(混合架构)
当数据量极大(如摄像头、地图更新),不依赖 CAN 总线:
[主控 SoC] │├── CAN FD ───→ [电机控制器](实时控制)├── Ethernet ──→ [激光雷达](点云数据)├── USB ───────→ [固态硬盘](日志存储)└── Wi-Fi/5G ──→ [云端](OTA 升级包下载)
✅ 现代智能汽车/机器人采用“多总线融合”架构:
- CAN FD:实时控制、状态同步
- Ethernet:高带宽传感器
- 5G/Wi-Fi:大文件传输、远程诊断
三、实际应用案例
场景 | 数据量 | 传输方式 |
---|---|---|
UDS 诊断读取 DTC | < 100 字节 | 单帧或少量连续帧 |
读取电池单体电压(100节) | ~200 字节 | UDS TP 分包 |
写入电机控制参数(50个) | ~300 字节 | UDS TP 或自定义协议 |
OTA 固件升级(1MB) | 1,048,576 字节 | ❌ 不走 CAN ✅ 通过以太网/5G 下载,再通过 CAN FD 分块写入 Flash |
机器人关节校准数据上传 | 5 KB | CAN FD + 自定义分包协议 |
四、性能估算(CAN FD)
假设:
- 波特率:仲裁段 500 kbps,数据段 2 Mbps
- 每帧有效数据:61 字节
- 帧间隔:1 μs
传输 1 KB(1024 字节)所需时间:
- 帧数:
ceil(1024 / 61) = 17 帧
- 每帧时间 ≈ 400 μs(含传输+间隔)
- 总时间 ≈ 6.8 ms
✅ 完全满足大多数非实时大数传需求(如诊断、配置)。
五、总结
问题 | 解决方案 |
---|---|
CAN/CAN FD 单帧数据小 | ✅ 使用 分包协议(如 ISO 15765-2 / UDS TP) |
如何保证可靠性 | ✅ 流控(FC)、序列号、超时重传 |
大数据(>100KB)怎么办 | ✅ 采用 多总线架构:CAN FD 用于控制,Ethernet/5G 用于大文件 |
如何提升效率 | ✅ 优先使用 CAN FD,减少分包数量 |
🔑 核心思想:
CAN/CAN FD 不是“高速公路”,而是“高可靠的小型快递网络”。
它通过“分拆包裹 + 编号投递 + 签收确认”的机制,安全、可靠、标准化地传输任意大小的数据,是汽车和机器人系统中不可或缺的“神经末梢通信方式”。