STM32 CAN 发送和接收过滤原理

        通过对CANBUS协议的理解,我们知道:CAN总线上的节点接收或发送数据都是以帧为单位的。CAN协议规定了好几种帧的类型,但是对于使用者而言,只有数据帧和远程帧可以通过软件编程来控制。(其他几种帧都是由CAN控制硬件实现的,我们想管也管不了)。而数据帧和远程帧最大的区别在于:远程帧没有数据域。(这也是我没有用过远程帧的原因o(╯□╰)o)数据帧分为标准帧和扩展数据帧,它们之间最大的区别在于:标识符(ID)长度不同(标准帧为11位,而扩展帧为29为)。

       在这里就不对数据帧的构成作介绍了,主要介绍STM32中MCU是如何接收其他MCU发送过来的数据的。其实原理很简单,就是过滤!只不过过滤遵循的原则比较琐碎,很多人都不太理解这个原则。 

        STM32参考手册中提到:bxCAN控制器为应用程序提供了14个位宽可变的、可变的过滤器组(0~13)(互联型有28个)。每个过滤器组的位宽都可以独立配置。可以配置成16位或者32位。过滤器组还可以配置为屏蔽位模式(也叫标识符屏蔽模式、标识符掩码模式、CAN_FilterMode_IdMask)或者标识符列表模式(CAN_FilterMode_IdList)。

       先理解一句话,每个过滤器组x由2个32位寄存器,CAN_FxR1和CAN_FxR2组成。我们只要理解了一个过滤器组,其他可以类推。我们先来看一个32位过滤器处于屏蔽位模式的情况。CAN_FxR1作ID,CAN_FxR2作屏蔽,如下图所示。

                 

       第一行的ID就是CAN_FxR1寄存器中的内容,而第二行掩码就是CAN_FxR2寄存器中的内容。需要注意的是,这里的ID和发送数据帧里面的ID并不是一个东西,它(筛选器中的ID)是接收机中的内容,接收机用它来确定自己要接收的数据。   强调:这里的ID也是根据自己的实际需要设置的!抛开它们所代表的的实际意义,认为它们存在的意义是为了“防守”(过滤其他MCU发送过来的帧 的ID)。     

      这里的屏蔽(也就是第二行开头的掩码)是什么意思??这里的屏蔽和ID共同配合完成过滤。

      这里的映射什么意思??映射的意思就是假定收到的帧的ID信息。         

      看例子:

     1、若我们只想收到其他MCU发过来的ID为 0x317 的标准数据帧:                                                                                                     0x317 的二进制位: 011 0001 0111                                                                                                                                                  那么就可以这样设置:

      CAN_FxR1 :0110  0010  111X  XXXX  XXXX  XXXX   XXXX  X00X    (ID)                                                                                     CAN_FxR2 :1111   1111   1110   0000   0000   0000     0000   0110   (屏蔽) 

      CAN_FxR1 (第一行)就是我们设置的想要收到的数据帧的ID。                                                                                                      CAN_FxR2 (第二行)中为 1 的位,意味着收到的数据帧中相应的ID位必须和设置的ID位一样(必须匹配)。

     2、若我们想收到其他MCU发过来的ID位 0x310 到 0x317 的标准数据帧:                                                                                         那么就可以这样设置:

      CAN_FxR1 :0110  0010  xxxX  XXXX  XXXX  XXXX   XXXX  X00X    (ID)                                                                                     CAN_FxR2 :1111   1111  0000   0000    0000   0000     0000   0110   (屏蔽) 

      CAN_FxR1中的红色xxx就代表了 000 到 111 的任意组合。                                                                                                              CAN_FxR2中为 0 的位,意味着收到的数据帧中的相应位的ID不一定非要与设置的ID一样(不用关心)。最后两个红色的 1 表明必须是标准数据帧。

     3、若我们想收到其他MCU发过来的ID为 0x000 到 0x7FF 的标准数据帧:                                                                                         那么就可以这样设置:

       CAN_FxR1 :xxxx   xxxx  xxxX  XXXX  XXXX  XXXX   XXXX  X00X    (ID)                                                                                     CAN_FxR2 :0000  0000  0000   0000   0000   0000     0000   0110   (屏蔽) 

接下来看2个32位过滤器——标识符列表模式,CAN_FxR1和CAN_FxR2都作为ID。这种情况就比较简单。只有接收到的数据帧的ID和CAN_FxR1或者CAN_FxR2完全一样,这样我们才会接收它。这样的话,就只能接收两种不同的ID。

也就是说,第一行和第二行的ID都用于过滤接收的数据帧的ID,只有接收到的数据帧的ID与它们俩之中一个,才会被接收。               看例子:

       若我们把CAN_FxR1和CAN_FxR2设置成如下的样子。

       CAN_FxR1 :0110  0010  111X  XXXX  XXXX  XXXX   XXXX  X00X    (ID)                                                                                     CAN_FxR2 :0000  0001  1110   0000    0000   0000     0000   0000    (ID)

       这样的话, 就只能过滤出ID为 0x317(与CAN_FxR1必须一样)和 0x00F (与CAN_FxR2必须一样)两种标准数据帧了。         以上就是32位模式下标识符屏蔽模式和标识符列表模式下的设置方法。

在16位模式下,只不过把两个32位寄存器拆成了4个16位的而已,原理和32位模式下是一样的,在这里就不赘述了。

 

  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果STM32CAN2能够发送数据但是无法接收数据,那么通常情况下有以下几个可能的原因: 1. 硬件连接问题:首先需要检查CAN总线连接是否良好,确保所有的引脚都正确地连接。还需要检查电压、电流和阻抗是否处于正常范围内。 2. 发送接收波特率不匹配:通信的两端需要设置相同的波特率才能正常通信。如果发送接收端设置的波特率不一致,那么就无法正常接收数据。 3. 程序错误:如果代码中出现了程序错误,也可能导致STM32CAN2无法正常接收数据。需要检查代码中是否存在错误,并进行修正。 4. 过滤器设置问题:另外,如果STM32CAN2配置的过滤器不正确,可能会导致它无法接收到需要的数据。需要仔细查看过滤器的设置,并确认设置是否正确。 5. 其他问题:如果以上几种情况均不是原因,就需要进一步排查可能出现的异常情况,比如硬件损坏、电源问题等。在这种情况下,可能需要更高级别的排查技能才能找到问题所在。 ### 回答2: STM32CAN2是一种用于控制器区域网络通信的微控制器,它可以用于接收发送CAN总线上的数据。如果STM32CAN2能够发送但无法接收数据,那么可能会出现以下几种问题。 首先,可能是因为硬件故障而导致。例如,CAN总线线路中的接地电阻出现了故障或损坏,或者在CAN总线线缆中的传输速率设置错误,都可能导致STM32CAN2无法接收数据。 其次,可能是因为STM32CAN2的时钟电路或初始化设置有问题。这些问题可能会影响芯片的工作频率或电路的稳定性,导致STM32CAN2无法读取或解码接收到的数据。 还有可能是因为软件程序有问题。例如,程序可能没有正确配置CAN总线的过滤器或帧格式,或者程序没有正确处理多个节点同时发送的数据,从而导致STM32CAN2无法正确接收数据。 解决这些问题需要对硬件和软件进行全面的诊断和检查。在修改硬件问题之前,最好在软件调试阶段尝试解决问题。通过检查STM32CAN2的初始化设置、时钟电路、过滤器和帧格式等方面的设置,并对程序进行调试和修正,可以帮助解决STM32CAN2接收数据的问题。 ### 回答3: stm32是一系列32位的微处理器,stm32can2则是其中一个能够进行CAN通信的模块。CAN通信是控制器局域网络的缩写,它是现代车辆电子控制系统和其他工业自动化应用的基础。在CAN总线网络中,数据可以在不同的节点之间传输和共享,从而实现设备之间的通信。 对于stm32can2的问题,只能发送而不能接收的原因可能有以下几个方面: 1. 消息ID不对。CAN总线的每个消息都有特定的ID值,如果发送的消息ID和接收端不匹配,接收端是无法正确接收该消息的。 2. 滤波器配置错误。CAN总线还需要通过滤波器才能正确的识别接收到的消息,如果滤波器的配置错误,则接收端无法从总线上正确接收到消息。 3. 硬件问题。如果stm32can2硬件出现故障,例如线路连接不良或者传输速率不匹配等,则也会导致接收失败。 4. 软件问题。程序有缺陷或者逻辑错误也可能导致CAN总线通信出现问题。如果程序无法将发送接收进行正确的处理,那么就会出现数据不能正常接收的问题。 总的来说,如果stm32can2只能发送而不能接收,需要对配置进行全面检查,并逐一排查问题的原因,从而解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值