@@ -237,24 +237,30 @@ MODM_ISR({{ reg }}_IT0)
237237MODM_ISR({{ reg }}_IT1)
238238{
239239%% if options["buffer.rx"] > 0
240+ int_fast16_t msgRetrieveLimit = rxQueue.getMaxSize() - rxQueue.getSize();
241+
240242 RxMessage rxMessage;
241243
242- if (rxFifo0HasMessage()) {
244+ while (rxFifo0HasMessage() && (msgRetrieveLimit > 0 )) {
243245 readMsg(rxMessage.message, 0, &rxMessage.filter_id, &rxMessage.timestamp);
244- // acknowledge interrupt flag
245- {{ reg }}->IR = FDCAN_IR_RF0N;
246-
247- modm_assert_continue_ignore(rxQueue.push(rxMessage), "fdcan.rx.buffer",
248- "CAN receive software buffer overflowed!", {{ id }});
246+ rxQueue.push(rxMessage);
247+ msgRetrieveLimit--;
249248 }
250249
251- if (rxFifo1HasMessage()) {
250+ while (rxFifo1HasMessage() && (msgRetrieveLimit > 0 )) {
252251 readMsg(rxMessage.message, 1, &rxMessage.filter_id, &rxMessage.timestamp);
253- // acknowledge interrupt flag
254- {{ reg }}->IR = FDCAN_IR_RF1N;
252+ rxQueue.push(rxMessage);
253+ msgRetrieveLimit--;
254+ }
255255
256- modm_assert_continue_ignore(rxQueue.push(rxMessage), "fdcan.rx.buffer",
257- "CAN receive software buffer overflowed!", {{ id }});
256+ if (rxQueue.isFull()){
257+ modm_assert_continue_ignore(false, "fdcan.rx.buffer",
258+ "CAN receive software buffer full, not reading new message(s)!");
259+ // disable rx ISR until we read data from the rxQueue (IST for tx remains active)
260+ // The interrupt remains unacknowledged, so it fires again after the read.
261+ {{ reg }}->ILE = FDCAN_ILE_EINT0;
262+ } else {
263+ {{ reg }}->IR = FDCAN_IR_RF0N | FDCAN_IR_RF1N; // acknowledge interrupt flags
258264 }
259265%% endif
260266}
@@ -369,6 +375,7 @@ modm::platform::Fdcan{{ id }}::getMessage(can::Message& message, uint8_t *filter
369375 (*timestamp) = rxMessage.timestamp;
370376 }
371377 rxQueue.pop();
378+ {{ reg }}->ILE = FDCAN_ILE_EINT1 | FDCAN_ILE_EINT0; // reenable ISR, in case it was disabled due to rxQueue full
372379 return true;
373380 }
374381%% else
0 commit comments