CAN 网络 ISO-TP 驱动实用详解(Raccoon Developers 提供)
ISO-TP (ISO 15765-2) 通过对大数据数组进行分片,解决了 CAN classic 每帧仅 8 字节的限制。Raccoon Developers 的驱动通过四个关键函数实现该协议:初始化、发送、入队接收帧以及处理。它使用 FIFO 队列支持高达 4094 字节的数据包,用于帧组装。
驱动 API:
n_rslt iso15765_init(iso15765_t* instance);
n_rslt iso15765_send(iso15765_t* instance, n_req_t* frame);
n_rslt iso15765_enqueue(iso15765_t* instance, canbus_frame_t* frame);
n_rslt iso15765_process(iso15765_t* instance);
初始化需要运行时间、帧发送、错误处理和接收指示的回调。可配置 BS(块大小)、STmin(分离时间)、寻址类型以及最大数据包大小。
依赖项与内部架构
该驱动依赖通用 iqueue 队列来存储传入的 CAN 帧。I15765_QUEUE_ELMS 常量定义缓冲区深度。
i_status iqueue_init(iqueue_t* _queue, uint32_t _max_elements,
size_t _element_size, void* _storage);
i_status iqueue_enqueue(iqueue_t* _queue, void* _element);
i_status iqueue_dequeue(iqueue_t* _queue, void* _element);
接收过程将 FirstFrame 和 ConsecutiveFrame 中的数据重新组装成完整的负载。完成后,会调用 indn() 回调并传入完整负载。回调处理后数据将被清除。
通过 iso15765_send() 发送支持高达 4094 字节(12 位长度字段)。单帧上限 8 字节,多帧使用带确认的顺序块。
无需硬件的测试
模块化测试在一个程序中模拟三个 ISO-TP 实例间的交换。将发送回调重定向到接收端的入队函数,并比较发送和接收负载的 CRC32。
24 字节发送测试的示例日志:
- TxSize:24 Byte, TxCrc32:0x8295A696
- RxFirstFrame: MesgSize:24 Byte
- ConsecutiveFrame: SN=1, Payload:000102...17181920212223
- DataMatch! Size:24 Byte
测试确认了正确的组装和验证。耗时约 863 ms。
USB-CAN 上的硬件验证
用于真实流量时,采用 USB2CANFD_V1 适配器。CANcat 是一个类似 netcat 的 ISO-TP 控制台工具。
成功示例:
- 进程间传输 0x3344556656565656565656。
- 从 0xd 到 0xc 的巨型帧 0x11223344556677889900aabbccddeeff。
- 双向单帧传输。
日志显示正确处理 FirstFrame(FS=0, BS=3)、ConsecutiveFrame 和流控。
主要优势与限制
优势:
- 支持多个独立配置的实例(CAN、UART)。
- 纯 C 语言,核心代码约 1000 行。
- 无需重新编译即可双向模式。
限制:
- 无法通过 -Werror=strict-prototypes 编译。
- 无同时 Tx/Rx——发送会中断接收。
- 如果主设备丢失,会无限等待 ConsecutiveFrame。
- CAN classic 中的单帧会直接解释 8-15 字节,而不进行检查。
关键要点
- 该驱动适用于需要 UDS over ISO-TP 的嵌入式 CAN 项目。
- 超级循环处理:在 Rx 时入队、高频处理、在请求时发送。
- indn() 后负载将被清除——请在回调中复制数据。
- 先模块化测试算法,再上硬件验证。
- 每会话最大 4094 字节,受 12 位长度字段限制。
— Editorial Team
暂无评论。