Uses DMA to read/write SPI blocks, while putting the current thread in Wait state.
RTOS_SPI.h@0:004e5e86de4e, 2013-12-26 (annotated)
- 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?
User | Revision | Line number | New 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 |