Uses DMA to read/write SPI blocks, while putting the current thread in Wait state.
Diff: RTOS_SPI_LPC1768.cpp
- Revision:
- 1:d021fb155bff
- Child:
- 2:d052724e2ad6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RTOS_SPI_LPC1768.cpp Sun Jan 05 10:20:17 2014 +0000 @@ -0,0 +1,29 @@ +#ifdef TARGET_LPC1768 +#include "RTOS_SPI.h" + +RTOS_SPI::RTOS_SPI(PinName mosi, PinName miso, PinName sclk, PinName _unused) : SPI(mosi, miso, sclk) { + if (_spi.spi == LPC_SSP0) { + read_dma.trigger(Trigger_SSP0_RX); + write_dma.trigger(Trigger_SSP0_TX); + } else { + read_dma.trigger(Trigger_SSP1_RX); + write_dma.trigger(Trigger_SSP1_TX); + } + + read_dma.source(&_spi.spi->DR, false, 8); + write_dma.destination(&_spi.spi->DR, false, 8); +}; + +void RTOS_SPI::bulkInternal(uint8_t *read_data, uint8_t *write_data, int length, bool read_inc, bool write_inc) { + aquire(); + _spi.spi->DMACR = 3; + + read_dma.destination(read_data, read_inc); + write_dma.source(write_data, write_inc); + read_dma.start(length); + write_dma.wait(length); + while(read_dma.isBusy()); + + _spi.spi->DMACR = 0; +} +#endif \ No newline at end of file