STM32
直播中

陈杰

7年用户 1405经验值
私信 关注
[问答]

如何使用CAN 协议在两个STM32板之间进行通信?

如何使用CAN 协议在两个STM32板之间进行通信

回帖(1)

刘嵘

2021-9-29 15:53:17
本教程将介绍 STM32 中的基本 CAN 协议。 在这里我们将看到,如何使用 CAN 协议在两个 STM32 板之间进行通信。
CAN协议介绍
我不打算在这里解释每一个小细节,而是只关注一些重要的事情。
CAN(Controlled Area Network)协议是不同设备之间的一种通信方式,但有一定的规则。当消息通过 CAN 总线传输时,必须遵循这些规则。在这里,我们将看到这些规则。
下面显示的是标准 CAN 帧



  • 这里,Identifier是发送设备的ID
  • RTR(远程传输请求)指定数据是远程帧还是数据帧
  • IDE 指定我们使用的是标准 ID 还是扩展 ID
  • r 是保留位
  • DLC 以 Bytes 为单位指定数据长度
  • 数据字段是我们可以发送数据的地方,最多应该是 8 个字节
  • Checksum 和 DEL 是 CRC 数据,它是分隔符
  • ACK 和 DEL 是确认位,它是分隔符

在本教程中,我们将只看到数据字段。 CRC 和 ACK 将由 HAL 库处理。
连接和配置
修改 CAN 数据帧
Filter配置




  • FilterActivation 指定我们是否要启用过滤器。显然我们必须启用它们
  • SlaveStartFilterBank 指定我们要为 CAN1 分配多少个滤波器组。 基本上带有双 CAN 外设的控制器有 28 个滤波器组,它们可以分布在这 2 个 CAN 之间。 在这里,我将 20 个滤波器组分配给 CAN1,其余分配给 CAN 2。该参数对于具有单个 CAN 外设的控制器无用。这些控制器有 14 个滤波器组(0 到 13)
  • FilterBank 指定我们要为过滤器进程使用哪个过滤器组。这里我为 CAN 1 分配了 20 个 Banks,我只能从这 20 个 Banks 中选择。所以我选择18号银行。如果是 Single CAN Peripheral,您可以选择 0 到 13 之间的任何值。
  • FilterFIFOAssignment 指定我们将用于接收消息的 FIFO。通常我们有 2 个 FIFO(FIFO 0 和 FIFO 1)。我选择 FIFO 0。
  • FilterMode 指定我们要使用哪种类型的过滤器。 我们在 STM32 中有两种类型的滤波器。 MASK MODE,其中掩码寄存器将用于将 ID 寄存器中的某些特定位与传入的 ID 进行比较。 和 LIST MODE,其中传入的 ID 直接与 ID 寄存器中设置的 ID 进行比较。我在这里使用 MASK 模式,因为它似乎更有用。
  • FilterScale 指定我们是否要使用一个 32 位过滤器寄存器,或 2 个 16 位过滤器寄存器。我在这里使用一个 32 位寄存器。
  • FilterIdHigh 是 ID 寄存器的高 16 位。该寄存器中设置的值将与传入标识符进行比较。这里我决定只比较传入消息的 STD ID,这就是我将值移动 5 的原因。 STD ID 从 ID HIGH 寄存器的第 5 位开始
  • FilterMaskIdHigh 是 MASK 寄存器的高 16 位。该寄存器中设置的值将使 ID 寄存器中的该特定位与传入 ID 的位进行比较。

最后 2 点可能难以理解,因此我建议您观看下面的视频。使用工作示例可以更好地解释它,这在视频中显示。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分