编辑: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);
- }
- }