18.1 CAN协议
18.1.1 协议概述
CAN是Controller Area Network的缩写,最初是专门用于汽车网络的通信协议,与485协议相似,CAN也是一种2线制,采用两根线的电压差进行数据传输的协议,随着CAN协议的高性能与可靠性被认同,现在被广泛运用在工业自动化,船舶等当面,目前最热门的国六标准,J1939通信协议就是以CAN协议为基础设计的。
CAN协议最远通信距离可达10km,与485相似,CAN也有两种电平,分别为显性电平与隐性电平,当CAN_H与CAN_L电压一致的时候为隐性电平,反之为显性电平。实际上隐性电平代表逻辑电平1,显性电平代表逻辑电平0,CAN在通信的时候,也需要在每个设备输出端并联1个120Ω的终端匹配电阻,用于进行阻抗匹配。
18.1.2 通信组成
CAN协议通过5种类型的帧进行数据通信:数据帧,遥控帧,错误帧,过载帧和间隔帧,其中数据帧与遥控帧具有标准格式与扩展格式两种,标准格式有11个位的标识符,扩展格式则有29个位的标识符,五种帧的功能如下所示。
(1)数据帧:用于实际数据传输
(2)遥控帧:用于接收端向具有相同ID的发送端请求数据
(3)错误帧:用于检测报错时通知其他设备
(4)过载帧:用于接收端通报尚未准备好接收准备
(5)间隔帧:用于将数据帧与遥控帧和前面的帧分割
完整的数据帧构成如下图所示。
数据帧一般由7段组成:
(1)帧起始:即数据帧开始的段,标准帧和扩展帧都是由1个位的显性电平表示帧起始
(2)仲裁段:表示该帧优先级,标准帧和扩展帧格式在这一段结构如下图所示。
其中RTR位用于标识是否是远程帧(0代表数据帧;1代表远程帧),IDE位为标识符选择位(0表示使用标准标识符;1表示使用扩展标识符),SRR位为代替远程请求位,为隐性位,代替了标准帧中的RTR位。
(3)控制段:表示数据的字节数即保留位,由6个位构成,表示数据段的字节数。标准帧和扩展帧的控制段结构如下图所示。
r0和r1为保留位,必须全部以显性电平发送,但是接收端可以接收显性、隐性及任意组合的电平。DLC段为数据长度表示段,高位在前,DLC段有效值为08,但是接收方接收到915的时候并不认为是错误。
(4)数据段:数据段内容,一段可以发送0~8个字节的数据,从最高位MSB开始输出
(5)CRC校验:CRC校验数据完整性
(6)应答段:表示正常接收
(7)帧结束:表示该帧结束
18.1.3 通信参数
由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为4段。
(1)同步段(SS)
(2)传播时间段(PTS)
(3)相位缓冲段1(PBS1)
(4)相位缓冲段2(PBS2)
这些段又由可称为Tq的最小时间单位构成。1位分为4个段,每个段又由若干个Tq构成,这称为位时序。1位由多少个Tq构成、每个段又由多少个Tq构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和Tq数如下表所示。
18.1.4 总线仲裁
在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程如下图所示。
单元1和单元2同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到T时刻,单元1输出隐性电平,而单元2输出显性电平,此时单元1仲裁失利,立刻转入接收状态工作,不再与单元2竞争,而单元2则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权
18.1.5 STM32 CAN模组简介
STM32F1系列自带的是基本扩展CAN,支持CAN协议的2.0A和2.0B,支持报文发送的优先级要求可软件配置,最大通信速率1Mbps,3个发送邮箱和3级深度的2个接收缓存器FIFO,28个可变的滤波器组,STM32的CAN模组结构如下图所示。
从上面结构可以看出,两个CAN都分别具备自己的发送与接收邮箱,但是28个滤波器却是公用的,通过FMR寄存器可以设置滤波器的分配方式,STM32的每个滤波器组的位宽都可以独立配置,根据位宽的不同,每个滤波器组可以提供
(1)1个32位过滤器:包含STDID[10:0],EXTID[17:0],18位扩展ID,IDE和RTR位
(2)1个16位过滤器:包含STDID[10:0],IDE,RTR和EXTID[17:15]
此外过滤器可以配置为屏蔽位模式与标识符列表模式。
(1)在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理
(2)标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。
18.1.6 CAN的发送流程
第1步:程序选择1个空置的邮箱(TME=1),设置标识符(ID),数据长度和发送数据
第2步:设置CAN_TIxR的TXRQ位为1,请求发送
第3步:邮箱挂号(等待成为最高优先级)
第4步:预定发送(等待总线空闲)
第5步:发送
第6步:邮箱空置
整个发送流程如下图所示。
18.1.7 CAN的接收流程
CAN接收到的有效报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。这里的有效报文是指那些正确被接收的(直到EOF都没有错误)且通过了标识符过滤的报文。前面我们知道CAN的接收有2个FIFO,我们每个滤波器组都可以设置其关联的FIFO,通过CAN_FFA1R的设置,可以将滤波器组关联到FIFO0/FIFO1。CAN接收流程为:
FIFO空->收到有效报文->挂号1(存入FIFO的一个邮箱,这个由硬件控制,我们不需要理会)->收到有效报文->挂号2->收到有效报文->挂号3->收到有效报文->溢出
这个流程里面,我们没有考虑从FIFO读出报文的情况,实际情况是:我们必须在FIFO溢出之前,读出至少1个报文,否则下个报文到来,将导致FIFO溢出,从而出现报文丢失。每读出1个报文,相应的挂号就减1,直到FIFO空,完整的接收流程图如下图所示。
FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。
18.1.8 通信速率计算
根据通信参数小节我们可以知道1个位是由4个段组成,分别为同步段(SS),传播时间段(PTS),相位缓冲段1(PBS1),相位缓冲段2(PBS2),STM32内部将传播时间段与相位缓冲段1合并为时间段1,这样1个位就是有3个段组成,即同步段SS,时间段1和时间段2(即相位缓冲段),由于波特率的定义是1秒内发送二进制位的个数,所以,CAN波特率的计算公式为
18.1.9 STM32F1系列CAN测试模式
(1)静默模式
通过对CAN_BTR寄存器的SILM位置1,来选择静默模式。在静默模式下,CAN可以正常地接收数据帧和远程帧,但只能发出隐性位,而不能真正发送报文。如果bxCAN需要发出显性位(确认位、过载标志、主动错误标志),那么这样的显性位在内部被接回来从而可以被CAN内核检测到,同时CAN总线不会受到影响而仍然维持在隐性位状态。因此,静默模式通常用于分析CAN总线的活动,而不会对总线造成影响-显性位(确认位、错误帧)不会真正发送到总线上,静默模式等效图如下图所示。
(2)环回模式
通过对CAN_BTR寄存器的LBKM位置1,来选择环回模式。在环回模式下,CAN把发送的报文当作接收的报文并保存(如果可以通过接收过滤)在接收邮箱里,环回模式等效图如下图所示。
(3)环回静默模式
该模式可用于“热自测试”,即可以像环回模式那样测试CAN,但却不会影响CANTX和CANRX所连接的整个CAN系统。在环回静默模式下,CANRX引脚与CAN总线断开,同时CANTX引脚被驱动到隐性位状态,环回静默模式等效图如下图所示。
-
通信协议
+关注
关注
28文章
881浏览量
40300 -
数据传输
+关注
关注
9文章
1882浏览量
64565 -
CAN
+关注
关注
57文章
2744浏览量
463630
发布评论请先 登录
相关推荐
评论