Uses DMA to read/write SPI blocks, while putting the current thread in Wait state.

Dependencies:   SimpleDMA

Dependents:   SDFileSystem-RTOS

Committer:
Sissors
Date:
Thu Dec 26 14:14:44 2013 +0000
Revision:
0:004e5e86de4e
v1.0 for KL25

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:004e5e86de4e 1 #include "RTOS_SPI.h"
Sissors 0:004e5e86de4e 2
Sissors 0:004e5e86de4e 3 RTOS_SPI::RTOS_SPI(PinName mosi, PinName miso, PinName sclk, PinName _unused) : SPI(mosi, miso, sclk) {
Sissors 0:004e5e86de4e 4 if (_spi.spi == SPI0) {
Sissors 0:004e5e86de4e 5 read_dma.trigger(Trigger_SPI0_RX);
Sissors 0:004e5e86de4e 6 write_dma.trigger(Trigger_SPI0_TX);
Sissors 0:004e5e86de4e 7 } else {
Sissors 0:004e5e86de4e 8 read_dma.trigger(Trigger_SPI1_RX);
Sissors 0:004e5e86de4e 9 write_dma.trigger(Trigger_SPI1_TX);
Sissors 0:004e5e86de4e 10 }
Sissors 0:004e5e86de4e 11
Sissors 0:004e5e86de4e 12 read_dma.source(&_spi.spi->D, false);
Sissors 0:004e5e86de4e 13 write_dma.destination(&_spi.spi->D, false);
Sissors 0:004e5e86de4e 14 };
Sissors 0:004e5e86de4e 15
Sissors 0:004e5e86de4e 16 void RTOS_SPI::bulkInternal(uint8_t *read_data, uint8_t *write_data, int length, bool read_inc, bool write_inc) {
Sissors 0:004e5e86de4e 17 aquire();
Sissors 0:004e5e86de4e 18 _spi.spi->C2 |= SPI_C2_TXDMAE_MASK | SPI_C2_RXDMAE_MASK;
Sissors 0:004e5e86de4e 19
Sissors 0:004e5e86de4e 20 read_dma.destination(read_data, read_inc);
Sissors 0:004e5e86de4e 21 if (write_inc)
Sissors 0:004e5e86de4e 22 write_dma.source(write_data+1, write_inc);
Sissors 0:004e5e86de4e 23 else
Sissors 0:004e5e86de4e 24 write_dma.source(write_data, write_inc);
Sissors 0:004e5e86de4e 25
Sissors 0:004e5e86de4e 26 //simply start the read_dma
Sissors 0:004e5e86de4e 27 read_dma.start(length);
Sissors 0:004e5e86de4e 28
Sissors 0:004e5e86de4e 29 //Write the first byte manually, since this is recommended method (and the normal method sends the first byte twice)
Sissors 0:004e5e86de4e 30 while((_spi.spi->S & SPI_S_SPTEF_MASK) == 0);
Sissors 0:004e5e86de4e 31 _spi.spi->D = write_data[0];
Sissors 0:004e5e86de4e 32
Sissors 0:004e5e86de4e 33 write_dma.wait(length-1);
Sissors 0:004e5e86de4e 34 while(read_dma.isBusy());
Sissors 0:004e5e86de4e 35
Sissors 0:004e5e86de4e 36 _spi.spi->C2 &= ~(SPI_C2_TXDMAE_MASK | SPI_C2_RXDMAE_MASK);
Sissors 0:004e5e86de4e 37 }