部分内容可以参考:https://blog.csdn.net/xwwwj/article/details/105372234?
CAN概念简介
CAN是Controller Area Network 的缩写
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。根据具体使用场景和传输介质以及波特率的不同CAN协议有很多种
CAN特点
下面图引用参考连接中的两张
物理信号特点
一、CAN总线的逻辑信号是根据两根线(CAN-LOW,CAN-High)的压差确定的,
二、总线上连根线的压差是0,则对应信号逻辑1;压差是2.5v左右,则对应信号逻辑0.这和普通的认知不太一样
三、逻辑0对应的是显性信号,逻辑1对应的是隐性信号
协议特点分析
一、总线上每个设备都有发送信息的权力。根据发送信息帧中包含的ID(标识符)的优先级确定那个做为可以发送的设备。对优先级判断是通过仲裁得到结果
二、由于CAN中无地址的概念,只有一个可以表示优先级高低的标识符(ID),因此多加入设备也不用考虑物理地址连线的问题
三、速度快
四、每个设备都会检测错误;若出现错误,本设备也会立即停止发送,并立即会将这个错误通知所有其他设备;这个单元会重新发送这个消息直到成功。
五、判断故障种类,若是持续故障,这个设备会被总线隔离
六、根据二中提到的协议方式,理论上可连接无数设备,但根据实际情况中的电气特点,负载多通信时间会慢。但相比于其他需要地址的协议来说,CAN总线能连接的设备还是很多的
CAN通信共有5中帧类型
数据帧和遥控帧有标准格式和扩展格式两种格式。 标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID
数据帧
D为显性电平逻辑0,R为隐形电平逻辑1,以下也是
帧起始:标准帧和扩展帧都是由一个显性电平表示帧起始(1→0)
仲裁段:两种格式。
仲裁段有以下特点:
ID(identify):高位在前,低位在后。
基本ID,禁止高7位都为隐性,即不能:ID=1111111XXXX。
RTR,远程请求位。0,数据帧;1, 远程帧;
SRR,替代远程请求位。设置为1(隐性电平);
IDE,标识符选择位。0,标准标识符;1,扩展标识符;
控制段:6个位构成,但并不是表示数据段字节数0~26 个字节,只有0-8个字节有效,但接收方不认为9-15个字节错误
r0,r1:保留位。必须以显现电平发送,但是接收可以是隐性电平。
DLC:数据长度码。0~8,表示发送/接收的数据长度(字节)。
IDE,标识符选择位。0,标准标识符;1,扩展标识符;
数据段:从上段可知,数据段可传送最多8字节。也就是64个bit位。从最高位(MSB)开始输出
循环冗余校验(Cyclic Redundancy Check, CRC)CRC段。该段用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的:
CRC的值计算范围包括:帧起始、仲裁段、控制段、数据段。
接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
CRC段计算方式参考:https://blog.csdn.net/qq_37960317/article/details/110818193,https://zhuanlan.zhihu.com/p/256487370
ACK段。此段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位组成。标准帧和扩展帧在这个段的格式也是相同的:
发送单元ACK段:发送2个隐性位(逻辑1)。
接收单元ACK段:接收到正确消息的单元,在ACK槽发送显性位,通知发送单元,正常接收结束。称之为发送ACK/返回ACK。
注意:发送 ACK 的是既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送ACK)。正常消息是指:不含填充错误、格式错误、CRC 错误的消息。
帧结束。由7个位的**隐性位(逻辑1)**组成。标准帧和扩展帧在这个段格式完全一样
判断那个设备占用总线——仲裁段
规律:1,总线空闲时,最先发送的单元获得发送优先权,一但发送,其他单元无法抢占。
2,如果有多个单元同时发送,则连续输出显性电平多的单元,具有较高优先级。
3,多单元同时发送,从ID开始比较,如果ID相同,还可能会比较RTR(数据帧/遥控帧)和SRR(标准格式/扩展格式)等位。
同时发送,但ID不同
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。**连续输出显性电平(逻辑0)**最多的单元可继
续发送。
同ID时,比较比较RTR(数据帧/遥控帧)和SRR(标准格式/扩展格式)
RTR,远程请求位。0,数据帧;1, 远程帧;
SRR,替代远程请求位。设置为1(隐性电平);
其他条件相同,遥控帧优于远程帧,标准优于扩展ID
这时,两个位的显性电平起作用,所以遥控帧>远程帧,标准数据帧>扩展数据帧,看出SRR位一定为隐形电平逻辑1.
CAN总线数据传输时间
位速率。简单说就是每秒钟发送位数。传送一个位的时间一般可以分为如下四段:
同步段(SS):又叫做同步段,它的作用就是判断节点与总线的时序是否一致,如何判断我们稍后再讲。先留一个疑点。它的长度为1tq
传播时间段(PTS):用于补偿网络的延时时间
相位缓冲段1(PBS1),相位缓冲段2(PBS2):都是用来补偿阶段的误差
构成这四个时间段的最小单位是,Time Quantum(以下称为Tq),这样通过这个最小单位可以知道传送一位数据的时间,也就是传送一位数据周期。下图中,总线的一个逻辑变化就是传送一位数据时间,而每一位的传送都经过四个阶段
数据同步
硬件同步
再同步
分为两种情况,当逻辑下降沿在PTS阶段时,若接收的下降沿晚了几个Tq,会通过在PBS1和PBS2之间填充Tq来把逻辑下降沿同步;当逻辑下降沿在PBS2阶段,需要将PBS2中的时间减少使得下降沿在SS阶段。
结合STM的CAN 控制器看
CAN控制器框图
从上面整体的图看出
1.一对主从CAN同时在一个512k的SRAM中
2,每个CAN单元都有两个三层FIFO接收邮箱(所以一个FIFO可以同时存三个完整报文),和三个发送邮箱
3 ,主和从CAN共用接收过滤(互联网型是28个,103系列是14个),从CAN单元的过滤器开始是通过设置FMR寄存器完成的(互联网型)
整体数据发送接收过程
接收过程:从第一个有效报文接收后,再次接收则FMP的状态改变,而FIFO中有两个完整报文,FIFO中最多保存三个报文。软件可以读取FIFO输出邮箱来读出新收到的报文,也就是一直读取FIFO挂号1的报文。
CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文
报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,一直存的是旧的三个报文;不锁定则新数据将替代老数据
数据传递四种工作模式
寄STM32中有关CAN协议的寄存器
控制寄存器
CAN主控制寄存器 (CAN_MCR)
设置INRQ=0,可使CAN从初始化模式进入正常工作模式。
设置INRQ=1,可使CAN从正常工作模式进入初始化模式
CAN错误状态寄存器 (CAN_ESR)
高8位用于记录错误次数,次8位是返回错误记录次数低8位;最低的7位是错误代码错误标志等
位时序寄存器CAN_BTR
图片引用参考链接中
发送邮箱标识符寄存器CAN_TIXR(X=0~2)
通过IDE说明是标准ID还是扩展ID,高11位可以是标准ID或扩展ID的高11位,
邮箱寄存器
邮箱发送数据长度寄存器
DLC四位确定是发送几个字节的数据
发送邮箱高字节数据寄存器 (CAN_TDHxR) (x=0…2)
知道最多发送8字节数据,需要两个32位寄存器放置数据
邮箱接收寄存器和发送寄存器的不同
整体说几乎一样,下面是不同
1,CAN_RDTxR 寄存器的FMI域;
2, 接收邮箱是只读的;
3, 发送邮箱只有在它为空时才是可写的,CAN_TSR寄存器(发送状态寄存器)的相应TME位为’1’,表示发送邮箱为空。
过滤器或筛选器组
筛选器组,两个32位CAN_FxR1和CAN_FxR2,过滤器位宽寄存器FS1R
主要用于屏蔽ID,ID号(CAN_TIXR中)和FS1R每位做为掩码进行按位与,所以FS1R中是1的位才是有用的位。