Controller Area Network,控制器局域网,是一种广泛应用于汽车和工业领域的串行通信总线。1993年时,这一协议被标准化为ISO 11898。
CAN的总线设计围绕可靠性于实时性展开,主要特点如下:
多主架构与自由通信:网络不分主从,任何节点均可在总线空闲时主动发送信息
无仲裁机制:当多个节点同时发送时,通过标识符ID逐位仲裁,ID越小优先级越高。
短帧结构与高可靠性:传统CAN一帧数据8字节,配合CRC校验与重传提高可靠性。
差分信号传输:使用H和L两根线进行信号传输,抗干扰能力强。
2012年发布CANFD作为灵活数据速率的CAN总线。CANFD支持了更高速率的主频(传统CAN是1Mbps是,使用FD的话可以跑到 5Mbps),并且数据位更宽了(32位)。
对CAN来说,核心通信线路只有几根:
H位负责高位信号
L位负责低位信号
GND地线用于调压
屏蔽双绞线(如果需要支持1Mbps以上的话)
CAN协议简介
CAN协议的文档可以参考:
从CAN总线的文档描述来看,总线协议从底层物理到上层数据管理分为五个层级:

报文角度,分为5层(最后3个都是物理层)
LLC层,逻辑链路控制层,这是最上层,负责软件统计、过滤,以及软件方面的事宜
MAC层,介质访问控制层,封装解封装、帧编码、介质访问管理、错误检测、应答确认
Physical Layer层,把逻辑信号变成实际电平,下面具体展开为3个小层
PLS层,物理信令层,负责位编码、解码、位定时、同步
PMA层,物理介质连接层,负责收发器芯片的特性描述
MDI层,介质相关接口层,物理连接器与线缆
CAN的报文格式:

SOF,起始帧,用来告诉总线上所有节点,有数据要发送了,准备同步
Arbitration Field,仲裁,包含一个ID和一个标志位,就是cansend中发送的ID,用于决定谁先获取总线控制权,ID越小优先级越高
Control Field,包含DLC(数据长度代码)以及IDE(标准帧还是扩展帧,数据帧还是远程帧、CAN报文还是CANFD报文)
Data Field,数据,用于传输真正的业务数据,CAN是0~8,CANFD是最大到64
CRC,就是校验位
ACK,就是应答位
END,就是终止符
CAN外设简介
在kernel的官方文档中,是将can总线当作一种网络设备,遵循同样的interface与socket调用结构。跟网口类似的,需要使用socket-->ioctl-->bind的方式来进行系统调用。参考文档是:
在kernel的源代码中,/net/can目录下是协议栈的内容,/drivers/net/can下面是具体的外设厂商驱动的内容:
博世系列,主要分为现代的核心m_can系列、经典的核心c_can系列
各个汽车厂商的内置SOC,如NXP(恩智浦/飞思卡尔)、Renesas(瑞萨)、Texas Instruments(TI,德州仪器)、Microchip(原 Atmel)、Allwinner(全志)、Xilinx(AMD)、Aeroflex Gaisler 的航天/嵌入式 IP 核
工控与小板子,如通过 SPI 接口连接的独立 CAN 芯片、USB 转 CAN 适配器等
vCAN,虚拟设备,用于测试

kernel相关的can的文档维护由德国的Marc Kleine-Budde维护:
https://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git/tree/drivers
CAN测试方法
CAN的测试方法主要分为can-utils这一linux侧的工具,以及由CAN协议分析仪厂商给出的一套CAN的软件测试方案。
can-utils主要功能:
cangw,利用内核的 CAN 网关功能做转发配置
candump,把总线上所有报文打印出来
cansend,发送单条CAN报文
cangen,生成随机或指定模式的CAN流量
cansniffer,显示数据正在变化的报文
canplayer,回放之前由candump -l录制的日志文件
93