MCPcopy Create free account
hub / github.com/Duet3D/RepRapFirmware / DoTransfer

Method DoTransfer

src/SBC/DataTransfer.cpp:769–964  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

767}
768
769TransferState DataTransfer::DoTransfer() noexcept
770{
771 if (dataReceived)
772 {
773#if SAME5x
774 if (SbcSpiSercom->SPI.STATUS.bit.BUFOVF)
775 {
776 ++spiRxOverruns;
777 }
778 disable_spi();
779#else
780 // Wait for the current XDMA transfer to finish. Relying on the XDMAC IRQ for this is does not work well...
781 if (!spi_dma_check_rx_complete())
782 {
783 return TransferState::finishingTransfer;
784 }
785#endif
786
787 // Transfer has finished
788 dataReceived = false;
789
790 switch (state)
791 {
792 case InternalTransferState::ExchangingHeader:
793 {
794 // (1) Exchanged transfer headers
795 Cache::InvalidateAfterDMAReceive(&rxHeader, sizeof(rxHeader));
796 const uint32_t headerResponse = *reinterpret_cast<const uint32_t*>(&rxHeader);
797 if (headerResponse == TransferResponse::BadResponse)
798 {
799 // SBC received a bad response code. We must have been happy if we got here, else RRF would have complained
800 if (reprap.Debug(Module::SbcInterface))
801 {
802 debugPrintf("Retrying data response exchange\n");
803 }
804 RestartTransfer(false);
805 break;
806 }
807
808 const uint32_t checksum = CalcCRC32(reinterpret_cast<const char *>(&rxHeader), sizeof(TransferHeader) - sizeof(uint32_t));
809 if (rxHeader.crcHeader != checksum)
810 {
811 if (reprap.Debug(Module::SbcInterface))
812 {
813 debugPrintf("Bad header CRC (expected %08" PRIx32 ", got %08" PRIx32 ")\n", rxHeader.crcHeader, checksum);
814 }
815 ExchangeResponse(TransferResponse::BadHeaderChecksum);
816 break;
817 }
818
819 if (rxHeader.formatCode != SbcFormatCode)
820 {
821 ExchangeResponse(TransferResponse::BadFormat);
822 break;
823 }
824 if (rxHeader.protocolVersion != SbcProtocolVersion)
825 {
826 ExchangeResponse(TransferResponse::BadProtocolVersion);

Callers 2

TaskLoopMethod · 0.80
ReceiveAndStartIapMethod · 0.80

Calls 5

disable_spiFunction · 0.85
debugPrintfFunction · 0.85
DebugMethod · 0.80
UsingSbcInterfaceMethod · 0.80

Tested by

no test coverage detected