ST意法半导体
直播中

李刚

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

使用STM32F767ZI的HAL接收CAN消息时出现无法读取的情况如何处理?

编辑:HAL_CAN_Start() 并正确配置 CAN 过滤器修复它。
您好,我正在尝试读取设备发送的 CAN 消息,但无法读取。
硬件设置应该是正确的,我的设置在使用 mBed 操作系统的程序进行测试时有效,消息被正确接收。
一些注意事项:
  • 报文指定为CAN2.0B,标准帧格式,波特率250kbps,采样点70%,SJW 2 Tq。
  • CAN1用于配置PD0和PD1。
  • UART 和 GPIO 按预期工作。
  • 我使用http://www.bittiming.can-wiki.info/进行位计时,BTR 寄存器设置为 0x0149000b,我已在调试器中验证了这一点。
  • HAL_CAN_GetRxFifoFillLevel() 返回 0,HAL_CAN_GetRxMessage 不返回消息。
  • 时钟配置为 CubeMX 在初始化外围设备默认设置时设置的默认值,APB1 时钟设置为 48 MHz,用作 CAN 位时序的基础。
  • 我没有配置任何过滤器。
代码(去掉无关代码,msp在最后):
  • #include "main.h"
  • #include
  • CAN_HandleTypeDef hcan1;
  • UART_HandleTypeDef huart3;
  • CAN_TxHeaderTypeDef   TxHeader;
  • CAN_RxHeaderTypeDef   RxHeader;
  • uint8_t               TxData[8];
  • uint8_t               RxData[8];
  • uint32_t              TxMailbox;
  • char msg[50];
  • void SystemClock_Config(void);
  • static void MX_GPIO_Init(void);
  • static void MX_USART3_UART_Init(void);
  • static void MX_CAN1_Init(void);
  • int main(void)
  • {
  •   HAL_Init();
  •   SystemClock_Config();
  •   MX_GPIO_Init();
  •   MX_USART3_UART_Init();
  •   MX_CAN1_Init();
  •   uint8_t TestData[7];
  •   while (1)
  •   {
  •           sprintf(msg,"Waiting for messagern");
  •           HAL_UART_Transmit(&huart3,(uint8_t*)msg,sizeof(msg),HAL_MAX_DELAY);
  •           if (HAL_CAN_GetRxFifoFillLevel(&hcan1, CAN_RX_FIFO0) > 0)
  •           {
  •                   HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, TestData);
  •                   HAL_UART_Transmit(&huart3, "Can Message recievednr", 22, 10);
  •           }
  •           HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, TestData);
  •           sprintf(msg,"Message: %xrn", TestData[0]);
  •           HAL_UART_Transmit(&huart3,(uint8_t*)msg,sizeof(msg),HAL_MAX_DELAY);
  •           HAL_Delay(500);
  •   }
  • }
  • void SystemClock_Config(void)
  • {
  •   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  •   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  •   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  •   HAL_PWR_EnableBkUpAccess();
  •   __HAL_RCC_PWR_CLK_ENABLE();
  •   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
  •   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  •   RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
  •   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  •   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  •   RCC_OscInitStruct.PLL.PLLM = 4;
  •   RCC_OscInitStruct.PLL.PLLN = 96;
  •   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  •   RCC_OscInitStruct.PLL.PLLQ = 4;
  •   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  •                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  •   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  •   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  •   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  •   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  •   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART3|RCC_PERIPHCLK_CLK48;
  •   PeriphClkInitStruct.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
  •   PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48SOURCE_PLL;
  •   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  • }
  • static void MX_CAN1_Init(void)
  • {
  •   hcan1.Instance = CAN1;
  •   hcan1.Init.Prescaler = 12;
  •   hcan1.Init.Mode = CAN_MODE_NORMAL;
  •   hcan1.Init.SyncJumpWidth = CAN_SJW_2TQ;
  •   hcan1.Init.TimeSeg1 = CAN_BS1_10TQ;
  •   hcan1.Init.TimeSeg2 = CAN_BS2_5TQ;
  •   hcan1.Init.TimeTriggeredMode = DISABLE;
  •   hcan1.Init.AutoBusOff = DISABLE;
  •   hcan1.Init.AutoWakeUp = DISABLE;
  •   hcan1.Init.AutoRetransmission = DISABLE;
  •   hcan1.Init.ReceiveFifoLocked = DISABLE;
  •   hcan1.Init.TransmitFifoPriority = DISABLE;
  •   if (HAL_CAN_Init(&hcan1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  • }
  • static void MX_GPIO_Init(void)
  • {
  • lots of code
  • }
  • void Error_Handler(void)
  • {
  • }
  • /* hal_msp.c */
  • void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
  • {
  •   GPIO_InitTypeDef GPIO_InitStruct = {0};
  •   if(hcan->Instance==CAN1)
  •   {
  •     __HAL_RCC_CAN1_CLK_ENABLE();
  •     __HAL_RCC_GPIOD_CLK_ENABLE();
  •     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  •     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  •     GPIO_InitStruct.Pull = GPIO_NOPULL;
  •     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  •     GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
  •     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  •   }
  • }









回帖(1)

王银喜

2023-2-1 13:57:26
您是否在代码中的某处调用了 HAL_CAN_Start()?
uint8_t TestData[7] 也应该是 uint8_t TestData[8]。
如果您使用的是 CubeMX,您可以查看:
STM32Cube/Repository/STM32Cube_FW_F7_V.15.0/Projects/STM32F723E-Discovery/Examples/CAN/CAN_Loopback/Src/main.c
进行比较。
举报

更多回帖

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