目录
关键词
嵌入式、C语言、autosar、OS、BSW
平台说明
项目 | Value |
---|---|
OS | autosar OS |
autosar厂商 | vector , EB |
芯片厂商 | TI 英飞凌 |
编程语言 | C,C++ |
编译器 | HighTec (GCC) |
autosar版本 | 4.3.1 |
一、背景
什么是CAN 滤波?讲人话,就是个筛选器,哪些报文需要,哪些不需要,筛选一下就行。通过配置就可以实现上述功能。
二、硬件滤波和软件滤波
2.1 硬件滤波
硬件滤波实现是在CAN Drv 。MCU会提通过相关存器来实现对标准11bit或者扩展29bit ID 的过滤。下图为TC3XX系列相关寄存器说明,有兴趣自行查看:
2.1.1硬件滤波在vector cfg中的配置处
2.2 软件滤波
软件滤波在CANIF中通过相关配置实现。
2.3 软件滤波和硬件滤波对比
CPU消耗: 硬件滤波 < 软件滤波
效率: 硬件滤波 > 软件滤波
范围: 硬件滤波 2n 例如0x0-0x1,0x0-0x3,0x0-0x7,0x0-0xF。软件滤波任意范围帧。
三、CanFilterCodeValue 和 CanFilterMaskValue
满足下面公式的报文才能通过滤波:
receiveID & Mask == Code & Mask
3.1 Filter Mask
翻译为掩码。标准帧11bit,扩展帧29bit。如果对这个bit关心则置为1,否则为0.
例如:接收ID范围0x400–0x43F
0x400 二进制:0100 0000 0000
0x43F 二进制:0100 0011 1111
bit | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0X400 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0X43F | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
mask | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
①bit11:超出范围,不关心置为0。
②bit10-bit8:收到的报文这3bit必须为1 0 0即0x4,所以这三位都必须关心,因此mask这三bit分别置为1 1 1。
③bit7-bit4:bit7和bit6在0x0变为0x3的过程中没有任何变化,所以收到的报文这两位必须是0,因此这两位必须被关心,mask bit7 bit6 被置为1.而bit5 和bit6 在0x0变为0x3的过程中都被改变过,所以不管收到的报文这两位是什么值我们都不必关心,因此mast 的bit5和bit6 被置为0.
④bit3 -bit0:bit3 -bit0 在0x0变为0xF的过程中都被改变过,所以不管收到的报文这四位是什么值我们都不必关心,因此mast 的bit3 -bit0 被置为0.
因此mask = 0x7C0.
3.2 Filter Code
翻译为滤波区号,即滤波区间码。
官方手册说得有点复杂,这里提供一种取巧的计算方式:在保证mask计算无误的情况下,用滤波范围内的任意一个值&mask 就能得出code。
如3.1中的0x400–0x43F,取任意一个值:0x431
0x431&0x7C0 = 0x400=code