Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/CAN
diff options
context:
space:
mode:
authorDavid Crocker <dcrocker@eschertech.com>2020-12-27 13:23:37 +0300
committerDavid Crocker <dcrocker@eschertech.com>2020-12-27 13:23:37 +0300
commita91af1ab9b32cf28ae9dde7b8b997ff397023c25 (patch)
tree7959f9e02596e56a0f4bfff8b4d34a9acd0d52a8 /src/CAN
parent1db24819be24f5c1bbc2c80f1d516cc39a051bc6 (diff)
parentc99c5be037e504775b2531c99be5c78d33f0205d (diff)
Merge branch 'v3.02-dev' into 3.3-dev
Diffstat (limited to 'src/CAN')
-rw-r--r--src/CAN/CanInterface.cpp45
1 files changed, 25 insertions, 20 deletions
diff --git a/src/CAN/CanInterface.cpp b/src/CAN/CanInterface.cpp
index ef733248..08bb748e 100644
--- a/src/CAN/CanInterface.cpp
+++ b/src/CAN/CanInterface.cpp
@@ -187,7 +187,7 @@ static void configure_mcan() noexcept
{
mcan_config config_mcan;
mcan_get_config_defaults(&config_mcan);
- mcan_init(&mcan_instance, MCAN_MODULE, &config_mcan);
+ mcan_init(&mcan_instance, &config_mcan);
mcan_enable_fd_mode(&mcan_instance);
mcan_extended_message_filter_element et_filter;
@@ -216,7 +216,9 @@ static void configure_mcan() noexcept
et_filter.F1.bit.EFT = 2;
mcan_set_rx_extended_filter(&mcan_instance, &et_filter, 2);
- mcan_enable_interrupt(&mcan_instance, (mcan_interrupt_source)(MCAN_FORMAT_ERROR | MCAN_ACKNOWLEDGE_ERROR | MCAN_BUS_OFF | MCAN_RX_FIFO_0_NEW_MESSAGE | MCAN_RX_FIFO_1_NEW_MESSAGE | MCAN_RX_FIFO_0_FULL | MCAN_RX_FIFO_1_FULL));
+ mcan_enable_interrupt(&mcan_instance, (mcan_interrupt_source)(MCAN_FORMAT_ERROR | MCAN_ACKNOWLEDGE_ERROR | MCAN_BUS_OFF
+ | MCAN_RX_FIFO_0_NEW_MESSAGE | MCAN_RX_FIFO_1_NEW_MESSAGE
+ | MCAN_RX_FIFO_0_LOST_MESSAGE | MCAN_RX_FIFO_1_MESSAGE_LOST));
NVIC_ClearPendingIRQ(MCanIRQn);
NVIC_EnableIRQ(MCanIRQn);
@@ -255,15 +257,20 @@ extern "C" void MCAN_INT0_Handler() noexcept
#endif
}
- if (status & MCAN_RX_FIFO_0_NEW_MESSAGE)
+ if (status & (MCAN_RX_FIFO_0_LOST_MESSAGE | MCAN_RX_FIFO_1_MESSAGE_LOST))
{
- mcan_clear_interrupt_status(&mcan_instance, MCAN_RX_FIFO_0_NEW_MESSAGE);
+ ++messagesLost;
+ }
+
+ if (status & (MCAN_RX_FIFO_0_NEW_MESSAGE | MCAN_RX_FIFO_0_LOST_MESSAGE))
+ {
+ mcan_clear_interrupt_status(&mcan_instance, (mcan_interrupt_source)(MCAN_RX_FIFO_0_NEW_MESSAGE | MCAN_RX_FIFO_0_LOST_MESSAGE));
TaskBase::GiveFromISR(mcan_instance.taskWaitingOnFifo[0]);
}
- if (status & MCAN_RX_FIFO_1_NEW_MESSAGE)
+ if (status & (MCAN_RX_FIFO_1_NEW_MESSAGE | MCAN_RX_FIFO_1_MESSAGE_LOST))
{
- mcan_clear_interrupt_status(&mcan_instance, MCAN_RX_FIFO_1_NEW_MESSAGE);
+ mcan_clear_interrupt_status(&mcan_instance, (mcan_interrupt_source)(MCAN_RX_FIFO_1_NEW_MESSAGE | MCAN_RX_FIFO_1_MESSAGE_LOST));
TaskBase::GiveFromISR(mcan_instance.taskWaitingOnFifo[1]);
}
@@ -277,12 +284,6 @@ extern "C" void MCAN_INT0_Handler() noexcept
mcan_clear_interrupt_status(&mcan_instance, (mcan_interrupt_source)(MCAN_FORMAT_ERROR));
}
- if (status & (MCAN_RX_FIFO_0_FULL | MCAN_RX_FIFO_1_FULL))
- {
- mcan_clear_interrupt_status(&mcan_instance, (mcan_interrupt_source)(MCAN_RX_FIFO_0_FULL | MCAN_RX_FIFO_1_FULL));
- ++messagesLost;
- }
-
if (status & MCAN_BUS_OFF)
{
mcan_clear_interrupt_status(&mcan_instance, MCAN_BUS_OFF);
@@ -362,6 +363,7 @@ void CanInterface::Init() noexcept
# endif
can0dev->Enable();
#else
+ mcan_init_once(&mcan_instance, MCAN_MODULE);
configure_mcan();
#endif
@@ -799,21 +801,24 @@ void CanInterface::SendMessageNoReplyNoFree(CanMessageBuffer *buf) noexcept
extern "C" [[noreturn]] void CanReceiverLoop(void *) noexcept
{
CanMessageBuffer buf(nullptr);
-
for (;;)
{
#if USE_NEW_CAN_DRIVER
- can0dev->ReceiveMessage(RxBufferIndexRequest, TaskBase::TimeoutUnlimited, &buf);
+ if (can0dev->ReceiveMessage(RxBufferIndexRequest, TaskBase::TimeoutUnlimited, &buf))
#else
- GetMessageFromFifo(&mcan_instance, &buf, RxFifoIndexRequest, TaskBase::TimeoutUnlimited);
- ++messagesReceived;
+ if (GetMessageFromFifo(&mcan_instance, &buf, RxFifoIndexRequest, TaskBase::TimeoutUnlimited))
#endif
- if (reprap.Debug(moduleCan))
{
- buf.DebugPrint("Rx0:");
- }
+#if !USE_NEW_CAN_DRIVER
+ ++messagesReceived;
+#endif
+ if (reprap.Debug(moduleCan))
+ {
+ buf.DebugPrint("Rx0:");
+ }
- CommandProcessor::ProcessReceivedMessage(&buf);
+ CommandProcessor::ProcessReceivedMessage(&buf);
+ }
}
}