有玩stm32 can的么?求助一下

  • m
    maxims
    我用stm32 can读总线,现在想用16位宽进行一个滤波,一个设备有两组数据,0x110/0x120,0x130/0x140类推,110这个组,有帧0x110/112/114/115/116/117,同理,120这组有0x120/122/124/125/126/127,后边类似……


    那么,如果我要过滤出0x110,验证码和屏蔽码该怎么算?
    如果,我需要过滤出0x110/112/114/115/116/117多帧,又该怎么算?

    卖家支持有限,我看了一宿的stm32 CAN教程,也没个demo……没完全整明白。

    求计算过程,谢谢 iPhone SE fly ~



    --------------------------------


    更新一下,如何计算:
    1、计算校验码:
    比如,过滤出单个帧,ID=0x117,先把0x117进行十六进制转二进制变换,得到B‭000100010111‬,由于CAN滤波器只支持11位,所以需要去掉最高位的0,得到B00100010111‬=。


    2、计算屏蔽码:
    屏蔽码是如何起作用的呢?从1的最后结果来看,如果我们需要精确得到0x117这帧数据内容,那么就需要精确匹配B00100010111,STM32和ZLG CanTest在屏蔽码的计算上是有区别的,STM32需要精确匹配的位需要置1,无所谓的位需要置0。
    精确匹配0x117的屏蔽码=B11111111111,也就是0x7FF,把2校验码和屏蔽码对应起来看:


    1. B‭00100010111 = 0x117
    2. B11111111111 = 0x7FF
    复制代码


    3、填入STM32的过滤寄存器
    由于STM32的CAN寄存器是32位(也可以拆分为两个16),按寄存器格式填入上边计算所得,需要对计算所得的值进行一个变换。

    校验码=0x117<<21=0x22E00000,这里的计算抛弃计算出来的末尾三位(也是由于寄存器设计的原因,我是这么理解的),取前面8位即可。
    屏蔽码=0x7FF<<21=0xFFE00000,这里的计算抛弃计算出来的末尾三位(也是由于寄存器设计的原因,我是这么理解的),取前面8位即可。


    4、如果需要对一个帧ID段进行过滤,比如0x110到0x117,先来看看规律
    1. 110 100010000
    2. 112 100010010
    3. 114 100010100
    4. 115 100010101
    5. 116 100010110
    6. 117 100010111
    7. 规律 100010xxx
    复制代码




    根据总结出来的规律进行屏蔽码的计算即可。
  • 寒冰炫
    没读过can总线,读过i2c总线
  • l
    linuxpro
    回复1#maxims
    给原厂干活就好好要手册看,要么就淘宝买现成的iOS fly ~
  • z
    zengxin
    你这个描述感觉不是很清晰。硬件过滤应该是针对id部分的。
  • j
    jckimi
    你数据都读出来了,过滤还不简单???
  • m
    maxims
    我原来用的ZLG,现在我用的uart can,我想把can数据转到uart上,交给别的软件处理。读数据什么都没问题,就是数据量太大,现在想滤出我要的帧,处理的数据量少点。 iPhone SE fly ~
  • m
    maxims
    我说的就帧id,0x110就是一个帧id iPhone SE fly ~
  • m
    maxims
    算校验码和屏蔽码不会……和cantest不一样, iPhone SE fly ~
  • j
    jckimi
    回复8#maxims


    你先把0x110这一组的数据完整的过滤出来,这也才12个bit啊,完全符合你说的16位。 你完整的数据过滤出来后,在根据数据格式,做解析,或者做验证什么的。
  • m
    maxims
    我可能没描述清楚……


    100个帧里面,只有我提到的0x110/112/114/115/116/117是我需要的,剩下的是别的数据帧,这对我来说100个帧无效数据太多……我需要计算出两个过滤码,填进去! iPhone SE fly ~
  • j
    jckimi
    回复10#maxims


    先把0x110这个组筛选出来,最多16组吧,0x110-0x11f,你要的,0x110-0x117,最后4 bit你自己转换成二进制再想想,是不是最高位都是为0?
  • m
    maxims
    CANTEST,我知道怎么过滤出来我要的,问题是stm32的can滤波器计算方式和电脑上的cantest不同……我求的是stm32 的can滤波器计算方式。 iPhone SE fly ~
  • b
    bluebaby
    看不懂
  • M
    Maipo
    GeekTalks/D版电子DIY爱好者
    欢迎大佬莅临指导
    ————————————————
    因为讨论PC/NAS的话题信息实在已经很多了,
    本群主题方向偏电子硬件一些,
    有一个能自己动手用电子硬件改造和DIY生活的乐趣所在。

    电子电路类话题,模拟数字电路,棚撘功放
    单片机类话题,低级的51,AVR,Arduino,STM32,ESP8266,ARM,高级各种树莓派嵌入式系统
    DIY类话题,时钟,显示,VFD,LCD,3D制作,机械。。。
    ————————————————

    原来群是NAS类IPSAN的DIY群,后来有更热闹的NAS大群就一直荒废了,现在改主题吧。

    放一个临时群二维码,进群后加群主进主群退临时群

    关联

    [D版微信群][电子DIY爱好者][数模电路单片机Arduino/STM32/ESP8266/时钟/3D打印/]
    [https://www.hi-pda.com/forum/viewthread.php?tid=2811471]