返回首页

ISO-TP 驱动程序:针对 CAN 的实现和测试

本文分析了 Raccoon Developers 的 ISO-TP 驱动程序,用于通过 CAN 传输高达 4094 字节的数组。描述了 API、依赖项、单元测试以及使用 USB-CAN 的硬件验证。突出了多实例的优势以及同时 Tx/Rx 的限制。

在 CAN 上测试 ISO-TP:raccoon 驱动程序实战
Advertisement 728x90

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(分离时间)、寻址类型以及最大数据包大小。

Google AdInline article slot

依赖项与内部架构

该驱动依赖通用 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 字节,多帧使用带确认的顺序块。

Google AdInline article slot

无需硬件的测试

模块化测试在一个程序中模拟三个 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。

Google AdInline article slot

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

Advertisement 728x90

继续阅读