我正在尝试在 STM32H723 uController 上使用 FDCAN 接收 CAN 消息。但是当我调用函数
HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &CAN1RxHeader, CAN1Rx_buffer);
时,CAN1RxHeader.DataLength
中的值并不是人们所期望的;即 DataLength 不是表示消息大小的字节值,它是一个巨大的数字。
请参阅下面的答案来解决此问题。
要获得尺寸的实际值,您需要对
CAN1RxHeader.DataLength
中的值进行位移。请参阅下面的示例:
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hfdcan);
UNUSED(RxFifo0ITs);
uint8_t CAN1Rx_buffer[8];
HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &CAN1RxHeader, CAN1Rx_buffer);
uint32_t len = CAN1RxHeader.DataLength >> 16;
}
要查找原因,您需要查看 stm32h7xx_hal_fdcan.h 或等效芯片。看一下 GetRxMessage 函数。在这里您将看到掩码值和相关的内存位置。然而,我们需要查看字节 16-19 以获得 32 位数据长度值。
HAL_StatusTypeDef HAL_FDCAN_GetRxMessage(FDCAN_HandleTypeDef *hfdcan, uint32_t RxLocation, FDCAN_RxHeaderTypeDef *pRxHeader, uint8_t *pRxData)
{
//...
/* Retrieve DataLength */
pRxHeader->DataLength = (*RxAddress & FDCAN_ELEMENT_MASK_DLC);
//...
}
如果您碰巧遇到同样的问题,我希望这会有所帮助。