您现在的位置: 主页 > MCU > 单片机技术应用 > STM8S can 过滤总结 -
本文所属标签:
为本文创立个标签吧:

STM8S can 过滤总结 -

来源: 网络用户发布,如有版权联系网管删除 2018-09-07 

[导读]学点东西不容易,花了6小时终于明白了过滤,关键是没有找到合适的范例 。STM8S提供了6个32位的过滤寄存器,我们暂以只讨论32位的地址过滤。这6个32位的过滤,可以选用列表方式,即6个寄存器组设置的标识符才可不被CA

学点东西不容易,花了6小时终于明白了过滤,关键是没有找到合适的范例 。

本文引用地址: http://www.21ic.com/app/mcu/201807/781914.htm

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);




              查看评论 回复



嵌入式交流网主页 > MCU > 单片机技术应用 > STM8S can 过滤总结 -
 

"STM8S can 过滤总结 -"的相关文章

网站地图

围观()