STM FDCAN Rx 具有错误的 DataLength 值

STM FDCAN Rx has wrong DataLength value

提问人:Misha 提问时间:10/12/2023 最后编辑:Misha 更新时间:10/12/2023 访问量:49

问:

问题

我正在尝试在我的STM32H723 uController 上使用 FDCAN 接收 CAN 报文。但是当我调用该函数时,其中的值并不是人们所期望的;即 DataLength 不是表示消息大小的字节值,而是一些巨大的数字。HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &CAN1RxHeader, CAN1Rx_buffer);CAN1RxHeader.DataLength

有关此问题的解决方案,请参阅下面的答案。

C 嵌入式 STM32 CAN总线 HAL

评论

0赞 pmacfarlane 10/12/2023
那么问题是什么呢?
0赞 Misha 10/12/2023
毫无疑问,分享问题的解决方案。在我的帖子中澄清了这一点
0赞 pmacfarlane 10/12/2023
我认为提出一个问题然后自己回答(在答案中)是可以的。但这只会以一个没有答案的问题出现在人们面前,他们甚至可能不会阅读它。
2赞 Lundin 10/12/2023
发布此内容时,有一个按钮,您可以单击“回答您自己的问题 - 分享您的知识,问答式” - 然后您可以先输入问题,然后直接在它下方输入答案。
0赞 Misha 10/12/2023
你知道,当人们向社区添加解决方案时,就会得到负面评价,这太疯狂了。难道你不明白这只会阻止人们提供帮助和添加解决方案吗?很高兴认识伦丁。下次注意。我已经试过了,不相信我能再改变它了。

答:

0赞 Misha 10/12/2023 #1

要获取大小的实际值,您需要将 中的值位移位。请参阅以下示例: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 位 DataLength 值。

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

    //...
}

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