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

Dependencies:   SimpleDMA

Dependents:   SDFileSystem-RTOS

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