diff options
author | David Crocker <dcrocker@eschertech.com> | 2020-12-27 13:23:37 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2020-12-27 13:23:37 +0300 |
commit | a91af1ab9b32cf28ae9dde7b8b997ff397023c25 (patch) | |
tree | 7959f9e02596e56a0f4bfff8b4d34a9acd0d52a8 /src/CAN | |
parent | 1db24819be24f5c1bbc2c80f1d516cc39a051bc6 (diff) | |
parent | c99c5be037e504775b2531c99be5c78d33f0205d (diff) |
Merge branch 'v3.02-dev' into 3.3-dev
Diffstat (limited to 'src/CAN')
-rw-r--r-- | src/CAN/CanInterface.cpp | 45 |
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); + } } } |