点东西不容易,花了6小时终于明白了过滤,关键是没有找到合适的范例 。STM8S提供了6个32位的过滤寄存器,我们暂以只讨论32位的地址过滤。
这6个32位的过滤,可以选用列表方式,即6个寄存器组设置的标识符才可不被CAN丢弃,但这似乎很少这样通讯,一般我们会选用电脑网卡类似的遮罩方式 192.168.1.1 / 255.255.255.0 如此就限制了只有同网段的包才可被接收,下面我们重点来讨论这个问题 。
6个32位过滤寄存器(我们可以把它当成32位的,这样更易表述些,实际上是4个8位的),可以两两组合成带有遮罩过滤的3个组,我们只讨论其中一组即可。
在发送数据时,标识包格式如下:
而过滤寄存器的格式如下,也就是说接收和发送的标识符的ID排列结构是不一致的,STM库一贯较好,在此处表现很欠佳,所以让我折腾了6个小时,正是这一原因,所以很估计多CAN初学者可能都在此处遇到麻烦了吧
通常我们在程序中这样写
发送:
Tx_Id = 0x12345678;//29bit
Tx_IDE = CAN_Id_Extended;//CAN_Id_Standard;
Tx_RTR = CAN_RTR_Data;
Tx_DLC = 2;
Tx_Data[0] = tx_count++;
Tx_Data[1] = ~Tx_Data[0];
// CHECK_MAIL();
status = CAN_Transmit(Tx_Id,Tx_IDE,Tx_RTR,Tx_DLC,Tx_Data);
而接收过滤就很易出错:如下
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterScale = CAN_FilterScale_32Bit;
CAN_FilterID1=0x91;//假如我们只想收到0X12345678标识符前8bit相同的标识头的包,这里要填上0X12就大错了,因为收发的标识符是不对齐的,所以接收包的ID向左移3位,第一字节就成了0X91,其它位同理
CAN_FilterID2=0x00;
CAN_FilterID3=0x00;
CAN_FilterID4=0x00;
CAN_FilterIDMask1=0xff;
CAN_FilterIDMask2=0;
CAN_FilterIDMask3=0;
CAN_FilterIDMask4=0;
CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode,
CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, CAN_FilterID3,
CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2,
CAN_FilterIDMask3, CAN_FilterIDMask4);
|