From 799f10ea6b495c8b8ad50a5ac2ba7fdd8e42ecd0 Mon Sep 17 00:00:00 2001 From: mark9064 <30447455+mark9064@users.noreply.github.com> Date: Mon, 15 Dec 2025 23:38:48 +0000 Subject: [PATCH] Split oversized SPI reads --- src/drivers/SpiMaster.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/drivers/SpiMaster.cpp b/src/drivers/SpiMaster.cpp index 19422ef3c3..5002ea37d0 100644 --- a/src/drivers/SpiMaster.cpp +++ b/src/drivers/SpiMaster.cpp @@ -161,6 +161,7 @@ void SpiMaster::OnStartedEvent() { } void SpiMaster::PrepareTx(const uint32_t bufferAddress, const size_t size) { + ASSERT(size < 256); spiBaseAddress->TXD.PTR = bufferAddress; spiBaseAddress->TXD.MAXCNT = size; spiBaseAddress->TXD.LIST = 0; @@ -171,6 +172,7 @@ void SpiMaster::PrepareTx(const uint32_t bufferAddress, const size_t size) { } void SpiMaster::PrepareRx(const uint32_t bufferAddress, const size_t size) { + ASSERT(size < 256); spiBaseAddress->TXD.PTR = 0; spiBaseAddress->TXD.MAXCNT = 0; spiBaseAddress->TXD.LIST = 0; @@ -240,12 +242,17 @@ bool SpiMaster::Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t* data spiBaseAddress->TASKS_START = 1; while (spiBaseAddress->EVENTS_END == 0) ; + while (dataSize > 0) { + size_t readSize = std::min(dataSize, 255U); + PrepareRx((uint32_t) data, readSize); + spiBaseAddress->TASKS_START = 1; - PrepareRx((uint32_t) data, dataSize); - spiBaseAddress->TASKS_START = 1; - - while (spiBaseAddress->EVENTS_END == 0) - ; + while (spiBaseAddress->EVENTS_END == 0) { + ; + } + data += readSize; + dataSize -= readSize; + } nrf_gpio_pin_set(this->pinCsn); xSemaphoreGive(mutex);