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

Dependencies:   SimpleDMA

Dependents:   SDFileSystem-RTOS

Committer:
Tomo2k
Date:
Sat Jun 28 06:55:08 2014 +0000
Revision:
4:0ab62cbad3aa
Parent:
2:d052724e2ad6
Switch to using Erik's version of the SimpleDMA library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 1:d021fb155bff 1 #ifdef TARGET_LPC1768
Sissors 1:d021fb155bff 2 #include "RTOS_SPI.h"
Sissors 1:d021fb155bff 3
Sissors 1:d021fb155bff 4 RTOS_SPI::RTOS_SPI(PinName mosi, PinName miso, PinName sclk, PinName _unused) : SPI(mosi, miso, sclk) {
Sissors 1:d021fb155bff 5 if (_spi.spi == LPC_SSP0) {
Sissors 1:d021fb155bff 6 read_dma.trigger(Trigger_SSP0_RX);
Sissors 1:d021fb155bff 7 write_dma.trigger(Trigger_SSP0_TX);
Sissors 1:d021fb155bff 8 } else {
Sissors 1:d021fb155bff 9 read_dma.trigger(Trigger_SSP1_RX);
Sissors 1:d021fb155bff 10 write_dma.trigger(Trigger_SSP1_TX);
Sissors 1:d021fb155bff 11 }
Sissors 1:d021fb155bff 12
Sissors 1:d021fb155bff 13 read_dma.source(&_spi.spi->DR, false, 8);
Sissors 1:d021fb155bff 14 write_dma.destination(&_spi.spi->DR, false, 8);
Sissors 1:d021fb155bff 15 };
Sissors 1:d021fb155bff 16
Tomo2k 2:d052724e2ad6 17 void RTOS_SPI::bulkInternal(uint8_t *read_data, const uint8_t *write_data, int length, bool read_inc, bool write_inc) {
Sissors 1:d021fb155bff 18 aquire();
Sissors 1:d021fb155bff 19 _spi.spi->DMACR = 3;
Sissors 1:d021fb155bff 20
Sissors 1:d021fb155bff 21 read_dma.destination(read_data, read_inc);
Sissors 1:d021fb155bff 22 write_dma.source(write_data, write_inc);
Sissors 1:d021fb155bff 23 read_dma.start(length);
Sissors 1:d021fb155bff 24 write_dma.wait(length);
Sissors 1:d021fb155bff 25 while(read_dma.isBusy());
Sissors 1:d021fb155bff 26
Sissors 1:d021fb155bff 27 _spi.spi->DMACR = 0;
Sissors 1:d021fb155bff 28 }
Sissors 1:d021fb155bff 29 #endif