| 767 | } |
| 768 | |
| 769 | TransferState 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); |
no test coverage detected