CAN是Controller Area Network(控制器局域网络)的缩写,是ISO国际标准化组织的异步串行通信协议。由德国电气商博世公司在1986 年率先提出。此后,CAN 通过ISO11898 及ISO11519 进行了标准化。现在在欧洲已是汽车网络的标准协议。
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。
CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。
(1)多主控制。
总线空闲时,所有单元都可发送消息,而两个以上的单元同时开始发送消息时,根据标识符(ID,非地址)决定优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
(2)系统柔软性。
连接总线的单元,没有类似“地址”的信息,因此,在总线上添加单元时,已连接的其他单元的软硬件和应用层都不需要做改变。
(3)速度快,距离远。
最高1Mbps(距离<40M),最远可达10KM(速率<5Kbps)。
(4)具有错误检测、错误通知和错误恢复功能。
所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
(5)故障封闭功能。
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
(6)连接节点多。
CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
正是因为CAN协议的这些特点,使得CAN特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。
与I2C、SPI 等具有时钟信号的通信方式不同,CAN通信并不是以时钟信号来进行同步的。它只具有CAN_High 和CAN_Low两条信号线,共同构成一组差分信号线,所以CAN是以差分信号的形式进行通信的。
上图CAN通信网络是遵循ISO11898标准的高速短距离闭环网络,它的总线最大长度为40 m,通信速度最高为1 Mbit/s。 还有一种是遵循ISO11519-2标准的低速远距离开环网络、它最大传输距离为1 km,最高通信速率为125 kbit/s。
从CAN的通信网络图可以了解到,它的通信节点由一个CAN控制器、一个CAN收发器组成。如STM32的CAN接口即为CAN控制器,为了构成完整的节点,还要给它外接一个CAN收发器。在发送数据时,CAN控制器把要发送的二进制编码通过CAN_Tx线发送到CAN收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和CAN_Low线输出到CAN总线网络。在接收数据时,这个过程相反。
差分信号即信号的逻辑0和逻辑1由两根差分信号线的电位差来表示。CAN 控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
显性电平对应逻辑0;CAN_H的电平为3.5 V,CAN_L线的电平为1.5 V,CAN_H和CAN_L之差为2V左右。
隐性电平对应逻辑1;CAN_H和CAN_L的电压均为2.5 v,电压差为0V。
当CAN收发器从CAN Tx线接收到来自CAN控制器的低电平信号时,它会将该信号转化,使CAN High输出3.5 V,同时CAN Low输出1.5 V,即显性电平。如同串口中的MAX3232用作电平转换,CAN收发器的作用则是用作差分信号的转换。
在CAN总线中,必须处于隐性电平(逻辑1)或显性电平(逻辑 0)中的一个状态。假如有两个CAN通信节点,在同一时间,一个输出隐性电平,另一个输出显性电平,总线的“线与”特性将使它处于显性电平状态,即显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。
在原始数据段的前面加上传输起始标签、片选(识别) 标签、控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签。把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同SPI中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其他设备时,只要这些设备按格式去解读,就能还原出原始数据。类似这样的数据包就被称为CAN的数据帧。为了更有效地控制通信,CAN共规定了5种类型的帧,帧也称为报文,它们的类型及用途如下:
其中,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID ;其中,最常用,最复杂的是数据帧。
数据帧是在CAN通信中最主要、最复杂的报文,它的结构如下图:
数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束,之间分为仲裁段、控制段、数据段、CRC段和ACK段。
(1)起始段
标准帧和扩展帧都是由1个位的显性电平表示帧起始。
(2)仲裁段
仲裁段的内容主要为本数据帧的ID信息。数据帧分为标准格式和扩展格式两种,区别就在于ID信息的长度,标准格式的ID为11位,扩展格式的ID为29位。
在CAN协议中,ID起着重要的作用,它决定者数据帧发送的优先级,也决定着其他设备是否会接收这个数据帧。CAN协议不对挂在它之上的设备分配优先级,对总线的占有权是由信息的重要性决定的,即对于重要的信息,我们会给它打包上一个优先级高的ID.使它能够及时地发送出去。也正因为它这样的优先级分配原则,使得CAN的扩展性大大加强,在总线上增加或减少节点并不影响其他设备。
报文的优先级,是通过对ID的仲裁确定的。前面对物理层的分析我们知道,如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,优先级的仲裁就根据这个特性实现的。若两个节点同时竞争CAN总线的占有权,在它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。
仲裁段ID的优先级也影响着接收设备对报文的反应。因为在CAN总线上数据是以广播的形式发送的,所有连接在CAN总线的节点都会收到所有其他节点发出的有效数据,因而我们的CAN控制器大多具有根据ID过滤报文的功能,即只接收某些ID的报文。
仲裁段除了报文ID外,还有RTR、IDE、SRR位。其中RTR (Remote Transmission Request)位是用于区分数据帧和遥控帧的,在数据帧里这一位为显性 (逻辑0)。IDE (Idenifier Extension)位是用于区分标准格式与扩展格式的,在标准格式中为显性,在扩展格式里为隐性。SRR (SubstituteRemote Request)位只存在于扩展格式,它用于替代标准格式中的RTR位。SRR位为隐性位,由于RTR在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
(3)控制段
在控制段中的r1和0为保留位,默认设置为显性位。最主要的为DLC段,DLC段由4位组成,MSB先行,它的二进制编码用于表示本报文中的数据段含有多少个字节,DLC段表示的数字为0一8。
(4)数据段
数据段为数据帧的核心内容,它由0 8个字节组成,MSB先行。
(5)CRC段
为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收端计算出的CRC码跟接收到的CRC码不同,则会向发送端反馈出错信息以及重新发送。CRC部分的计算和出错处理L般由 CAN控制器硬件完成或由软件控制最大重发数。
在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段隔开。
(6) ACK段
ACK段包括一个ACK槽位和ACK界定符位。在ACK槽位中,发送端发送的为隐性位,而接收端在这一位中发送显性位以示应答。在ACK槽和帧结束之间由ACK界定符隔开。
(7)帧结束段
帧结束段由发送端发送7个隐性位表示结束。
报文的优先级,是通过对ID的仲裁确定的。前面对物理层的分析我们知道,如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,优先级的仲裁就根据这个特性实现的。若两个节点同时竞争CAN总线的占有权,在它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。如下图所示,在开始阶段,两个设备发送的电平样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点1发送的为隐性时序,而此时节点2发送的为显性时序,因此节点2竞争总线成功,这个报文得以继续发送出去。
仲裁规律总结如下:
(1)总线空闲时,最先发送的单元获得发送优先权,一但发送,其他单元无法抢占。
(2)如果有多个单元同时发送,则连续输出显性电平多的单元,具有较高优先级。
从ID开始比较,如果ID相同,还可能会比较RTR和SRR等位。
由于CAN没有时钟信号线,而且它的报文中并没有包含用于同步的标志,所以要使用位同步的方式来确保通信时序,以及对总线的电平进行正确采样。
(1)位时序分解
为了实现位同步,CAN协议把每位的时序分解成同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段(PBS2),这四段的长度加起来即为一个CAN数据位的长度;分解后最小的时间单位是Tq,1 位分为4 个段,每个段又由若干个Tq 构成,而一个完整的位由8 ~ 25个Tq组成。
每位中的各段作用如下:
1)ss段(SYNC SEG),译为同步段,若总线的跳变沿被包含在SS段的范围之内,则表示节点与总线的时序同步。节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。如当总线上出现帧起始信号(SOF) 时,其他节点上的控制器根据总线上的这个下降沿,对自己的位时序进行调整,把该下降沿包含到ss段内,这样根据起始帧来进行同步的方式称为硬同步。其中SS段的大小为1Tq。
2)PTS段(PROPSEG),译为传播时间段,这个时间段用于补偿网络的物理延时时间,是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS 段的大小为1一8Tq。
3)PBS1段(PHASE SEG1),译为相位缓冲段1,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBSI段的初始大小可以为1一8 Tq。
4)PBS2段(PHASE SEG2),这是相位缓冲段2,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2段的初始大小可以为2~8Tq。
在重新同步的时候,PBS1和PBS2段的允许加长或缩短的时间长度定义为;重新同步补偿宽度(reSynchronization Jump Width, SJW)。
(2)同步过程分析
CAN的同步分为硬同步和重新同步。因为硬同步时只是在有帧起始信号时起作用,无法确保后续连串的位时序都是同步的,所以CAN 还引入了重新同步的方式。 在检测到总线上的时序 与节点使用的时序有相位差时(即总线上的跳变沿不在节点时序的SS段范围),通过延长PBS1段或缩短PBS2段来获得同步,这样的方式称为重新同步,如下图:
可以看到在总线出现帧起始信号时,该节点原来的位时序与总线时序不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的ss段平移至总线出现下降沿的部分,获得同步,这时采样点采集得的为正确数据。
重新同步的方式分为两种情况,如下图:
第一种, 节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后2Tq,这时控制器在下一个位时序中的PBS1段增加2Tq的时间长度,使得节点与总线时序重新同步。
第二种, 节点从总线的边沿跳变中,检测到它的时序比总线的时序相对超前2 Tq,这时控制器在前一个位时序中的PBS2段减少2 Tq的时间长度,获得同步。这里设置的PBS1和PBS2能够增减的最大时间长度为SJW=2 Tq,若SJW设置得太小则重新同步的调整速度慢,若设置得太大则影响传输速率。
STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:
(1) 支持CAN协议2.0A和2.0B主动模式
(2) 波特率最高达1Mbps
(3)支持时间触发通信
(4) 具有3个发送邮箱
(5) 具有3级深度的2个接收FIFO
(6) 可变的筛选器组(也称过滤器组,最多28个)
STM32的所有型号芯片中都具有bxCAN控制器( Basic Extended CAN),它支持CAN协议2.0A和2.0B. bxCAN接口可以自动地接收和发送CAN报文,支持标准标识符和扩展标识符。
它具有3个发送邮箱,发送报文的优先级可以使用软件,可以记录发送的时间。有两个3级深度的接收FIFO,可以使用过滤功能只接收或不接收某些ID号的报文。可以配置成自动重发。不支持使用DMA进行数据收发。
上图为STM32的CAN架构。
(1)OTx Mailboxes (发送邮箱)
STM32的CAN中共有3个发送邮箱供软件来发送报文。发送调度器根据优先级决定哪个邮箱的报文先被发送。
(2)Acceptance Filters (接收过滤器)
STM32的CAN中共有14个位宽可变/可配置的标识符过滤器组,软件通过对它们编程,从而在CAN收到的报文中选择它需要的报文,而把其他报文丢弃掉。
(3)Receive FIFO (接收FIFO )
STM32的CAN中共有两个接收FIFO,每个FIFO都可以存放3个完整的报文。它们完全由硬件来管理。
(1)CAN的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值,来决定是否接收对应消息。
(2) STM32 CAN控制器,提供了28个可配置的筛选器组(F1仅互联型才有28个,其他的只有14个),可降低CPU处理CAN通信的开销。
(3)STM32 CAN控制器每个筛选器组由2个32位寄存器组成(CAN_FxR1和CAN_FxR2,x=0~27)。根据位宽不同,每个筛选器组可提供:
● 1个32位筛选器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
● 2个16位筛选器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
(4) 筛选器可配置为:屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。而在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。
(5) 通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式:
(6)为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。
(7)为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。
(8) 应用程序不用的筛选器组,应该保持在禁用状态(通CAN_FA1R设置)。
(9) 筛选器组中的每个筛选器,都被编号为(即:筛选器编号)从0开始,到某个最大数值-取决于筛选器组的模式和位宽的设置。
(10) 通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1
例:设置筛选器组0工作在:1个32位筛选器-标识符屏蔽模式,然后设置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中存放到CAN_F0R1的值就是期望收到的ID,即(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是设置我们需要必须关心的ID,表示收到的映像,其位[31:24]和位[15:8]这16个位的必须和CAN_F0R1中对应的位一模一样,而另外的16个位则不关心,可以一样,也可以不一样,都认为是正确的ID,即收到的映像必须是0XFFxx00xx,才算是正确的(x表示不关心)。
程序选择1个空置的邮箱(TME=1)→设置标识符(ID),数据长度和发送数据→设置CAN_TIxR的TXRQ位为1,请求发送→邮箱挂号(等待成为最高优先级)→预定发送(等待总线空闲)→发送→邮箱空置。
FIFO空→收到有效报文→挂号_1(存入FIFO的一个邮箱,这个由硬件控制,我们不需要理会)→收到有效报文→挂号_2→收到有效报文→挂号_3→收到有效报文→溢出。
注:报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将替代老数据。
CAN波特率计算方式如下图所示:
STM32的CAN将传播时间段和相位缓冲时间段1合并成时间段1。
(1)主控制寄存器(CAN_MCR)
(2)位时序寄存器(CAN_BTR)
(3)接收FIFO寄存器(CAN_RF0R/CAN_RF1R)
(4)发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)
(5)发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR)(x=0~2)
(6)发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR)(x=0~2)
(7)接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1)
(8)接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR) (x=0/1)
(9)接收FIFO邮箱数据寄存器(CAN_RDLxR/CAN_RDHxR) (x=0/1)
(10)筛选器模式寄存器(CAN_FM1R)
(11)筛选器尺度寄存器(CAN_FS1R)
(12)筛选器FIFO关联寄存器(CAN_FFA1R)
(13)筛选器激活寄存器(CAN_FA1R)
(14)N筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)
注:寄存器具体功能查看芯片数据手册
1.配置相关引脚的复用功能,使能CAN时钟。
要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,
2.设置CAN工作模式及波特率等。
通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其他相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。 最后设置INRQ为0,退出初始化模式。
3.设置滤波器。
先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。
1.CAN总线详解
2.CAN通信协议(一)
3.CAN协议学习(二)