最近在研究S12XEP100 MSCAN部分,这里结合codewarrior的PE配置工具,针对MSCAN滤波器进行理解和记录。
PE中滤波器配置项如下图:
①acceptance mode部分:
可选择为两个32-bit 或 四个16-bit 或 八个8-bit接收滤波器 或 滤波器关闭 四种模式,
1)两个标识符滤波器,每个应用于:
扩展标识符的全部29位和CAN2.0B帧的以下位:远程发送请求(RTR),标识符扩展(IDE),替代远程请求(SRR).
或标准标识符的11位,加上CAN2.0A/B报文的RTR和IDE位。
2)4个标识符接收滤波器,每个应用于:
扩展标识符的14个最重要位,加上CAN2.0报文的SRR和IDE位。
或标准标识符额11位,加上CAN2.0A/B报文的RTR和IDE位。
3)8个标识符接收滤波器,每个应用于标识符的前8位。
4)关闭滤波器
对应寄存器为MSCAN Identifier Acceptance Control Register (CANIDAC),寄存器结构如下图:
IDAM1:0 即为ID接收滤波模式配置项,两位能配置上述四种模式,定义了标准(11:0)或扩展ID(28:0)的通过模式,其任何一位都能使用CANIDMR标记为"don’t care"。
IDHIT2:0 标识符接收有效标志。
②acceptance code部分:
分为code1和code2,对应了两组AC寄存器(first bank,second bank),每组包含了MSCAN Identifier Acceptance Registers (CANIDAR0-7),对于扩展帧四个寄存器全有效,对于标准帧仅前两个寄存器有效 (CANIDAR0/1, CANIDMR0/1)。ID的每一位需要匹配AC中的值才允许通过。
③acceptance mask部分:
分为mask1和mask2,对应了两组AM寄存器(first bank,second bank),每组包含了MSCAN Identifier Mask Registers (CANIDMR0–CANIDMR7)。
例:接收标准帧ID,在32位滤波器模式下,需要将CANIDMR1 和 CANIDMR5 中的AM[2:0]设置为“don’t care”.
在16位滤波器模式下,需要将CANIDMR1、CANIDMR3、CANIDMR5 和 CANIDMR7 中的AM[2:0]设置为“don’t care”.
AM为0,ID中的该位必须与AC中的一致。AM为1,ID中的该位可任意值通过,不需要匹配AC中的值。
AC和AM填写方式要按照以下格式:
扩展帧:
标准帧:
举个例子:
若需要滤波接收三帧扩展帧报文:
首先分解三个ID至每一位,然后分别计算每列3位的按位AND值,以及XOR值(XOR出1就返回1并break)。
AC1四个字节从左到右的计算公式分别为:
AND结果中的:[ data28&data27&...&date21 ],[ data20&data19&data18&SRR(1)&IDE(1)&data17&data16&data15 ] ],[ data14&data13&...&date7 ],[ data6&data5&...&date1&RTR(0) ]
AC2填写默认值0;
AM1四个字节从左到右的计算公式分别为:
XOR结果中的:[ data28&data27&...&date21 ],[ data20&data19&data18&SRR(1)&IDE(1)&data17&data16&data15 ] ],[ data14&data13&...&date7 ],[ data6&data5&...&date1&RTR(0) ]
AM2填写默认值FF;
同理,若要滤波标准帧报文,需要使用标准帧格式ID10~ID0 RTR IDE.
本文所述的配置值计算使用VBA实现,源代码见:https://github.com/SolaZhao/vba.git
该VBA也可用于VBA自学基础入门。