代码: CAN_FilterInitStructure.CAN_FilterIdHigh= (((((u32)0x01 <<21)&0xFFFF0000)>>16)); CAN_FilterInitStructure.CAN_FilterIdLow= ((((u32)0x01<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF) ; CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0xFFFF; 问题1:以上代码设置是只要ID为0x01发送过来的数据,才会触发接收中断,其他ID发送过来的数据都不会触发接收中断? 问题2:为什么要左移21位,右移16位?? 问题3:如果接收多个ID要这么设置,比如:0x01,0x02,0x03 |
1. 标准帧ID是11位放在寄存器位31:21,所以左移21
2. 32位被拆分成高低16字节,所以在设置CAN_FilterIdHigh的时候要右移16位才能取到高16位
3.你说只有收到0x01才能触发中断,看来设置的是屏蔽位模式,如果要接收0x02,0x03,可以将相应位设置为不关心,例如
CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0xFFFC;
就能接收0x00-0x03的报文了
评分
查看全部评分
谢谢您的解惑!!!