CAN 总线简介
CAN 协议经过 ISO 标准化后有两个标准:ISO11898 标准和 ISO11519-2 标准。前者适用通信速率为 125Kbps~1Mbps 场景,后者适用 125Kbps 以下场景。
STM32 自带基本扩展 CAN(bxCAN)。它支持 CAN 协议 2.0A 和 2.0B,都属于11898标准。支持最高传输速率为1 Mbps。CANFD类似CAN2.0,支持5Mbps。
2.0A使用标准帧格式,而2.0B使用扩展帧格式。
2.0A使用CRC进行错误检测,而2.0B使用CRC+ACK进行错误检测。
在 STM32 互联型产品中,带有 2 个 CAN 控制器。非互联型带有 1 个。
高速 CAN 总线由两根线 CAN_High(TX) 和 CAN_Low(RX) 组成,且在总线两端各串联了 120Ω 的电阻(用于阻抗匹配,减少回波反射),同时总线上可以挂载多个节点。
每个节点都有 CAN 收发器以及 CAN 控制器。
CAN 控制器是 MCU 的外设,集成在芯片内部,负责数据的发送接收、过滤、处理等;
CAN 收发器则是负责把数据信号转换成引脚上的物理信号。
CAN 类似 RS485 也是通过差分信号传输数据。根据 CAN 总线上两根线的电位差来判断总线电平。总线电平分为显性电平和隐性电平。
显性电平对应逻辑 0,H线 和 L线 电位差 2.5V 左右;‘
隐性电平对应逻辑 1,H线 和 L线 电位差 0V。
总线上显性电平是或门,只要有一个单元输出显性电平,总线上即为显性电平。而隐性电平是与门,只有所有的单元都输出隐性电平,总线上才为隐性电平。
CAN 协议结构
CAN 协议包含 5 种类型的帧:
数据帧:
发送单元用来发送数据
遥控帧:
接收单元用来请求数据(远程帧)
错误帧:
检测数据错误时向其他单元通知错误
过载帧:
接收单元没做好接收准备时用来通知发送方
帧间隔:
用来将数据帧、遥控帧与前面的帧分隔开
另外,数据帧和遥控帧有标准格式和扩展格式两种格式。
标准格式有 11 个位的标识符(ID),扩展格式有 29 个位的 ID。
数据帧一般由 7 个段组成,
(1) 帧起始。
表示数据帧开始的段。1位显性电平用作起始段。
(2) 仲裁段。
表示帧优先级的段。
标准帧仲裁段 = 11位ID + 远程帧标识位RTR
扩展帧仲裁段 = 29位ID + 远程帧标识位RTR + 标识符选择位IDE
仲裁段禁止高7位都为隐性。小的优先级高。标识符就是标准帧和扩展帧的标识。
(3) 控制段。
表示数据段的字节数。
标准帧控制段 = 1保留位 + 4位数据长度码
扩展帧控制段 = 2保留位 + 4位数据长度码
数据长度码最大0~8,但接收方收到9~15不认为是错误。
(4) 数据段。
最多8字节数据。64位。
(5) CRC 段。
CRC校验。15位CRC顺序 + 1位CRC界定符。
CRC校验,二进制模二运算,约定除数,检查余数是否为0,不进位退位。
(6) ACK 段。
表示确认正常接收的段。1位ACK槽 + 1位ACK界定符。
(7) 帧结束。
表示数据帧结束的段。
CAN 协议位时序
每秒钟传输的位数称为位速率。
1 位分为 4 段,每段由若干个 Tq 构成,这称为位时序。
同步段 、传播时间段、相位缓冲段1、相位缓冲段2。
同步段SS, 传播时间段PTS, 相位缓冲段1PBS1 ,相位缓冲段2PBS2
同步段用来同步总线上多个单元的时序。
传播时间段用来补偿各个单元的信号物理延迟。
相位缓冲段用来补偿各个单元的时钟误差。
每个段由多少Tq构成可以任意设定,代表位时序可任意设定。(Time Quantum)
通过设定位时序,多个单元可同时采样,也可任意设定采样点。
采样点,是指读取总线电平,并将读到的电平作为位值的点。位置在相位缓冲段1(PBS1)结束处。
位填充
位填充规则:
发送方每发送5个相同电平后,自动追加 1 个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据。
例如:
即将发送: 100000110 10000011110 0111111111110
实际发送: 1000001110 1000001111100 011111011111010
实际接收: 1000001110 1000001111100 011111011111010
移除填充后: 100000110 10000011110 0111111111110
位填充作用:
增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机
将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性
保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲
数据同步过程
数据同步分为硬件同步和再同步。
硬件同步:
节点通过CAN总线发送数据,一开始发送帧起始信号。总线上其他节点会检测帧起始信号在不在位时序的SS段内,判断内部时序与总线是否同步。
假如不在SS段内,代表采样点获得的电平状态是不正确的。节点首先会采用硬件方式i陶正,把自己的SS段平移到检测到边沿的地方,获得同步。
再同步:
再同步分为超前和滞后两种情况,即边沿信号与SS段相对的位置。传播时间段和相位缓冲段1、相位缓冲段2就是用来补偿边沿信号超前或滞后与SS段的误差。
CAN 协议仲裁
在总线空闲态,最先开始发送消息的单元获得发送权。
当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行比较,碰到高电平就继续,碰到低电平就转入接收状态。(高电平继续,低电平转接收)
标识符过滤
STM32标识符过滤的存在减少了CPU处理CAN通信的开销。
每个过滤器组x由2个32位寄存器FxR1、FxR2组成。
STM32 每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:
● 1 个 32 位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位
● 2 个 16 位过滤器,包括:STDID[10:0]、IDE、RTR 和 EXTID[17:15]位
此外过滤器可配置为,屏蔽位模式和标识符列表模式。
在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。相当于 2 个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。
为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。
为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。
应用程序不用的过滤器组,应该保持在禁用状态。
过滤器组中的每个过滤器,都被编号为(叫做过滤器号,图 31.1.11 中的 n)从 0 开始,到某 个最大数值-取决于过滤器组的模式和位宽的设置。
举个简单的例子,
我们设置过滤器组 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 表示不关心)
CAN 寄存器
主控制寄存器 MCR
主控制寄存器MCR可以设置CAN的初始化模式、睡眠模式、发送顺序、自动重发送、FIFO的上溢处理。
最低位用来进入初始化模式。
INRQ位,Initialization Request,给1就是初始化请求。
自动重发送是针对单元由于仲裁丢失或错误导致的发送失败情况。
发送顺序是发送邮箱的发送顺序。
上溢处理分为FIFO锁定、非锁定,锁定就是上溢了不处理,FIFO保留最早三条消息。
位时序寄存器 BTR
位时序寄存器BTR用来设置分频、同步段、位传输段1(Tbs1)、位传输段2(Tbs2)以及同步跳变宽度时间Tsjw等参数。直接决定CAN的波特率。也用来进入测试模式。
CAN的测试模式有回环、静默、回环静默三种。
回环模式,自发送自接收,数据放在接收的FIFO输出邮箱里。发送报文可以在 TX 引脚上检测到。
静默模式,CAN控制器只使用接收功能,不会发送任何数据。
回环静默模式下RX引脚正常接收数据,同时自身发送的消息在自身FIFO中存储。
邮箱寄存器
标识符寄存器 TIxR/RIxR
发送/接收标识符寄存器(TIxR/RIxR),x=0~3
用来设置标识符类型,帧类型,发送邮箱请求。
标识符类型包括标准/扩展,帧类型包括远程/数据,发送邮箱请求在邮箱变空后由硬件清零。
RIxR的最低为保留,接收不需要请求。
数据长度和时间寄存器 T/RDTxR
发送邮箱数据长度和时间戳寄存器(TDTxR)(x=0~2),
最低4位可用来设置数据长度,一条数据可包含8字节。
在时间触发通信模式下,CAN硬件的内部计数器被激活, 内部计数器在每个CAN位时序递增。接收和发送时,都会在帧起始位的采样点捕获内部计数器,用于为接收和发送邮箱生成时间戳。
高/低位数据寄存器 TDHR
发送邮箱低字节数据寄存器(TDLxR)(x=0~2),
用来存储将要发送/接收的数据,低字节数据寄存器、高字节数据寄存器各自都包含4个8位。
过滤器寄存器
模式寄存器 FMR
用到了28个bit,用来设置28个过滤器的工作模式。
0代表对应的过滤器组的两个32位寄存器处在标识符屏蔽模式,1代表标识符列表模式。
只有在FMR的FINIT位=1时,也就是过滤器处于初始化模式下才能设置。
标识符屏蔽模式:接收端设置一个标识符和一个屏蔽码,接收的消息标识符会与屏蔽码进行按位与,如果结果与设置的标识符相匹配,则接收该消息。
标识符列表模式:接收端事先设定一个标识符列表,只有当消息的标识符在列表中时,接收端才会接收该消息。
位宽寄存器 FSR
用到了28个bit,用来设置28个过滤器的位宽。双16位尺度配置、单32位尺度配置。
其实就是标识符比较条件的大小。过滤器处于初始化模式下才能设置。 scale 尺度
FIFO分配寄存器 FFAR
用到了28个bit,用来设置报文过滤后被存入的FIFO。FIFO0、FIFO1。
Filter FIFO Assignment
激活寄存器 FAR
28bit对应28个过滤器组,用来关闭/打开过滤器组。
组i的寄存器x FiRx
过滤器组 i 的寄存器 x(FiRx)(互联产品中 i=0~27,其它产品中 i=0~13; x=1/2)。
每个过滤器组的 FiRx 都由 FiR1、FiR2 两个 32位 的寄存器构成。
FiR1存放期望ID,FiR2存放掩码ID。
判断收到的ID和掩码ID与运算后是否符合期望ID来过滤。
CAN 发送和接收流程(速记)
F4 有两个 bxCAN。F1 有一个。
双 CAN 模式下,一主一丛,两个 CAN 单元共享 512 字节SRAM。主 CAN 用来管理 bxCAN 与 SRAM 存储器之间的通信。从CAN无法直接访问SRAM。双CAN共享过滤器组。
CAN模块上有过滤器组,互联型芯片有28个过滤器组,非互联型有14个。
BxCAN 有 3 个邮箱 具有 3 级深度的 2 个接收 FIFO。每个FIFO最多存储3个CAN帧。
发送的时候,
选择一个空邮箱,
标识符寄存器TIxR来设置标识符ID、标识符类型、邮箱发送请求。
数据长度寄存器TDTxR设置数据长度(最多8字节)。
发送请求给了以后,数据存到发送邮箱里,对应的邮箱变成挂起状态,开始优先级排序。优先级最高的邮箱发送数据,邮箱恢复空状态。发送完了把发送状态寄存器TSR的请求完成标志位RQCP和发送完成标志位TXOK置1。如果发送失败,由ALST(仲裁丢失)和TERR(发送错误)指示。
Arbitration Lost 仲裁丢失
Abort Request 终止请求
发送状态相关标志位在收到应答、发送错误、复位情况下清零。
FIFO在存储一条消息的时候,也会变成挂起状态。消息在FIFO挂起的时候,TSR寄存器会有FMP[1:0]+1,发送完释放的时候FMP[1:0]-1。软件读取邮箱内容后,FIFO变空。
如果软件读取邮箱后没有释放邮箱,新来的数据会往FIFO的下一层存放,最多三层,对应FMP[1:0]的00,01,11这三种Pending_1/2/3状态。一旦FIFO到了Pending3状态,就满了,
FIFO Message Pending,FMP
发送的先后顺序在MCR中设置,可以是按标识符大小先低后高,也可以是按请求顺序先来后到。邮箱退出空状态后会进入写保护状态。
接收的时候,
首先经过过滤器,过滤器模式寄存器FMR可以设置屏蔽模式和列表模式。
按照 过滤器FIFO关联寄存器FFAR 的设置,存放到过滤器关联的FIFO。
消息存储到FIFO后,SR的FMP[1:0]更新,同时根据IER的使能处理对应中断。
如果IER寄存器的FMPIE位使能了消息挂起中断、
消息存满后,如果FFIE位使能了消息溢出中断、
消息上溢时,如果FOVR使能了消息上溢中断,将产生对应的中断请求。
我们必须在FIFO溢出之前读出至少1个报文,否则FIFO溢出最旧的报文丢失。
接收到的报文数,可以通过FIFO邮箱挂起寄存器FMP得到,只要FMP不为0,就代表可以从FIFO读取报文。
过滤器组需要设置的参数有:
过滤器模式,FMR,屏蔽模式 / 列表模式
过滤器位宽,FSR,2个16位 / 个32位
FIFO关联,FFAR,FIFO1 / FIFO2
过滤器激活,FAR,激活 / 关闭
(期望/掩码)过滤器 i 的寄存器 x,FiR1、FiR2,一个用来放期望ID,一个用来放掩码ID
标识符筛选
在CAN协议中,发送器将消息广播给所有的接收器。接收器根据标识符筛选需要的信息,存储到SRAM中。每个筛选器组均包含2个32位寄存器FxR0、FxR1用于筛选功能,一个保存目标ID,一个保存掩码ID。
根据位宽寄存器FS1R的设置,一个筛选器组FxR0和FxR1可以为 11bit标准ID+18bit扩展id 提供一个32位的寄存器,也可以为 11bit标准Id提供两个16位筛选器。
筛选器的尺度可以配置为1个32位,或者两个16位(FSR)。
此外,筛选器还可以配置为掩码模式、标识符列表模式(FMR)。
筛选器组中的每个筛选器将按从 0 到最大值的顺序进行编号。
筛选器尺度配置:
筛选器尺度已知可以配置成1个32位的,和两个16位的
筛选器模式已知可以配置成标准模式和掩码模式
32位是指给11bit的ID+18bit扩展ID+IDE+RTR+补0凑够32位,
掩码模式下,FiR1存放目标ID,FiR2存放掩码ID。(过滤出一组符合条件的标识符)
标准模式下,FiR1存放目标ID,FiR2存放另一个目标ID。(过滤出两组符合条件标识符)
双16位的FiR1和FiR2都被拆成两个16位。11bit ID+RTR+IDE+EXID[17:15]凑够16位。
掩码模式下,FiRx的低16位放目标ID,高16位放掩码(过滤出两组符合条件的标识符)。
标准模式下,FiRx的第16位和高16位都放目标ID(过滤出四组符合条件的标识符)。
筛选器优先级规则:
筛选器和FIFO通过FAR进行关联,但是有可能出现一个标识符通过了多个过滤器的情况,
尺度大的优于尺度小的,32位由于双16
尺度一样情况下,列表模式优于掩码模式
尺度和模式都一样,筛选器编号低的优先
CAN 面试题
CAN FD和CAN的区别
CAN FD 可以理解成 CAN 的升级版,只升级了协议,物理层电气特性不变。
传输速率、帧格式、数据长度、ID不同。
CAN FD最大速率可达 8 Mbps。数据最长 64 字节。标准帧ID长度可扩展到12bit。
CAN-FD帧格式新增了FDF、BRS、ESI位
FDF表示CAN报文还是CAN-FD报文。
BRS:表示位速率转换,隐性时,速率可变,显性时,以恒定的CAN-FD总线速率传输。
ESI:错误状态指示位,指示发送节点在错误恢复模式下的状态,用来协调错误的处理。
Error State Indicator
CAN总线的校验机制
CRC校验。循环冗余校验,做法是约定除数,模二除法,对比余数。
ACK校验。接收方接收成功要饭hi一个ACK信号。
CAN的显性和隐性状态
显性状态下H线和L线相差2V,一般H3.5V,L1.5V
隐形状态下H线和L线相差0V,两线都是2.5V,
CAN DB9针式连接器
9个孔只用到了5个,VCC\VSS\H线\L线,还有个屏蔽线 ,接不接都行,作用是电磁屏蔽防干扰