CAN(Controller Area Network),是ISO国际标准化的串行通信协议,为了满足汽车产业的“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需求
低速CAN(ISO11519)通信速率10~125kbps,总线长度可达1000米
高速CAN(ISO11898)通信速率125~1Mbps,总线长度<=40米
CAN FD通信速率可达5Mbps,并且兼容经典CAN,遵循ISO11898-1做数据收发
CAN总线由两根线CANL和CANH组成,运行挂载多个设备节点(低速CAN:20,高速CAN:30)
CAN总线特点
1.多主控制 每个设备都可以主动发送数据
2.系统的柔软性 没有类似地址的信息,添加设备不改变原理总线的状态
3.通信速度 速度快,距离远
4.错误检测、通知、恢复功能
5.故障封闭 判断故障类型,并且进行隔离
6.连接节点多 速度与数量找个平衡
CAN总线协议已广泛应用在汽车电子、工业自动化、船舶、医疗设备、工业设备等
CAN物理层
CAN使用差分信号进行数据传输,根据CANH和CANL上的电位差来判断总线电平
总线电平分为显性电平(逻辑0)和隐性电平(逻辑1),二者必居其一
显性电平具有优先权。发送方通过是总线电平发送变化,将消息发送给接收方
CAN协议层
CAN总线以帧现实进行通信。CAN协议定义了5种类型的帧:数据帧、遥控帧、错误帧、过载帧、间隔帧,其中数据帧最为常用
数据帧:用于发送单元向接收单元传输数据的帧
遥控帧:用于接收单元向具有相同ID的发送单元请求数据的帧
错误帧:用于当检测出错误时向其他单元通知错误的帧
过载帧:用于接收单元通知其尚未做好接收准备的帧
间隔帧:用于将数据帧及遥控帧与前面帧分离开来的帧
数据帧
数据帧由7段组成。数据帧又分为标准帧(CAN2.0A)和扩展帧(CAN2.0B),主要体现在仲裁段和控制段
帧起始:表示数据帧开始的段,显性信号
仲裁段:表示该帧优先级的段,优先级
控制段:表示数据的字节数及保留位的段
数据段:数据的内容,一帧可发送0~8字节
CRC段:检查帧的传输错误的段
ACK段:表示确认正常接收的段
帧结束:表示数据帧结束的段,7个隐性信号
CAN位时序介绍
CAN总线以“位同步”机制,实现对电平的正确采样。位数据都由4段组成:同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每段又由多个位时序Tq组成
采样点是指读取总线的电平,并将读到的电平作为位值的点
根据位时序,就可以计算CAN通信的波特率
注意:节点检测到总线上信号的跳变在SS段范围内,表示节点与总线的时序是同步的,此时采样点的电平即该位的电平
数据同步过程
时钟频率误差、传输上的相位延迟引起偏差
CAN为了实现对总线电平信号的正确采样,数据同步分为硬件同步和再同步
硬件同步:节点通过CAN总线发送数据,一开始发送帧起始信号。总线上其他节点会检测帧起始信号在不在数据的SS段内,判断内部时许与总线是否同步
假如不在SS段内,这种情况下,采样点获得的电平状态时不正确的。所以节点会使用硬件同步方式调整,把自己的SS段平移到检测到边沿的地方,获得同步,同步情况下,采样点获得的电平状态才是正确的
再同步:再同步利用普通数据位的边沿信号(帧起始信号是特殊的边沿信号)进行同步
再同步的方式分为两种情况:超前和滞后,即边沿信号与SS段的相对位置
再同步时,PBS1和PBS2中增加或者减少的时间被称为“再同步补偿宽度(SJW)”,其范围:1~4Tq
限定了SJW值后,再同步时,不能增加限定长度的SJW值。SJQ值较大时,吸收误差能力更强,但是通讯速度会下降
CAN总线仲裁 优先级决定
CAN总线处于空闲状态,最先开始发送消息的单元获得发送权
多个单元同时开始发送时,从仲裁段(报文ID)的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送,即首先出现隐性电平的单元失去对总线的占有权变为接收
竞争失败单元,会自动检测总线空闲,在第一时间再次尝试发送
CAN控制器
CAN控制器的工作模式有三种:初始化模式、正常模式和睡眠模式
CAN控制器的测试模式有三种:静默模式、环回模式和环回静默模式(初始化模式下进行配置)
CAN控制器框图
CAN内核:包含各种控制/状态/配置寄存器,可以配置模式、波特率等
发送邮箱:用来缓存待发送的报文,最多可以缓存3个报文
接收FIFO:缓存接收到的有效报文
接收过滤器:筛选有效报文
发送处理
发生优先级由邮箱中报文的标识符决定。标识符数值越低优先级越高。如果标识符值相同,邮箱小的先被发送
接收处理
有效报文指的是(数据帧直到EOF段的最后一位都没有错误),且通过过滤器组对标识符过滤
接收过滤器
当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择性接收有效报文,减轻系统负担
每个过滤器组都有两个32位寄存器CAN_FxR1和CAN_FxR2。根据过滤器组的工作模式不同,寄存器的作用不尽相同
位宽可设置32位或16位,寄存器存储的内容就有所区别
选择模式可设置屏蔽位模式或标识符列表模式,寄存器内容的功能就有所区别
屏蔽位模式,可以选择出一组符合条件的报文,寄存器内容功能相对于是否符合条件
标识符列表模式,可以选择出几个特定ID的报文,寄存器内容功能就是标识符本身
REG中Bit值代表的是匹配与否:1必须匹配,0不用关心
CAN_FxR1作为标识符寄存器
CAN_FxR2作为屏蔽位寄存器
过滤出1组符合条件的报文
CAN_FxR1作为标识符寄存器
CAN_FxR2作为标识符寄存器
过滤出2个符合条件的报文
CAN_FxR1作为标识符寄存器和屏蔽位寄存器
CAN_FxR2作为标识符寄存器和屏蔽位寄存器
过滤出2组符合条件的报文
CAN_FxR1作为2个标识符寄存器
CAN_FxR2作为2个屏蔽位寄存器
过滤出4个符合条件的报文
CAN控制器位时许
CAN基本驱动步骤
1.CAN参数初始化 工作模式、波特率等HAL_CAN_Init
2.使能CAN时钟和初始化相关引脚 GPIO模式设为复用功能模式 HAL_CAN_MspInit
3.设置过滤器 HAL_CAN_ConfigFilter完成过滤器的初始化
4.CAN数据接收和发送 HAL_CAN_AddTxMessage发送消息
HAL_CAN_GetRxMessage接收消息
5.使能CAN相关中断/设置NVIC/编写中断服务函数 __HAL_CAN_ENABLE_IT可选