目录
CAN是什么?
CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO*1 国际标准化的串行通信协议。
在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。
总线拓扑图
CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
一般,CPU和CAN Controller 合成在一起。收发器常用的型号是:Tja1050或82C250。
STM32 bxCAN主要特点
支持CAN协议2.0A和2.0B主动模式
波特率最高可达1兆位/秒(1M 距离50米;5K 距离 10公里)
支持时间触发通信功能
发送
3个发送缓冲区
发送报文的优先级特性可软件配置
记录发送SOF时刻的时间戳
接收
3级深度的2个接收缓冲区(FIFO)
可变的过滤器组:
——在互联型产品中CAN1和CAN2分享28个过滤器组
——其它STM32F103xx系列产品中有14个过滤器组
标识符列表
记录接收SOF时刻的时间戳
时间触发通信模式
禁止自动重传模式
16位自由运行定时器
可在最后2个数据字节发送时间戳管理
中断可屏蔽
过滤器组
STM32总共提供14个过滤器组来处理CAN 接收过问题,每个过器组包含两个32位存器CAN FXRO和CAN FXR1 组成,在设置为屏蔽位模式下,其中一个作为标识符寄存器,另一个作为屏蔽码寄存器。过滤器组中的每个过滤器,编号(叫做过滤器号)从0开始,到某个最大数值(这时最大值并非13,而是取决于14个过滤器组的模式和位宽的设置,当全部配置为位宽为16,且为标识符列表模式时,最大编号为14*4-1=55)。
过滤器的过滤模式
STM32提供两种过滤模式供用户设置:标识符屏蔽位模式和标识符列表模式。
过滤器的位宽
每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:
1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位。
2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位。
过滤器匹配序号
一旦收到的报文被存入FIFO,就可被应用程序访问。通常情况下,报文中的数据被拷贝到 SRAM 中;为了把数据拷贝到合适的位置,应用程序需要根据报文的标识符来辨别不同的数据。bxCAN 提供了过滤器匹配序号,以简化这一辨别过程。
根据过滤器优先级规则,过滤器匹配序号和报文一起,被存入邮箱中。因此每个收到的报文,都有与它相关联的过滤器匹配序号。
过滤器匹配序号可以通过下面两种方式来使用:
1.把过滤器匹配序号跟一系列所期望的值进行比较
2.把过滤器匹配序号当作一个索引来访问目标地址
对于标识符列表模式下的过滤器(非屏蔽方式的过滤器),软件不需要直接跟标识符进行比较。
对于屏蔽位模式下的过滤器,软件只须对需要的那些屏蔽位(必须匹配的位)进行比较即可。
过滤器优先级规则
根据过滤器的不同配置,有可能一个报文标识符能通过多个过滤器的过滤;在这种情况下,存放在接收邮箱中的过滤器匹配序号,根据下列优先级规则来确定:
1.位宽为32位的过滤器,优先级高于位宽为 16位的过滤器
2.对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式
3.位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高
初学需要关注的重点
1.隐性位与显性位
CAN总线为“隐性”(逻辑1)时,CAN_H和CAN_L的电平为2.5V(电位差为0V);
CAN总线为“显性”(逻辑0)时,CAN_H和CAN_L的电平分别是3.5V和1.5V(电位差为2V)
2.数据帧类型:
(1)标准数据帧
数据字段最多只能是8,CRC校验
CRC 即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和个系数仅为“0”和“1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
(2)扩展数据帧
(3)标准远程帧
(4)扩展远程帧
3.位时间特性
CAN总线上的所有器件都必须使用相同的比特率。然而,并非所有器件都要求具有相同的主振荡器时钟频率。对于采用不同时钟频率的器件,应通过适当设置波特率预分频比以及每一时间段中的时间份额的数量来对比特率进行调整。
同步段(SYNC_SEG): 同步段为首段,用于同步CAN总线上的各个节点输入信号的跳变沿就发生在同步段,该段持续时间为1TQ。
时间段1(BS1):定义采样点的位置。其值可以编程为1到16个时间单元但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
时间段2(BS2):定义发送点的位置。其值可以编程为1到8个时间单元但也可以被自动缩短以补偿相位的负向漂移。
重新同步跳跃宽度(SJW)定义了,在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。
CAN波特率计算公式
CAN波特率=系统时钟/分频数/(1*tq+tBS1+tBS2)
其中:
tBS1=tq*(TS1[3:0]+1)
tBS2=tq*(TS2[2:0]+1)
tq=(BRP[9:0]+1)*tPCLK
这里tq表示1个时间单元
tPCLK=APB时钟的时间周期
BRP[9:0],TS1[3:0]和TS2[2:0]在CAN BTR寄存器中定义
总体配置保持
tBS1>=tBS2,tBS2>=1个CAN时钟周期,tBS2>=2tSJW
CAN波特率设置数据查询
CAN波特率 | 参数设置 |
5 KBPS | CAN_SJW=CAN_SJW_2tq; CAN_BS1=CAN_BS1_6tq; CAN_BS2=CAN_BS2_4tq; CAN_Prescaler =600; |
10 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler =600; |
20 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler =300; |
25 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler = 240; |
40 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler = 150; |
50 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler =120; |
62.5 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler =96; |
80 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler =75; |
100 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler = 60; |
125 KBPS | CAN_SJW=CAN_SW_tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler = 48; |
200 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler =30; |
250 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler =24; |
400 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_5tq; CAN_BS2=CAN_BS2_3tq; CAN_Prescaler =10; |
500 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler = 12; |
800 KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_5tq; CAN_BS2=CAN_BS2_3tq; CAN_Prescaler = 5; |
1M KBPS | CAN_SJW=CAN_SJW_1tq; CAN_BS1=CAN_BS1_3tq; CAN_BS2=CAN_BS2_2tq; CAN_Prescaler =6; |
4.屏蔽滤波
(1)屏蔽位模式
为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
(2)标识符列表模式
为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器接收报文标识符的每一位都必须跟过滤器标识符相同。
为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式
标识符屏蔽位模式:可过滤出一组标识符。此时,这样CAN_FXR中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FXR1中如果某一位为1则CAN_FXR0中相应的位必须与收到的顿的标志符中的相应位吻合才能通过过滤器:CAN_FR1中为0的位表示CAN_FxR0中的相应位可不必与收到的顿进行匹配。
标识符列表模式:可过滤出一个标识。此时CAN_FXR0和CAN_FXR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。
5.bxCAN工作模式
bxCAN有3个主要的工作模式:初始化、正常和睡眠模式。还包括:测试模式、静默模式、环回模式、环回静默模式。