- 使用 CSMA/CD 方法和逐位竞争机制在位级别感知总线并传输消息。
- 每条消息都被分配一个优先级。优先级最高的消息始终控制总线仲裁。由于仲裁基于位,因此存在显性和隐性位电平。
- 任何节点都可以随时发送数据,没有主从节点之分。
- 所有数据都通过两条(差分对)线路传输:CAN_H 线和 CAN_L 线。
- CAN 节点使用位同步进行同步,其中每个位时间被划分为四个时间份额(time quanta)段。
- 通过基于消息的协议实现多个节点之间的通信,无需大量布线。
- 通过包括检测、发信和纠正在内的错误管理来确保数据安全。
注意
- QCS6490 和 QCS5430 中默认启用 CAN。
- Dragonwing IQ-9075、Dragonwing IQ-8275 和 Dragonwing IQ-615 不支持 CAN。
CAN 功能
CAN 协议支持以下功能。- 基于优先级的多控制器总线访问
- 基于内容的非破坏性仲裁
- 通过全帧传输进行广播
- 通过接收过滤进行多播帧传输
- 远程数据请求
- 配置灵活性
- 全网络数据一致性
- 错误检测和错误发信
- 自动重传在传输过程中失去仲裁、缺少应答或遇到错误的帧
- 识别节点临时错误与永久性节点故障之间的差异,并自动停用故障节点
CAN 架构
MCP2517 是一个外部可配置的 CAN 控制器,可通过 SPI 线路访问。SPI 接口支持高达 20 MHz,并支持 Mode0,1。该控制器连接到一个 QUP 模块,其中 SE3 配置为 4 引脚 SPI 操作。SPI 控制器连接到一个收发器(MCP2561xxx),收发器再连接到 CAN 总线。SPI 控制器和 CAN 收发器的电源输入来自 SoC。
图:CAN 架构
用户应用程序与 SocketCAN 提供的网络接口进行通信。软件驱动程序是 Linux 中 SPI 核心模块的客户端,QUP_SPI 驱动程序在该模块中注册。实际硬件通过 SPI 引脚连接。
图:CAN 软件栈
CAN API
有关 CAN 公共 API,请参阅 https://www.kernel.org/doc/Documentation/networking/can.txt。CAN 示例和工具
下表列出了用于显示、记录、生成和重放 CAN 流量的 SocketCAN 用户空间实用程序和工具。 表: SocketCAN 实用程序| 实用程序 | 描述 |
|---|---|
candump | 用于显示、过滤 CAN 数据并将其记录到文件。 |
canplayer | 用于重放 CAN 日志文件。 |
cansend | 用于发送单个帧。 |
cangen | 用于生成(随机)CAN 流量。 |
cansniffer | 用于显示 CAN 数据内容差异(仅限 11 位 CAN ID)。 |
kernel/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c。
CAN 分析仪 - PCAN-USB FD
PCAN-USB FD 是一款多功能的 CAN 数据包/消息嗅探器,可以作为任何 CAN 总线上的节点运行,支持灵活的数据速率。它可用于通过 USB 在主机上嗅探和发送 CAN 数据包。主要特性如下:- PCAN-View GUI 工具
- 提供根据用户需求嗅探和发送 CAN 数据包的便捷方式。
- 在开发和测试期间监控和调试 CAN 数据包。
- PCAN-USB FD 接口
- 可轻松连接到 CAN FD 和 CAN 网络。
- 紧凑的塑料外壳,适用于移动应用。
- 高达 500 V 的电气隔离将 PC 与 CAN 总线解耦。
- CAN FD 标准
- 具有更高的数据传输带宽。
- 每个 CAN FD 帧最多可传输 64 个数据字节(而不是 8 个)。
- 支持高达 12 Mbit/s 的比特率。
- 向下兼容 CAN 2.0 标准。
- CAN FD 节点可插入现有 CAN 网络,无需 CAN FD 扩展。
- 连接到 DB9 连接器。
- PCAN 上有一个 DB9 连接器,任何标准 DB9 连接器都可以插入其中。
- 连接到 Qualcomm 设备。
- 引出 CAN_H、CAN_L 和 GND 线。
- 将这些线连接到两个 120 Ω 的终端电阻。
- 连接 CAN_H、CAN_L 和接地。

图:CAN 连接
- 连接外部终端电阻。
注意该设备没有内置 120 Ω 终端电阻。这一点至关重要,因为某些工具提供了对终端电阻的内置支持。

图:CAN 终端电阻
下图显示了已连接的硬件。
图:CAN USB FD、外部电阻和设备连接
启动 CAN 接口
在构建 CAN 驱动程序并将其加载到内核后,以下命令序列会发送数据以确认 CAN 节点是否已启动。可以使用下表中列出的命令启动或停止 CAN 节点。注意所有网络设备均使用
ifconfig -a。| 操作说明 | 命令 |
|---|---|
| 检查 can 节点编号 | ifconfig -a |
| 设置 125 kbps 的比特率 | ip link set can0 up type can bitrate 125000 |
| 启动 CAN | ip link set can0 up |
| 停止 CAN | ip link set can0 down |
| 检查 CAN 配置 | ip -details link show can0 |
| CAN 内部环回 | ip link set can0 up type can bitrate 500000 loopback on |
| CAN FD 内部环回 | ip link set can0 up type can bitrate 1000000 dbitrate 5000000 fd on loopback on |
| 发送 CAN FD 帧 | cansend can0 213##311223344 |
发送和接收数据
CAN-Utils 文件中提供了一些实用程序。SocketCAN 使 CAN 节点能够发送和接收数据。SocketCAN API 也可用于自定义应用程序。
- 使用 11 位 ID 发送数据
- 使用 29 位 ID 发送数据
- 查看 can0 节点上当前传入的数据
配置 CAN 接口
SocketCAN 是 CAN 协议在 Linux 上的实现。SocketCAN 使用 Berkeley 套接字 API 和 Linux 网络栈,并将 CAN 设备驱动程序实现为网络接口。CAN 套接字 API 的设计尽可能与 TCP/IP 协议相似,使熟悉网络编程的用户能够轻松学习如何使用 CAN 套接字。初始化硬件
驱动程序会初始化并配置底层硬件模块。初始化在调用driver's _probe() 函数之后进行。
调试 CAN 问题
可以使用ftrace 工具调试 CAN 问题。MCP2517 驱动程序支持 dev_coredump() API。

