void read( uint32_t addr, void* data, size_t size ) { uint8_t* dst = (uint8_t*)data; LPSPI_Enable(LPSPI4, false); LPSPI_FlushFifo(LPSPI4, true, true); LPSPI_ClearStatusFlags(LPSPI4, (uint32_t)kLPSPI_AllStatusFlag); LPSPI4->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); LPSPI_Enable(LPSPI4, true); LPSPI4->TCR = (LPSPI4->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_RXMSK_MASK | LPSPI_TCR_TXMSK_MASK | LPSPI_TCR_PCS_MASK)) | LPSPI_TCR_PCS(0); while ( LPSPI_GetTxFifoCount(LPSPI4) ) ; LPSPI4->TCR |= LPSPI_TCR_CONT(1) | LPSPI_TCR_CONTC(1); while ( LPSPI_GetTxFifoCount(LPSPI4) ) ; uint32_t fifo_size = LPSPI_GetTxFifoSize(LPSPI4); uint8_t txData[4] = { 0x03, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)(addr >> 0) }; int txi = -4; int rxi = -4; while ( txi < (int)size && rxi < (int)size ) { if ( txi < (int)size ) { uint8_t tx = 0; if ( txi < 0 ) tx = txData[4+txi]; while ( LPSPI_GetTxFifoCount(LPSPI4) == fifo_size ) ; LPSPI4->TDR = tx; txi += 1; } if ( rxi < (int)size ) { if ( LPSPI_GetRxFifoCount(LPSPI4) != 0 ) { uint8_t rx = LPSPI4->RDR; if ( rxi >= 0 ) dst[rxi] = rx; rxi += 1; } } } while ( LPSPI_GetTxFifoCount(LPSPI4) == fifo_size ) ; LPSPI4->TCR = (LPSPI4->TCR & ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK)); while ( LPSPI_GetTxFifoCount(LPSPI4) ) ; while ( LPSPI_GetRxFifoCount(LPSPI4) != 0 ) (void)LPSPI4->RDR; }