7.5.10 CAN 使用指南
基本概述
- 最大可使用 CAN controller 数量:10。
- CAN 最高传输速率:8M。(受限于 transceiver 的波特率限制,目前实验室只测试验证到5M 波特率。)
- 一个 controller 的 Ram 内划分的 Block 个数:
- CAN0-CAN3:4 Block (可变 payload);
- CAN4-CAN9:4 Block (可变 payload)+ 4 Block(固定 payload)。
- 一个 controller 支持的最大 Mailbox 个数为128。
- 一个 controller 支持一路 RxFIFO,FIFO 深度为:
- CAN0-CAN3:8 * 64 bytes;
- CAN4-CAN9:32 * 64 bytes。
- 不支持 TTController,即不支持 TTCAN(一种基于 CAN 总线的高层协议)。
- CAN 支持多包合并传输,并且可以配置合包的数量和超时时间,默认合包数量为1,超时时间为1000us。
- 最大可使用 CAN controller 数量:16。
- CAN 最高传输速率:8M。(受限于 transceiver 的波特率限制,目前实验室只测试验证到5M 波特率。)
- 一个 controller 的 Ram 内划分的 Block 个数:
- CAN0-CAN3:4 Block (可变 payload);
- CAN4-CAN11:4 Block (可变 payload)+ 4 Block(固定 payload)。
- CAN12-CAN15:4 Block (可变 payload);
- 一个 controller 支持的最大 Mailbox 个数为128。
- 一个 controller 支持一路 RxFIFO,FIFO 深度为:
- CAN0-CAN3:8 * 64 bytes;
- CAN4-CAN11:32 * 64 bytes;
- CAN12-CAN15:8 * 64 bytes;
- 考虑到系统层面的唤醒功能,软件驱动不支持 controller 的 PretendedNetwork 功能。
- 不支持 TTController,即不支持 TTCAN(一种基于 CAN 总线的高层协议)。
- CAN 支持多核使用,可将不同 的 CAN 控制器绑定在不同的核心上,但不支持多个核心同时使用同一个 CAN 控制器。
软件架构
S100芯片的 CAN 控制器位于 MCU 域,负责 CAN 数据收发。由于感知等应用位于 Acore,因此部分 CAN 数据需要通过 IPC 核间通信机制转发到 Acore。架构保证传输可靠性,转发机制实现数据正确性检测、丢包检测和传输超时检测等机制。此外,还需要规避 MCU 侧高频转发小数据块导致 CPU 占用率过高,造成 MCU 实时性降低等性能问题。
S100 CAN 转发方案的核心流程如下:
- 首先通过 MCU 侧 CAN2IPC 模块将 CAN 通道映射到对应 IPC 通道,然后通过 Acore 侧 CANHAL 模块将 IPC 通道反映射为虚拟 CAN 设备通道。最后用户通过 CANHAL 提供的 API 接口获取虚拟 CAN 设备中的数据。其中,CAN2IPC 模块为 MCU 侧服务,CANHAL 模块为 Acore 侧提供给应用程序的动态库。
- CAN 采用中断的方式接收数据,当接收到数据之后调用 CAN2IPC 模块,CAN2IPC 模块将 MCU 侧 CAN 数据,按照指定传输协议进行打包,然后通过 IPC 核间通信转发到 Acore。Ipc instance 0和 Ipc instance 4分配给 can 使用,默认使能 can5-can9, can5-can9与 IPC 对应关系如下表:
| Ipc_ShmCfgInstances | channel | |
|---|---|---|
| can0 | 0 | - |
| can1 | 0 | - |
| can2 | 0 | - |
| can3 | 0 | - |
| can4 | 0 | - |
| can5 | 0 | 4 |
| can6 | 0 | 6 |
| can7 | 4 | 7 |
| can8 | 4 | 2 |
| can9 | 0 | 3 |
- CANHAL 模块获取来自 MCU 侧的 IPC 数据,按照指定的传输协议解析数据,并支持业务软件通过 API 获取原始 CAN 帧。
S600芯片的 CAN 控制器位于 MCU 域,负责 CAN 数据收发。由于感知等应用位于 Acore,因此部分 CAN 数据需要通过 IPC 核间通信机制转发到 Acore。架构保证传输可靠性,转发机制实现数据正确性检测、丢包检测和传输超时检测等机制。此外,还需要规避 MCU 侧高频转发小数据块导致 CPU 占用率过高,造成 MCU 实时性降低等性能问题。
S600 CAN 转发方案的核心流程如下:
- 首先通过 MCU 侧 CAN2IPC 模块将 CAN 通道映射到对应 IPC 通道,然后通过 Acore 侧 CANHAL 模块将 IPC 通道反映射为虚拟 CAN 设备通道。最后用户通过 CANHAL 提供的 API 接口获取虚拟 CAN 设备中的数据。其中,CAN2IPC 模块为 MCU 侧服务,CANHAL 模块为 Acore 侧提供给应用程序的动态库。
- CAN 采用中断的方式接收数据,当接收到数据之后调用 CAN2IPC 模块,CAN2IPC 模块将 MCU 侧 CAN 数据,按照指定传输协议进行打包,然后通过 IPC 核间通信转发到 Acore。Ipc instance 0和 Ipc instance 4分配给 can 使用,默认使能 can1-can10, can1-can10与 IPC 对应关系如下表:
| Ipc_ShmCfgInstances | channel | |
|---|---|---|
| can0 | 0 | - |
| can1 | 0 | 1 |
| can2 | 0 | 2 |
| can3 | 0 | 3 |
| can4 | 4 | 4 |
| can5 | 0 | 4 |
| can6 | 4 | 0 |
| can7 | 4 | 1 |
| can8 | 4 | 2 |
| can9 | 4 | 3 |
| can10 | 4 | 5 |
- CANHAL 模块获取来自 MCU 侧的 IPC 数据,按照指定的传输协议解析数据,并支持业务软件通过 API 获取原始 CAN 帧。
数据流如上图所示:
- 外设数据通过 CAN 的 PHY 和控制器器件被 MCU 域 CAN 驱动接收后,CAN 驱动将数据上报并缓存在 hobot CANIF 模块。
- 满足合包个数或超时时间,调用 CAN2IPC 模块,按照可靠传输协议进行打包,然后通过 IPC 核间通信机制转发给 Acore。
- CANHAL 模块获取来自 MCU 侧的 IPC 数据,按照指定的传输协议解析数据,Acore 应用程序通过 CANHAL Lib 库提供的 API 获取 CAN 帧。
方案特性说明:
- 支持数据透传正确性校验。
- 支持数据透传丢包检测。
- 支持传输超时检测。MCU 侧 CAN2IPC 转发数据时将数据包打上 MCU 侧的时间戳,Acore CANHAL 接收到数据后会读取 Acore 的时间戳,如果传输超时会报警。注意,需要提前启动时间同步完成 MCU RTC 时间和 Acore 网卡 phc0的时间同步。
- 支持多个 CAN 通道并行传输。MCU 侧多个 CAN 控制器的数据可同时被转发给 Acore,Acore 应用程序通过 CANHAL 从不同通道号读出 CAN 数据。
- 由于 CANHAL 底层通过 ipc 核间通信进行传输,而 ipc 目前不支持多个进程或者线程读写同一个通道,因此 CANHAL 也不支持该特性。