目录
物理层
位速率
帧种类
总线仲裁
STM32 CAN控制器简介bxCAN
工作模式
发送接收
STM32的位时间
STM32筛选器
学习资料来源:正点原子STM32,野火STM32
CAN 控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
如上图,STM32就是控制器,外界一个收发器,CAN通讯节点由一个CAN控制器及CAN收发器组
成,控制器与收发器之间通过CAN_Tx及CAN_Rx信号线相连(就是逻辑TTL电平0V0.3,,3V
1),收发器与CAN总线之间使用CAN_High及CAN_Low信号线相连(CAN的差分信号)。其中
CAN_Tx及CAN_Rx使用普通的类似TTL逻辑信号,而CAN_High及CAN_Low是一对差分信号线,
使用比较特别的差分信号。
差分信号:
相对于单信号线传输的方式,使用差分信号传输具有如下优点:
抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信
号的差值,所以外界的共模噪声可以被完全抵消。
能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场
可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。
时序定位精确,由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两
个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号
的电路。
由于差分信号线具有这些优点,所以在USB协议、485协议、以太网协议及CAN协议的物理层中,
都使用了差分信号传输。
CAN协议中对它使用的CAN_High及CAN_Low表示的差分信号做了规定。
以高速CAN协议为例,当表示逻辑1时(隐性电平),CAN_High和CAN_Low线上的电压均为2.5v,即
它们的电压差VHVL=0V;而表示逻辑0时(显性电平),CAN_High的电平为3.5V,CAN_Low线的电
平为1.5V,即它们的电压差为VHVL=2V。
假如有两个CAN通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,类似I2C总线
的“线与”特性将使它处于显性电平状态,显性电平的名字就是这样来的,即可以认为显性具有优先
的意味。
由于CAN总线协议的物理层只有1对差分线,在一个时刻只能表示一个信号,所以对通讯节点来
说,CAN通讯是半双工的,收发数据需要分时进行。在CAN的通讯网络中,因为共用总线,在整个
网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。
CAN还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通
讯正常。
为了实现位同步,CAN协议把每一个数据位的时序分解成SS段、PTS段、PBS1段、PBS2段,这四
段的长度加起来即为一个CAN数据位的长度。分解后最小的时间单位是Tq,而一个完整的位由
8~25个Tq组成。
同步段(SS)
传播时间段(PTS)
相位缓冲段1(PBS1)
相位缓冲段2(PBS2)
这些段又由可称为 Time Quantum(以下称为Tq)的最小时间单位构成。
图中表示的CAN通讯信号每一个数据位的长度为19Tq,其中SS段占1Tq,PTS段占6Tq,PBS1段
占5Tq,PBS2段占7Tq。信号的采样点位于PBS1段与PBS2段之间,通过控制各段的长度,可以对
采样点的位置进行偏移,以便准确地采样。
由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯
那样,节点间使用约定好的波特率进行通讯,相当于就i是规定好了每个位有几个Tq。规定好了每
个段有多长,多少个Tq。
SS译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围之内,则表示节点与
总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。
SS段的大小固定为1Tq。就是检测该节点与总线的时钟约定是否一致。
PTS译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输
出驱动器延时总和的两倍。PTS段的大小可以为1~8Tq。
PBS1译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加
长。PBS1段的初始大小可以为1~8Tq。
PBS2这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩
短。PBS2段的初始大小可以为2~8Tq。就是PBSA核PBS2可以在SS检测到不同步时调整各个位的
采样点和总线同步。
总线上的各个通讯节点只要约定好1个Tq的时间长度以及每一个数据位占据多少个Tq,就可以确定
CAN通讯的波特率。
例如,假设上图中的1Tq=1us,而每个数据位由19个Tq组成,则传输一位数据需要时间T1bit
=19us,从而每秒可以传输的数据位个数为:
1 /19 = 52631.6 (bps)
这个每秒可传输的数据位的个数即为通讯中的波特率。
其中,数据帧和遥控帧有标准格式和扩展格式两种格式。
标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID 。
数据帧介绍:
数据帧的组成格式:
①,帧起始。
表示数据帧开始的段。
②,仲裁段。
表示该帧优先级的段。ID
③,控制段。
表示数据的字节数及保留位的段。
④,数据段。
数据的内容,一帧可发送0~8个字节的数据。
⑤,CRC段。
检查帧的传输错误的段。
⑥,ACK段。
表示确认正常接收的段。
⑦,帧结束。
表示数据帧结束的段。
如图,CAN总线上挂载几个节点,包括总控制器在内都是一个节点,当某个节点要发送数据时,控制器到收发
器再到总线一个显性电平,也就是下面的帧起始,代表该节点要发数据了,再根据后面的仲裁段也就是ID看优
先级,如果最高,则占用总线发送数据,其他每个节点都进入接受状态,也就是下面的总线仲裁。数据帧的每
一位就是该节点发送出来的位的高低,整个数据帧都是由位的形式由节点一位一位的传输给总线
1,帧起始。标准帧和扩展帧都是由1个位的显性电平表示帧起始,逻辑0
2.仲裁段。ID。表示数据优先级的段,标准帧和扩展帧格式在本段有所区别,如图所示:
标准格式的数据帧仲裁段有11位,后接
RTR远程请求位,0表示数据帧,1表示远程帧,标准格式的IDE位在控制段里。
扩展格式有29位,前面基本ID11位,后接SRR代替远程请求位,设置为隐性位;再后接
IDE标识选择位,为0使用标准标识符,为1使用扩展标识符;后接扩展ID;再后接RTR位表示远程
请求位。
3.控制段。由6位构成,表述数据段的字节数。扩展格式的r0与r1为保留位,以显性电平发送,而标
准格式则只有一个r0,IDE位在控制段里。
4.数据段。该段可包含0~8个字节的数据,从最高位(MSB)开始输出。标准帧和扩展帧在这个段
的格式完全一样:
5.CRC段,用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组
成,标准帧和扩展帧在这个段的格式也是相同的
6.ACK段。此段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位组成。标准帧和扩
展帧在这个段的格式也是相同的:
发送单元的 ACK,发送 2 个位的隐性位,而接收到正确消息的单元在 ACK 槽(ACK Slot)发送显
性位,通知发送单元正常接收结束,这个过程叫发送 ACK/返回 ACK。发送 ACK 的是在既不处于总
线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送 ACK)。所
谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。
7,帧结束。由7个位的隐性位组成。标准帧和扩展帧在这个段格式完全一样。
规律:1,总线空闲时,最先发送的单元获得发送优先权,一但发送,其他单元无法抢占。2,如果
有多个单元同时发送,则连续输出显性电平(也就是数据帧的仲裁段的每一位逐个比较)多的单元,
具有较高优先级。
从ID开始比较,如果ID相同,还可能会比较RTR和SRR等位。
1为控制内核,2为发送缓存,3为接收缓存,4为筛选器
STM32的有两组CAN控制器,其中CAN1是主设备,框图中的“存储访问控制器”是由CAN1控制的,
CAN2无法直接访问存储区域,所以使用CAN2的时候必须使能CAN1外设的时钟。
为方便调试,STM32的CAN提供了测试模式,配置位时序寄存器CAN_BTR的SILM及LBKM寄存器
位可以控制使用正常模式、静默模式、回环模式及静默回环模式
CAN外设一共有3个发送邮箱,即最多可以缓存3个待发送的报文。
每个发送邮箱中包含有标识符寄存器CAN_TIxR、数据长度控制寄存器CAN_TDTxR及2个数据寄存
器CAN_TDLxR、CAN_TDHxR!
当要使用CAN外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄
存器CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可把数据发送出去。
其中标识符寄存器CAN_TIxR中的STDID寄存器位比较特别。CAN的标准标识符的总位数为11位,
而扩展标识符的总位数为29位的。当报文使用扩展标识符的时候,标识符寄存器CAN_TIxR中的
STDID[10:0]等效于EXTID[18:28]位,它与EXTID[17:0]共同组成完整的29位扩展标识符。
CAN外设一共有2个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收到的报文。当接收
到报文时,FIFO的报文计数器会自增,而STM32内部读取FIFO数据之后,报文计数器会自减,通
过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的RFLM位,可设置锁定模式,锁
定模式下FIFO溢出时会丢弃新报文,非锁定模式下FIFO溢出时新报文会覆盖旧报文
STM32F4 把传播时间段和相位缓冲段 1(STM32F4 称之为时间段1)合并了,所以 STM32F4 的
CAN 一个位只有 3 段:同步段(SYNC_SEG)、时间段 1(BS1)和时间段 2(BS2)。配置BS1
和BS2段长度在时许寄存器TS1和TS2位中配置。BRP在寄存器时许寄存器BTR中设置
图中还给出了 CAN 波特率的计算公式,我们只需要知道 BS1 和 BS2 的设置,以及 APB1的时钟频
率(一般为 42Mhz),就可以方便的计算出波特率。比如设置 TS1=6、TS2=5 和 BRP=5,在
APB1 频率为 42Mhz 的条件下,则t PCLK=1/42. 即可得到 CAN 通信的波特率
=42000/[(7+6+1)*6]=500Kbps。
STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kbps
CAN外设的验收筛选器,一共有28个筛选器组,每个筛选器组有2个寄存器,CAN1和CAN2共用的
筛选器的。
在 CAN 协议中,消息的标识符与节点地址无关,但与消息内容有关。因此,发送节点将报文广播
给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,为了简化软件的工
作,STM32的CAN外设接收报文前会先使用验收筛选器检查,只接收需要的报文到FIFO中。
筛选器工作的时候,可以调整筛选ID的长度及过滤模式。
根据筛选ID长度来分类有有以下两种:
检查 STDID[10:0]、 EXTID[17:0]、 IDE 和 RTR 位,一共31位。
检查STDID[10:0]、 RTR、 IDE 和 EXTID[17:15],一共16位。
而根据过滤的方法分为以下两种模式:
标识符列表模式,它把要接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同
才可以接收,可以理解为白名单管理。
掩码模式,它把可接收报文ID的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜
索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收FIFO。
通过配置筛选尺度寄存器CAN_FS1R的FSCx(代表哪一组筛选器)位可以设置筛选器工作在哪个
尺度。通过配置筛选模式寄存器CAN_FM1R的FBMx位可以设置筛选器工作在哪个模式。
一组筛选器两个32位寄存器,掩码模式下,一个存ID,一个存掩码,标识符列表模式下,都ci’n在
标识符掩码的模式下,掩码的每一位对应ID的每一位,掩码为1,表示要求一样,是过滤条件,掩
码为0,表示不要求,这一位不算过滤条件。
例子:
如在掩码模式时,第一个寄存器存储要筛选的ID,第二个寄存器存储掩码,掩码为1的部分表示该
位必须与ID中的内容一致,筛选的结果为表中第三行的ID值,它是一组包含多个的ID值,其中x表
示该位可以为1可以为0。
如工作在标识符模式时,2个寄存器存储的都是要筛选的ID,它只包含2个要筛选的ID值(32位模式
时)。![Alt text]
筛选器结构体配置: