1,can一次可以发送少于8个字节,只是最多可以发8个。
2, 32位屏蔽位模式如何设置过滤器参数?
在32位宽的模式下,CAN_FxR1与CAN_FxR2都用来存储希望通过的CANID,由于是32位宽的,因此既可以存储标准CAN ID,也可以存储扩展CAN ID。
注意看上图最底下Mapping那行的各位定义,可以看出,从右到左,首先,最低位是没有用的,然后是RTR,表示是否为远程帧,接着IDE,扩展帧标志,然后才是EXID[0:17]这18位扩展ID,最后才是STID[0:10]这11位标准ID,也就是前面所说的基本ID。在进行配置的时候,即将希望通过的CAN ID写入的时候,要注意各个位对号入座,即基本ID放到对应的STD[0:10],扩展ID对应放到EXID[0:17],若是扩展帧,则需要将IDE设为“1”,标准帧则为“0”,数据帧设RTR为“0”,远程帧设RTR为“1”。
(参考https://blog.csdn.net/flydream0/article/details/52317532)
比如设置ID的低5位必须与设置的相同,高6位忽略。
标准库中CAN_FilterIdHigh 对应上图ID行的CAN_FXR1[31:16]
CAN_FilterIdLow 对应上图ID行的CAN_FXR1[15:0]
CAN_FilterMaskIdHigh对应上图ID行的CAN_FXR2[31:16]
CAN_FilterMaskIdLow 对应上图ID行的CAN_FXR2[15:0]
对于标准ID(STID)对应的位是高11位,也就是对应ID或者mask的CAN_FXR1[31:21]或CAN_FXR2[31:21],所以设置CAN_FilterIdHigh 或 CAN_FilterMaskIdHigh 的值时要左移5位.
CAN_FilterIdHigh和CAN_FilterIdLow是对应ID,定义可以通过的id
CAN_FilterMaskIdHigh和CAN_FilterMaskIdLow 是设置屏蔽位
比如 id=0x02
屏蔽id=0x1f = 0001 1111,则表示低5位必须与id中定义的低5位值相同,即低5位必须等于2才能通过,其他位忽略。
由于是标准数据帧,所以IDE为“0”,RTR为“0”,所以CAN_FilterIdLow 和CAN_FilterMaskIdLow都=0.
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x02 << 5; //
CAN_FilterInitStructure.CAN_FilterIdLow = 0; //设定过滤器标识符低位(32为低位段,16位为第二个)
CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0x1f << 5; //设定过滤器标识符高位(32为高位段,16位为第一个)
CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0;