飞思卡尔MC9S12XEP100 CAN学习总结(三) 滤波器配置

标准帧和扩展帧

标准帧格式:具有11位标识符; 扩展帧格式:具有29位标识符; 两种帧格式可以出现在同一总线上。

标准帧

CAN 标准帧的ID结构

标准帧发送相关代码

msg.id = 0x5C; CAN0TXIDR0 = (unsigned char)(msg.id>>3); CAN0TXIDR1 = (unsigned char)(msg.id<<5);

标准帧接收相关代码

msg->id = (unsigned int)(CAN0RXIDR0<<3) | (unsigned char)(CAN0RXIDR1>>5);

后续补充

扩展帧

CAN 扩展帧的ID结构 在我们给的ID里没包含SRR与IDE与RTT,比如扩展帧ID:0x10F81099,展开为:

0001 0000 1111 1000 0001 0000 1001 1001,这个ID里的标准帧11位于扩展后的18位直接相连的,我们需要把SRR与IDE和RTR加进去就是我们滤波的CANIDAR寄存器的值;

具体方法为,从第19位开始向左移3位,空出SRR和IDE;低18位向左移一位,空出RTR

1 0000 1111 10 xx 00 0001 0000 1001 1001 x

绿色的’x’为移动后空出的位

整理下为:1000 0111 110x x000 0010 0001 0011 001x

空出的位,根据帧类型填就行,也可随便填,我们CANIDMR的值,在该位取1,不关心该为就好了;

例如我们需要过滤出扩展帧0x10F81099;

则根据上面的,得出AR值为: 1000 0111 110x x000 0010 0001 0011 001x,把x取1,则为

1000 0111 1101 1000 0010 0001 0011 0011 即AR寄存器值为 0x87D82133 ,那么MR值只把SRR,IDE,RTR位取1

扩展帧发送相关代码

msg.id = 0x10F81099 CAN0TXIDR0 = (unsigned char)(msg.id>>21); CAN0TXIDR1 = (((unsigned char)(msg.id>>13))&0xe0)|0x18|(((unsigned char)(msg.id>>15))&0x07); CAN0TXIDR2 = (unsigned char)(msg.id>>7); CAN0TXIDR3 = ((unsigned char)(msg.id<<1));

扩展帧接收相关代码

msg->id = (((unsigned long)CAN0RXIDR0)<<21)|((unsigned long)(CAN0RXIDR1&0xe0)<<13)| ((unsigned long)(CAN0RXIDR1&0x07)<<15)|(((unsigned long)CAN0RXIDR2)<<7)| ((unsigned long)(CAN0RXIDR3&0xfe)>>1);

经验分享 程序员 微信小程序 职场和发展