Skip to main content
控制器局域网(CAN)是一种基于消息的串行协议。术语 CAN 和 CAN 总线在同一语境中使用。CAN 的优势如下:
  • 使用 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 架构

图:CAN 架构

用户应用程序与 SocketCAN 提供的网络接口进行通信。软件驱动程序是 Linux 中 SPI 核心模块的客户端,QUP_SPI 驱动程序在该模块中注册。实际硬件通过 SPI 引脚连接。
CAN 软件栈

图: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)。
要下载 CAN 实用程序,请参阅 https://github.com/linux-can/can-utils 有关 CAN 驱动程序文件的信息,请参阅 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 扩展。
硬件设置
  1. 连接到 DB9 连接器。
    • PCAN 上有一个 DB9 连接器,任何标准 DB9 连接器都可以插入其中。
  2. 连接到 Qualcomm 设备。
    • 引出 CAN_H、CAN_L 和 GND 线。
    • 将这些线连接到两个 120 Ω 的终端电阻。
  3. 连接 CAN_H、CAN_L 和接地。
CAN 连接

图:CAN 连接

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

图:CAN 终端电阻

下图显示了已连接的硬件。
CAN USB FD、外部电阻和设备连接

图:CAN USB FD、外部电阻和设备连接

启动 CAN 接口

在构建 CAN 驱动程序并将其加载到内核后,以下命令序列会发送数据以确认 CAN 节点是否已启动。可以使用下表中列出的命令启动或停止 CAN 节点。
注意所有网络设备均使用 ifconfig -a
表: CAN 命令
操作说明命令
检查 can 节点编号ifconfig -a
设置 125 kbps 的比特率ip link set can0 up type can bitrate 125000
启动 CANip link set can0 up
停止 CANip 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 节点,必须定义总线的比特率,或者在总线速率已可用的情况下进行配置。此配置可确保 CAN 节点已启动并处于活动状态。有关 CAN 实用程序的更多详细信息,请参阅 https://manpages.debian.org/testing/can-utils/index.html

发送和接收数据

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。

CAN 示例

有关 CAN 示例,请参阅 https://github.com/linux-can/can-utils/blob/master/README.md