CAN overview

来自百问网嵌入式Linux wiki
Wiki讨论 | 贡献2020年11月6日 (五) 15:28的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

本文提供有关 Linux® 控制器局域网(CAN)框架的信息。 它说明了如何激活CAN接口以及基于示例的使用方法。

Framework purpose

Controller Area Network(CAN)是一种多主机串行总线标准,它连接至少两个节点。 它是一种基于消息的协议,最初是为车载通信而设计的,其主要优点是显着减少了接线并防止了消息冲突。

为了获得更好的实时性能,具有灵活数据速率(CAN FD)的CAN[1] 用作经典CAN协议的扩展[2]. 它允许的数据速率高于1 MBit/s有效载荷则超过每帧8个字节(最多64个数据字节)。

SocketCAN [3] 是用于Linux内核的统一CAN框架。 它实现了一个名为PF_CAN[4] 并允许应用程序通过具有CAN特定套接字选项的套接字API接收和传输CAN消息。 您可以在汽车行业找到CAN的许多应用。在车辆中,它允许电子控制单元和设备在没有主机的情况下在应用程序中相互通信。例如,高速CAN总线专用于安全设备,例如紧急制动系统或安全气囊。另一种低速CAN总线专用于舒适设备,例如室内照明或座椅控制。

本文介绍了CAN框架的主要组件和API,并提供了CAN使用示例。

System overview

Alternate text
CAN Overview

Component description

从用户空间到硬件

  • 应用 (用户空间)

读取/写入 SocketCAN interface,用于与CAN网络上连接的外部设备(例如can-utils)进行通信。

  • CAN 工具 (用户空间)

一组实用程序,用于配置和启用SocketCAN接口(例如iproute2)。

  • SocketCAN (内核空间)

具有特定CAN选项的套接字接口,该选项建立在Linux网络层上。

  • Linux套接字层和CAN协议(PF_CAN) (内核空间)

协议系列PF_CAN[4],为传输协议模块的注册提供了API,并提供了在总线上启用不同CAN协议的结构。


  • Linux网络核心 (内核空间)

内核网络层,使消息适应所使用的传输协议。 Linux内核的网络子系统设计为完全独立于协议。

  • M_CAN Driver (内核空间)

驱动程序已实现为Bosch M_CAN控制器的网络接口[5].

  • CAN (硬件)

这是CAN Core IP。

  • CAN Transceiver (硬件)

CAN协议控制器和CAN总线的物理线路之间的接口。

API description

SocketCAN接口API描述可以在内核文档中找到 [3].

Configuration

Kernel configuration

使用Linux Menuconfig 工具在内核配置中激活CAN驱动程序。

要编译M_CAN驱动程序,请选择 "Bosch M_CAN 设备":

 [*] Networking support  --->                                                                                   
        <*>   CAN bus subsystem support  --->
                CAN Device Drivers  --->
                        <*>   Bosch M_CAN devices                 

默认情况下,ST交付中已激活M_CAN驱动程序。

Device tree configuration

CAN通用DT绑定:

  • M_CAN设备树绑定[6] 描述所有必需和可选的属性。

STM32内部外设的详细DT配置:

How to use the framework

必须通过netlink接口配置CAN设备。以下文章为用户空间示例提供了有关如何设置SockeCAN接口(以及配置位定时参数等设置)以及如何在CAN总线上发送/接收数据的示例。

How to set up a SocketCAN interface

如何设置SocketCAN接口

How to send/receive CAN data

如何发送或接收CAN数据

How to trace and debug the framework

How to trace

CAN框架,特别是M_CAN驱动程序,可以打印出信息和错误消息。您可以使用dmesg命令显示它们:

Board $> dmesg | grep m_can
[    1.327824] m_can 4400e000.can: m_can device registered (irq=30, version=32)
[   25.560759] m_can 4400e000.can can0: bitrate error 0.3%
[   25.564630] m_can 4400e000.can can0: bitrate error 1.6%

How to monitor CAN bus

您可以使用CAN FD适配器 PCAN-USB Pro FD[7]通过USB将计算机连接到CAN网络。该工具随附的PCAN-View软件是一个监视程序,可以监视CAN网络上的数据流并检测帧错误。

Source code location

源文件位于Linux内核中。

  • PF_CAN: af_can.c[4]
  • M_CAN driver: m_can.c[5]

To go further

CAN位时序计算在确保CAN网络性能方面起着重要作用。为避免传输错误,必须正确配置位时序。

有关CAN位时序的更多信息

  • 简化了CAN位时序参数的计算[8], 来自Automation group的CNA (CiA)
  • CAN位时序的配置[9], 来自 Bosch 文档。