Fork of RTOS_SPI that removes SimpleDMA from direct include to correct linker issues when using SimpleDMA twice Note that this library is still required!
Fork of RTOS_SPI by
RTOS_SPI.cpp@0:004e5e86de4e, 2013-12-26 (annotated)
- Committer:
- Sissors
- Date:
- Thu Dec 26 14:14:44 2013 +0000
- Revision:
- 0:004e5e86de4e
v1.0 for KL25
Who changed what in which revision?
User | Revision | Line number | New 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 | } |