【问题标题】:How does the CAN bus work with HAL in STM32?CAN总线如何与STM32中的HAL一起工作?
【发布时间】:2019-11-14 14:21:35
【问题描述】:

我正在尝试使用STM32F3的CAN子系统,但是遇到了一些麻烦。我阅读了一些教程并按照说明进行操作,但我认为我犯了一些错误。下面的代码作为FreeRTOS 任务运行,应该作为对 CAN RX 的轮询工作。

#include "FreeRTOS.h"
#include "cmsis_os.h"
#include "stdio.h"
#include "stm32f3xx_hal_can.h"
#include "can.h"
#include "usart.h"

void canRx(void const *argument)
{
    /* USER CODE BEGIN canRx */
    /* Infinite loop */

    uint8_t receivedMessage[8];
    CAN_RxHeaderTypeDef RxHeader;

    HAL_CAN_Start(&hcan);

    for (;;)
    {
        if(HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0) != 0)
        {
            HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, receivedMessage);
        }
        HAL_UART_Transmit(&huart2, receivedMessage, 8, portMAX_DELAY);

        osDelay(200);
    }
    /* USER CODE END canRx */
}

我只想读取从作为另一个 CAN 节点工作的 Arduino 发送的 RX 数据。 Arduino 循环有一个计数器,每 200 毫秒递增 1,并通过 CAN 发送到 STM。

我想从 UART2 中的 CAN 接收器(STM32)接收 ID 和消息。我会将这些数据与发件人的数据进行比较。我从 Arduino Serial 中获取这些数据,并检查命中率(我希望 100%)。

我怎样才能让它运作良好?

【问题讨论】:

  • 你用 HAL_CAN_Init 初始化了 CAN 结构(hcan)吗?
  • 是的,CAN Init 是由 CubeMX 生成的。
  • 您是否使用 120 欧姆终端电阻正确连接了 CAN 总线?如果你这样做了,你能用振荡器或其他任何东西来监控 CAN 总线,看看 arduino 是否真的在传输东西吗?
  • 是的,CAN 节点运行良好。我在 H 和 L 处使用带有电阻器的 2 个 MCP 2551。这个组件在其他 CAN 应用程序中工作,我正在尝试发现 CAN 与 STM32 的工作方式。
  • 您能否提供更多有关您的程序输出的详细信息?例如,你能说出你在 UART 总线上可以观察到什么吗?我邀请您编辑您的帖子以包含此信息。

标签: stm32 can-bus hal


【解决方案1】:

确保在每次传输之前清除标志,以免发送不必要的信息。

【讨论】:

  • 哪个标志?在哪里?你能详细说明吗?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
猜你喜欢
  • 2016-09-01
  • 2016-12-07
  • 2021-08-27
  • 2019-08-23
  • 2019-11-12
  • 2017-04-07
  • 2018-08-07
  • 1970-01-01
  • 2015-09-24
相关资源
最近更新 更多