STM FDCAN Rx 的数据长度值错误

问题描述 投票:0回答:1

问题

我正在尝试在 STM32H723 uController 上使用 FDCAN 接收 CAN 消息。但是当我调用函数

HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &CAN1RxHeader, CAN1Rx_buffer);
时,
CAN1RxHeader.DataLength
中的值并不是人们所期望的;即 DataLength 不是表示消息大小的字节值,它是一个巨大的数字。

请参阅下面的答案来解决此问题。

c embedded stm32 can-bus hal
1个回答
0
投票

要获得尺寸的实际值,您需要对

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);

    //...
}

如果您碰巧遇到同样的问题,我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.