CAN通信(速记版)

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位寄存器FxR1FxR2组成。

        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线,还有个屏蔽线 ,接不接都行,作用是电磁屏蔽防干扰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大象荒野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值