CAN总线如何与STM32中的HAL一起工作?
Posted
技术标签:
【中文标题】CAN总线如何与STM32中的HAL一起工作?【英文标题】:How does the CAN bus work with HAL in STM32? 【发布时间】: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 总线上可以观察到什么吗?我邀请您编辑您的帖子以包含此信息。 【参考方案1】:确保在每次传输之前清除标志,以免发送不必要的信息。
【讨论】:
哪个标志?在哪里?你能详细说明吗?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。以上是关于CAN总线如何与STM32中的HAL一起工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 STM32 HAL_CAN 库生成格式正确的 TX CAN 帧?