飞思卡尔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);
