提问人:Misha 提问时间:10/12/2023 最后编辑:Misha 更新时间:10/12/2023 访问量:49
STM FDCAN Rx 具有错误的 DataLength 值
STM FDCAN Rx has wrong DataLength value
问:
问题
我正在尝试在我的STM32H723 uController 上使用 FDCAN 接收 CAN 报文。但是当我调用该函数时,其中的值并不是人们所期望的;即 DataLength 不是表示消息大小的字节值,而是一些巨大的数字。HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &CAN1RxHeader, CAN1Rx_buffer);
CAN1RxHeader.DataLength
有关此问题的解决方案,请参阅下面的答案。
答:
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);
//...
}
如果您碰巧遇到同样的问题,我希望这会有所帮助。
评论