Skip to content

Commit e2ee809

Browse files
Sergey Pluzhnikovchris-durand
authored andcommitted
[stm32] FDCAN: Get all messages from FIFO in RX ISR
1 parent 313cc4c commit e2ee809

File tree

3 files changed

+26
-16
lines changed

3 files changed

+26
-16
lines changed

src/modm/platform/can/stm32-fdcan/can.cpp.in

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -237,24 +237,30 @@ MODM_ISR({{ reg }}_IT0)
237237
MODM_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

src/modm/platform/can/stm32-fdcan/can.hpp.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#ifndef MODM_STM32_FDCAN{{ id }}_HPP
1515
#define MODM_STM32_FDCAN{{ id }}_HPP
1616

17+
#include <optional>
18+
1719
#include <modm/architecture/interface/can.hpp>
1820
#include <modm/architecture/interface/can_filter.hpp>
1921
#include <modm/platform/gpio/connector.hpp>

test/modm/platform/fdcan/fdcan_test.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,9 @@ FdcanTest::testBuffers()
8686

8787
modm::can::Message message{0x4711, 0};
8888
for (uint_fast16_t i = 0; i <= numberOfMsgs; ++i) {
89-
message.setLength(i % 8);
90-
for (uint_fast8_t dataIndex = 0; dataIndex < i; ++dataIndex) {
89+
uint_fast8_t length = i % 8;
90+
message.setLength(length);
91+
for (uint_fast8_t dataIndex = 0; dataIndex < length; ++dataIndex) {
9192
message.data[dataIndex] = i;
9293
}
9394
Fdcan1::sendMessage(message);
@@ -101,9 +102,9 @@ FdcanTest::testBuffers()
101102
TEST_ASSERT_TRUE(Fdcan1::getMessage(receivedMessage));
102103

103104
TEST_ASSERT_EQUALS(receivedMessage.getIdentifier(), 0x4711u);
104-
TEST_ASSERT_EQUALS(receivedMessage.getLength(), (i % 8));
105-
106-
for (uint_fast8_t dataIndex = 0; dataIndex < i; ++dataIndex) {
105+
uint_fast8_t length = i % 8;
106+
TEST_ASSERT_EQUALS(receivedMessage.getLength(), length);
107+
for (uint_fast8_t dataIndex = 0; dataIndex < length; ++dataIndex) {
107108
TEST_ASSERT_EQUALS(receivedMessage.data[dataIndex], i);
108109
}
109110
}

0 commit comments

Comments
 (0)