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
Child:
2:d052724e2ad6
v1.0 for KL25

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:004e5e86de4e 1 #ifndef RTOS_SPI_H
Sissors 0:004e5e86de4e 2 #define RTOS_SPI_H
Sissors 0:004e5e86de4e 3
Sissors 0:004e5e86de4e 4 #include "mbed.h"
Sissors 0:004e5e86de4e 5 #include "rtos.h"
Sissors 0:004e5e86de4e 6 #include "SimpleDMA.h"
Sissors 0:004e5e86de4e 7
Sissors 0:004e5e86de4e 8 /**
Sissors 0:004e5e86de4e 9 * RTOS_SPI uses SimpleDMA to control SPI using DMA.
Sissors 0:004e5e86de4e 10 *
Sissors 0:004e5e86de4e 11 * As the name says it is intended to be used with RTOS.
Sissors 0:004e5e86de4e 12 * The current Thread is paused until it is done, meanwhile
Sissors 0:004e5e86de4e 13 * other Threads will continue to run. Once finished the
Sissors 0:004e5e86de4e 14 * Thread will continue.
Sissors 0:004e5e86de4e 15 *
Sissors 0:004e5e86de4e 16 * This is a child class of SPI, so all regular SPI functions
Sissors 0:004e5e86de4e 17 * are available + two for DMA control.
Sissors 0:004e5e86de4e 18 */
Sissors 0:004e5e86de4e 19 class RTOS_SPI: public SPI {
Sissors 0:004e5e86de4e 20 public:
Sissors 0:004e5e86de4e 21 /** Create a SPI master connected to the specified pins
Sissors 0:004e5e86de4e 22 *
Sissors 0:004e5e86de4e 23 * mosi or miso can be specfied as NC if not used
Sissors 0:004e5e86de4e 24 *
Sissors 0:004e5e86de4e 25 * @param mosi - SPI Master Out, Slave In pin
Sissors 0:004e5e86de4e 26 * @param miso - SPI Master In, Slave Out pin
Sissors 0:004e5e86de4e 27 * @param sclk - SPI Clock pin
Sissors 0:004e5e86de4e 28 */
Sissors 0:004e5e86de4e 29 RTOS_SPI(PinName mosi, PinName miso, PinName sclk, PinName _unused=NC);
Sissors 0:004e5e86de4e 30
Sissors 0:004e5e86de4e 31 /**
Sissors 0:004e5e86de4e 32 * Write a block of data via SPI
Sissors 0:004e5e86de4e 33 *
Sissors 0:004e5e86de4e 34 * This throws away all read data
Sissors 0:004e5e86de4e 35 *
Sissors 0:004e5e86de4e 36 * @param *write_data - uint8_t pointer to data to write
Sissors 0:004e5e86de4e 37 * @param length - number of bytes to write
Sissors 0:004e5e86de4e 38 * @param array - true if write_data is an array, false if it is a single constant value
Sissors 0:004e5e86de4e 39 */
Sissors 0:004e5e86de4e 40 void bulkWrite(uint8_t *write_data, int length, bool array = true) {
Sissors 0:004e5e86de4e 41 uint8_t dummy;
Sissors 0:004e5e86de4e 42 bulkInternal(&dummy, write_data, length, false, array);
Sissors 0:004e5e86de4e 43 }
Sissors 0:004e5e86de4e 44
Sissors 0:004e5e86de4e 45 /**
Sissors 0:004e5e86de4e 46 * Write a block of data via SPI, read returning value
Sissors 0:004e5e86de4e 47 *
Sissors 0:004e5e86de4e 48 * @param *read_data - uint8_t pointer to array where received data should be stored
Sissors 0:004e5e86de4e 49 * @param *write_data - uint8_t pointer to data to write
Sissors 0:004e5e86de4e 50 * @param length - number of bytes to write
Sissors 0:004e5e86de4e 51 * @param array - true if write_data is an array, false if it is a single constant value
Sissors 0:004e5e86de4e 52 */
Sissors 0:004e5e86de4e 53 void bulkReadWrite(uint8_t *read_data, uint8_t *write_data, int length, bool array = true) {
Sissors 0:004e5e86de4e 54 bulkInternal(read_data, write_data, length, true, array);
Sissors 0:004e5e86de4e 55 }
Sissors 0:004e5e86de4e 56
Sissors 0:004e5e86de4e 57 private:
Sissors 0:004e5e86de4e 58 void bulkInternal(uint8_t *read_data, uint8_t *write_data, int length, bool read_inc, bool write_inc);
Sissors 0:004e5e86de4e 59
Sissors 0:004e5e86de4e 60 SimpleDMA read_dma;
Sissors 0:004e5e86de4e 61 SimpleDMA write_dma;
Sissors 0:004e5e86de4e 62
Sissors 0:004e5e86de4e 63 };
Sissors 0:004e5e86de4e 64
Sissors 0:004e5e86de4e 65
Sissors 0:004e5e86de4e 66 #endif