Created
June 15, 2025 16:44
-
-
Save hello-world-dot-c/86c21fbb187cc818e6b804d9e436aa0c to your computer and use it in GitHub Desktop.
[STM32 read CAN FD buffer] #STM32 #embedded #CAN
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| uint32_t GetIndex = 0; | |
| /* Calculate Rx FIFO 0 element index */ | |
| GetIndex += ((hfdcan->Instance->RXF0S & FDCAN_RXF0S_F0GI) >> FDCAN_RXF0S_F0GI_Pos); | |
| /* Calculate Rx FIFO 0 element address */ | |
| RxAddress = (uint32_t *)(hfdcan->msgRam.RxFIFO0SA + (GetIndex * SRAMCAN_RF0_SIZE)); | |
| /* Retrieve IdType */ | |
| pRxHeader->IdType = *RxAddress & FDCAN_ELEMENT_MASK_XTD; | |
| /* Retrieve Identifier */ | |
| if (pRxHeader->IdType == FDCAN_STANDARD_ID) /* Standard ID element */ | |
| { | |
| pRxHeader->Identifier = ((*RxAddress & FDCAN_ELEMENT_MASK_STDID) >> 18U); | |
| } | |
| else /* Extended ID element */ | |
| { | |
| pRxHeader->Identifier = (*RxAddress & FDCAN_ELEMENT_MASK_EXTID); | |
| } | |
| /* Retrieve RxFrameType */ | |
| pRxHeader->RxFrameType = (*RxAddress & FDCAN_ELEMENT_MASK_RTR); | |
| /* Retrieve ErrorStateIndicator */ | |
| pRxHeader->ErrorStateIndicator = (*RxAddress & FDCAN_ELEMENT_MASK_ESI); | |
| /* Increment RxAddress pointer to second word of Rx FIFO element */ | |
| RxAddress++; | |
| /* Retrieve RxTimestamp */ | |
| pRxHeader->RxTimestamp = (*RxAddress & FDCAN_ELEMENT_MASK_TS); | |
| /* Retrieve DataLength */ | |
| pRxHeader->DataLength = ((*RxAddress & FDCAN_ELEMENT_MASK_DLC) >> 16U); | |
| /* Retrieve BitRateSwitch */ | |
| pRxHeader->BitRateSwitch = (*RxAddress & FDCAN_ELEMENT_MASK_BRS); | |
| /* Retrieve FDFormat */ | |
| pRxHeader->FDFormat = (*RxAddress & FDCAN_ELEMENT_MASK_FDF); | |
| /* Retrieve FilterIndex */ | |
| pRxHeader->FilterIndex = ((*RxAddress & FDCAN_ELEMENT_MASK_FIDX) >> 24U); | |
| /* Retrieve NonMatchingFrame */ | |
| pRxHeader->IsFilterMatchingFrame = ((*RxAddress & FDCAN_ELEMENT_MASK_ANMF) >> 31U); | |
| /* Increment RxAddress pointer to payload of Rx FIFO element */ | |
| RxAddress++; | |
| /* Retrieve Rx payload */ | |
| pData = (uint8_t *)RxAddress; | |
| for (ByteCounter = 0; ByteCounter < DLCtoBytes[pRxHeader->DataLength]; ByteCounter++) | |
| { | |
| pRxData[ByteCounter] = pData[ByteCounter]; | |
| } | |
| if (RxLocation == FDCAN_RX_FIFO0) /* Rx element is assigned to the Rx FIFO 0 */ | |
| { | |
| /* Acknowledge the Rx FIFO 0 that the oldest element is read so that it increments the GetIndex */ | |
| hfdcan->Instance->RXF0A = GetIndex; | |
| } | |
| else /* Rx element is assigned to the Rx FIFO 1 */ | |
| { | |
| /* Acknowledge the Rx FIFO 1 that the oldest element is read so that it increments the GetIndex */ | |
| hfdcan->Instance->RXF1A = GetIndex; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment