目录
初次理解,如有错误,请多多指教,欢迎交流!
CAN通信的ID有标准ID和扩展ID,其有四种模式,即列表模式和掩码模式(两种模式的区别网上资源较多,此处不做具体区别,其主要却别是列表模式下的ID较为具体(每一位都是明确的),而掩码ID),其中列表模式和掩码模式各有16位宽和32位宽。可能说的不够准确,如下图:
下面说明下四种ID的寄存器的配置。
备注:1、标准ID有10位,扩展ID是29位。
2、位宽为16的ID,是没有扩展ID的。
列表模式
16位列表模式
比如,
StdId =0x6af;
0x6af: 0110 1010 1111
0x6af<<5: 1101 0101 1110 0000
32位列表模式
StdId =0x6af;
ExtId =0x1803f601;
0x6af: 0110 1010 1111
0x6af<<5: 1101 0101 1110 0000 (高16)
0000 0000 0000 0000
| 0000 0000 0000 0000 (低16)
其中低16位等价于 0 | CAN_Id_Standard
因为#define CAN_Id_Standard ((uint32_t)0x00000000)
----------------------------------------------------------------
0x1803f601: 0001 1000 0000 0011 1111 0110 0000 0001
0x1803f601<<3: 1100 0000 0001 1111 1011 0000 0000 1000
(0x1803f601<<3)>>16: 0000 0000 0000 0000 1100 0000 0001 1111
(0x1803f601<<3)>>16 & 0xffff: 0000 0000 0000 0000 1100 0000 0001 1111 (高16(取低16位))
0x1803f601<<3: 1100 0000 0001 1111 1011 0000 0000 1000
0x1803f601<<3 & 0xffff: 1100 0000 0001 1111 1011 0000 0000 1000
(ExtId<<3)&0xffff | CAN_ID_EXT: 1100 0000 0001 1111 1011 0000 0000 1100 (低16(取低16位)
其中 #define CAN_Id_Extended ((uint32_t)0x00000004)
掩码模式
16位掩码模式
StdId =0x6af;
0x6af: 0110 1010 1111
0x6af<<5: 1101 0101 1110 0000
mask: 1111 1111 1111 1111
筛选后: 1101 0101 1110 0000
mask中某一位为1时,必须一致,举例如下
验证码: 0110 0001 1100
掩码: 1100 0011 1010
则筛选后的ID为:01xx xx01 1x0x (其中x可以为1或者0),则ID在100 0001 1000 ~ 111 1101 1101范围内的ID都会被筛选。
32位掩码模式
参考博客:
(4条消息) 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结_bonson2004的博客-CSDN博客