打印
[STM8]

STM8S can 过滤总结(转)

[复制链接]
846|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
稳稳の幸福|  楼主 | 2016-5-20 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 稳稳の幸福 于 2016-5-20 16:04 编辑

TM8S can 过滤总结.pdf (199.02 KB)



沙发
稳稳の幸福|  楼主 | 2016-5-20 16:03 | 只看该作者
点东西不容易,花了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);




使用特权

评论回复
板凳
大果仁儿| | 2016-5-23 15:31 | 只看该作者
哼哼~学习下

使用特权

评论回复
地板
稳稳の幸福|  楼主 | 2016-5-27 15:40 | 只看该作者
这个学习材料是学习CAN必须要学的,要学的可以下载了收藏。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

3190

帖子

8

粉丝