【发布时间】: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 总线上可以观察到什么吗?我邀请您编辑您的帖子以包含此信息。