简介
控制器局域网CAN(Controller Area Network)是由德国博世公司为汽车应用而开发的多主机局部网络,用于汽车的监测和控制,德国博世公司开发CAN总线的最初目的是解决汽车上数量众多的电子设备之间的通信问题、减少电子设备之间繁多的信号线,于是设计了一个单一的网络总线,所有的外围器件可以挂接在该总线上。
1991年,NXP半导林公司制定并发布CAN技术规范CAN2.0A/B,其中,CAN2.0A协议规范定义了标准帧格式,CAN2.0B协议规范定义了扩展顿格式,1993年11月,ISO组织正式颁布CAN国际标准lSO11898(高速应用,数据传输速率小于1Mbps)和ISO11519(低速应用,数据传输速率小于125 kbps)。
各种通讯接口对比
波特率范围在5kbps~1Mbps之间,也是双方规定通讯波特率一致的现况下,才能正确接收数据
报文
在CAN总线上传输的信息称为报文,相当于部递信件的内容,当CAN总线为闲时,任何连接的单元都可以发送新的报文。
报文信号使用差分电压传送,两条信号线(以双绞线传输介质为例)称为CAN_H和CAN_L,静态时均是2.5V左右,此时状态表示为逻辑1,也可以叫隐性。用CANH比CANL高表示逻辑0,称为显性,此时的电压值通常为CANH=3.5V和CAN_L=1.5V。
总线上的报文信息表示为几种固定的赖类型
数据帧:从发送节点向其他节点发送的数据信息,相当于甲方发送有内容的信件到乙方方给自己发送一封有内容的信件。
远程帧:向其他节点请求发送具有同一识别符的数据帧,相当于甲方请求
错误帧:检测到总线错误,发送错误帧。
过载帧:过载帧用以在数据帧或远程帧之间提供附加的延时。
帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧。
CAN总线通信有两种不同的帧格式:数据帧有标准帧和扩张帧两种格式,一个11位,一个29位。
数据帧
标准格式帧和扩展格式帧中有所不同,标准格式帧的仲裁场由11位标识符和远程发送请求位RTR组成,扩展格式帧的仲裁场由29位标识符和远程发送请求位RTR组成。
控制场由6个位组成,包括数据长度代码和两个将用于扩展的保留位。数据长度代码指出了数据场中字节的数量。数据长度代码为4位,在控制场里发送,数据帧长度允许的字节数为0、1、2、3、4、5、6、7、8,其他数值为非法的。
数据场由数据帧中的发送数据组成。它可以为0~8字节,每字节包含了8位,首先发送最高有效位MSB,依次发送至最低有效位LSB。CRC场包括CRC序列(CRC SEQUENCE)和CRC界定符(CRCDELIMITER),用于信息帧校验。
应答场长度为2个位,包含应答间隙(ACK SLOT)和应答界定符(ACK DELIMITER)。在应答场里,发送节点发送两个隐性位。当接收器正确地接收到有效的报文时,接收器就会在应答间隙(ACKSLOT)期间(发送ACK信号)向发送器发送一个显性的位以示应答。
远程帧->省略
错误帧->省略
过载帧->省略
列表模式
首先我们是不是很快就会想到只要准备好一张表,把我们需要关注的所有CAN报文ID写上去,开始过滤的时候只要对比这张表,如果接收到的报文ID与表上的相符,则通过,如果表上没有,则不通过,这个就是简单的过滤方案。总结列表模式就是自己特定关心的ID进行选择出来
掩码模式
假设身份上的18位数 ,我们要为它准备好两张纸片,一片写上屏蔽码,另一片纸片写上验证码。在执行任务的时候先将获取的身份证号码与屏蔽码进行“与”操作,再将结果与验证码的进行比较,根据判断是否相同来决定是否通过。整个判别流程如下所示:
在bxCAN中,分别采用了两个寄存器(CAN_FiR1,CAN_FiR2)来存储屏蔽码与验证码,从而实现掩码模式的工作流程的。这样,我们就知道了bxCAN过滤器的掩码模式的大概工作原理。
但是,我们得注意到,采用掩码模式的方式并不能精确的对每一个ID进行过滤,打个比方,还是采用之前的守卫的例子,假如城主要求只有1150到1158年出生的人能通过,那么,若我们还是才用掩码模式,那么掩码就设为第7到9位为”1”,对应的,验证码的7~9位分别为”115”,这样就可以了。但是,仔细一想,出生于1159的人还是可以通过,是不是?但总体来说,虽然没有做到精确过滤,但我们还是能做到大体过滤的,而这个就是掩码模式的缺点了。在实际应用时,取决于需求,有时我们会同时使用到列表模式和掩码模式,这都是可能的。
#列表模式与掩码模式的对比
综合之前所述,下面我们来对比一下列表模式与掩码模式这两种模式的优缺点。
模式 | 优点 | 缺点 |
---|---|---|
列表模式 | 能精确地过滤每个指定的CAN ID | 有数量限制 |
掩码模式 | 取决于屏蔽码,有时无法完全精确到每一个CAN ID,部分不期望的CAN ID有时也会收到 | 数量取决于屏蔽码,最多无上限 |
终于进入到正题了!前面已经介绍了过滤器的列表模式与掩码模式,以及掩码模式下的屏蔽码与验证码的含义,还介绍了标准CAN ID与扩展CAN ID的组成部分。现在我们终于要站在bxCAN的角度来分析其过滤方案。
首先过滤模式分列表模式和掩码模式,因此,对于没有过滤器,我们需要这么一个位来标记,用户可以通过设置这个位来标记他到底是想要这个过滤器工作在列表模式下还是掩码模式,于是,这个表示过滤模式的位就定义在CAN_FM1R寄存器中的FBMx位上,如下图:
CAN过滤器模式寄存器CAN_FM1R定义
这里以STM32F407为例,bxCAN共有28个过滤器,于是上图的每一个位对应地表示这28个过滤器的工作模式,供用户设置。”0”表示掩码模式,”1”表示列表模式。
另外,我们知道了标准CAN ID位11位,而扩展CAN ID有29位,对于标准的CAN ID来说,我们有一个16位的寄存器来处理他足够了,相应地,扩展CAN ID,我们就必须使用32位的寄存器来处理它,而在实际应用中,根据需求,我们可能自始至终都只需要处理11位的CAN ID。对于资源严重紧张的MCU环境来说,本着不浪费的原则,这里最好能有另外一个标志用告诉过滤器是否需要处理32位的CAN ID。于是,bxCAN处于这种考虑,也设置了这么一个寄存器CAN_FS1R来表示CAN ID的位宽,如下图所示:
CAN过滤器位宽寄存器CAN_FS1R定义
如上图,每一个位对应着bxCAN中28个过滤器的位宽,这个需要用户来设置。
于是根据模式与位宽的设置,我们共可以得出4中不同的组合:32位宽的列表模式,16位宽的列表模式,32位宽掩码模式,16位宽的掩码模式。如下图所示:
CAN总线收发,中断方式接收配置
平台:STM32F103VE
STM32CUBEMX V5.3
配置CAN
CAN的波特率最大为1Mbps。
波特率计算方法:时钟主频 / 分频 / (tq1 + tq2 + swj)
以500K的波特率配置为例:
stm32f103的CAN的时钟主频是36M,分9频就是4M,在除以(5 + 2 + 1)得到500K的波特率。
注意:stm32cubemx生成的CAN代码是不带过滤器的,需要自己手动添加。
配置参数
参数 | 意思 |
---|---|
Prescaler | 预分频,即位时序提到的APB1 peripheral clocks继续分一次频 |
Time Quantum | 最小时间单位Tq,自动计算出来的,不需要填写 |
Time Quanta in Bit Segment 1 | PBS1段长度 |
Time Quanta in Bit Segment 2 | PBS2段长度 |
ReSynchronization Jump Width | 重同步跳跃宽度,即位时序提到的SJW |
Time Triggered Communication Mode | 是否使能时间触发 |
Automatic Bus-Off Management | 是否使能自动离线管理 |
Automatic Wake-Up Modet | 是否使能自动唤醒 |
Qutomatic Retransmission | 是否使能自动重传 |
Receive Fifo Locked Mode | 是否使能锁定FIFO |
Transmit Fifo Priority | 配置报文优先级的判断方法 |
Oprating Mode | 操作模式 |
这些参数也可以在can.c中自行修改
中断(NVIC)设置,根据需要设置,一般勾上CAN1 RX0 Interrupt
位时序
意义:为了实现正确的总线电平采样,确保通讯正常。最小单位是Tq(Time Quantum),一个完整位由8~25个Tq组成
组成:SS段、PTS 段、PBS1段、PBS2段
段名 | 意义 | 作用 |
---|---|---|
SS(1Tq) | 同步段 | 补偿物理延时,是传播时间、收发器延时之和的两倍 |
PTS(1~8Tq) | 传播时间段 | 补偿变压阶段误差 |
PBS1(1~8Tq) | 相位缓冲段1 | 使总线各节点同步 |
PBS2(2~8Tq) | 相位缓冲段2 | 补偿边沿阶段误差 |
SJW(1~4Tq) | 再同步补偿宽度 | 补偿时钟频率偏差、传输延迟等 |