SPRAD59 October 2023 TMS320F280039
Rx FIFO Elements are structurally identical to Rx Buffer Elements, and are also stored in the Message RAM. The module has two Rx FIFOs (Rx FIFO 0 and Rx FIFO 1) which can be individually configured to have up to 64 elements. The primary difference between Rx Buffer Elements and Rx FIFO Elements is in how the module accesses them.
The behaviour of the Rx FIFOs is determined by the Put and Get indices. These indices are maintained by the module in specific registers (MCAN_RXFxS). The Put index refers to the FIFO Element number where a newly received frame needs to be stored in the Message RAM. The Get index refers to the FIFO Element number from where the application needs to read the data from the Message RAM.
As a result of this structure, it is not necessary for the application to retrieve the data from a Rx Buffer Element each time a frame is received and clear the corresponding New Data Flag to receive the next matching frame in the same Rx Buffer Element. Instead, the application can read multiple received frames in one go.
The starting address for each FIFO section is stored in MCAN_RXFxC.FxSA register and the subsequent regions within this section are calculated based on the Put and Get indices by the module.
The Put index is incremented (automatically by the module) every time a new message is received into the FIFO, whereas, the Get index needs to be incremented by the application every time a message is read by the application. The Fill level of the FIFO, which translates to the number of messages in the FIFO to be read by the application, is determined by (Put Index - Get Index).
There are two modes for FIFOs which are differentiated on the basis of their behaviour when a new message is received when the FIFO is full. First is FIFO blocking mode, which means that when the Rx FIFO is full, no messages are stored in the Rx FIFO, unless at least one of the messages currently stored has been read by the application. In case a new message is received, there is an interrupt flag (MCAN_IR.RXFxL) that is set denoting a lost message. Second is the FIFO overwrite mode, which means that when the Rx FIFO is full, the next accepted message overwrites the oldest FIFO message.
The Rx FIFO mode is set during initialization as part of the Message RAM configuration.