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
Revision 1:d021fb155bff, committed 2014-01-05
- Comitter:
- Sissors
- Date:
- Sun Jan 05 10:20:17 2014 +0000
- Parent:
- 0:004e5e86de4e
- Child:
- 2:d052724e2ad6
- Commit message:
- LPC1768 support added (8-bit only currently)
Changed in this revision
--- a/RTOS_SPI.cpp Thu Dec 26 14:14:44 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -#include "RTOS_SPI.h" - -RTOS_SPI::RTOS_SPI(PinName mosi, PinName miso, PinName sclk, PinName _unused) : SPI(mosi, miso, sclk) { - if (_spi.spi == SPI0) { - read_dma.trigger(Trigger_SPI0_RX); - write_dma.trigger(Trigger_SPI0_TX); - } else { - read_dma.trigger(Trigger_SPI1_RX); - write_dma.trigger(Trigger_SPI1_TX); - } - - read_dma.source(&_spi.spi->D, false); - write_dma.destination(&_spi.spi->D, false); -}; - -void RTOS_SPI::bulkInternal(uint8_t *read_data, uint8_t *write_data, int length, bool read_inc, bool write_inc) { - aquire(); - _spi.spi->C2 |= SPI_C2_TXDMAE_MASK | SPI_C2_RXDMAE_MASK; - - read_dma.destination(read_data, read_inc); - if (write_inc) - write_dma.source(write_data+1, write_inc); - else - write_dma.source(write_data, write_inc); - - //simply start the read_dma - read_dma.start(length); - - //Write the first byte manually, since this is recommended method (and the normal method sends the first byte twice) - while((_spi.spi->S & SPI_S_SPTEF_MASK) == 0); - _spi.spi->D = write_data[0]; - - write_dma.wait(length-1); - while(read_dma.isBusy()); - - _spi.spi->C2 &= ~(SPI_C2_TXDMAE_MASK | SPI_C2_RXDMAE_MASK); -} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RTOS_SPI_KL25.cpp Sun Jan 05 10:20:17 2014 +0000 @@ -0,0 +1,39 @@ +#ifdef TARGET_KL25Z +#include "RTOS_SPI.h" + +RTOS_SPI::RTOS_SPI(PinName mosi, PinName miso, PinName sclk, PinName _unused) : SPI(mosi, miso, sclk) { + if (_spi.spi == SPI0) { + read_dma.trigger(Trigger_SPI0_RX); + write_dma.trigger(Trigger_SPI0_TX); + } else { + read_dma.trigger(Trigger_SPI1_RX); + write_dma.trigger(Trigger_SPI1_TX); + } + + read_dma.source(&_spi.spi->D, false); + write_dma.destination(&_spi.spi->D, false); +}; + +void RTOS_SPI::bulkInternal(uint8_t *read_data, uint8_t *write_data, int length, bool read_inc, bool write_inc) { + aquire(); + _spi.spi->C2 |= SPI_C2_TXDMAE_MASK | SPI_C2_RXDMAE_MASK; + + read_dma.destination(read_data, read_inc); + if (write_inc) + write_dma.source(write_data+1, write_inc); + else + write_dma.source(write_data, write_inc); + + //simply start the read_dma + read_dma.start(length); + + //Write the first byte manually, since this is recommended method (and the normal method sends the first byte twice) + while((_spi.spi->S & SPI_S_SPTEF_MASK) == 0); + _spi.spi->D = write_data[0]; + + write_dma.wait(length-1); + while(read_dma.isBusy()); + + _spi.spi->C2 &= ~(SPI_C2_TXDMAE_MASK | SPI_C2_RXDMAE_MASK); +} +#endif \ No newline at end of file
--- /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
--- a/SimpleDMA.lib Thu Dec 26 14:14:44 2013 +0000 +++ b/SimpleDMA.lib Sun Jan 05 10:20:17 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/Sissors/code/SimpleDMA/#34f5bf8adfa0 +http://mbed.org/users/Sissors/code/SimpleDMA/#d9f46ef80e20