SPI slave DMA-read program for FRDMKL46Z, verified, working

Dependencies:   SimpleDMA mbed-rtos mbed

Committer:
shreeshas95
Date:
Tue Sep 27 10:39:48 2016 +0000
Revision:
4:33fc4fec3087
Parent:
3:e59d61aac1e1
Simple test program for spi-DMA

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shreeshas95 0:f0f5102ed9ca 1 #ifdef TARGET_KL46Z
shreeshas95 0:f0f5102ed9ca 2 class dmaSPISlave : public SPISlave{
shreeshas95 0:f0f5102ed9ca 3 public:
shreeshas95 2:16545dbc88ae 4 /*
shreeshas95 2:16545dbc88ae 5 @brief: constructor : initialise the spi slave pins
shreeshas95 2:16545dbc88ae 6 @param: mosi, miso, sclk, ssel
shreeshas95 2:16545dbc88ae 7 @return: none
shreeshas95 2:16545dbc88ae 8 */
shreeshas95 0:f0f5102ed9ca 9 dmaSPISlave(PinName mosi, PinName miso, PinName sclk, PinName ssel) : SPISlave(mosi, miso, sclk, ssel){
shreeshas95 0:f0f5102ed9ca 10 // trigger appropriate spi for dma
shreeshas95 0:f0f5102ed9ca 11 if(_spi.spi == SPI0){
shreeshas95 0:f0f5102ed9ca 12 read_dma.trigger(Trigger_SPI0_RX);
shreeshas95 0:f0f5102ed9ca 13 }
shreeshas95 0:f0f5102ed9ca 14 else{
shreeshas95 0:f0f5102ed9ca 15 read_dma.trigger(Trigger_SPI1_RX);
shreeshas95 0:f0f5102ed9ca 16 }
shreeshas95 0:f0f5102ed9ca 17
shreeshas95 0:f0f5102ed9ca 18 // set source for spi slave dma : mosi
shreeshas95 0:f0f5102ed9ca 19 read_dma.source(&_spi.spi->DL, false);
shreeshas95 0:f0f5102ed9ca 20 }
shreeshas95 0:f0f5102ed9ca 21
shreeshas95 2:16545dbc88ae 22 /*
shreeshas95 2:16545dbc88ae 23 @brief: initialise the dma buffer to store the recevied data
shreeshas95 2:16545dbc88ae 24 @param: read_data : pointer to the buffer
shreeshas95 2:16545dbc88ae 25 len : length in bytes to store in the buffer
shreeshas95 2:16545dbc88ae 26 fun : address of the function to attach to the dma interrupt, interrupt is called when the len num of bytes are written to the buffer
shreeshas95 2:16545dbc88ae 27 @return: none
shreeshas95 2:16545dbc88ae 28 */
shreeshas95 1:3cceef118195 29 void bulkRead_init(uint8_t *read_data, int len, void (*fun)(void) ){
shreeshas95 0:f0f5102ed9ca 30 // acquire();
shreeshas95 0:f0f5102ed9ca 31 _spi.spi->C2 |= SPI_C2_RXDMAE_MASK;
shreeshas95 0:f0f5102ed9ca 32
shreeshas95 0:f0f5102ed9ca 33 // auto increment is true
shreeshas95 0:f0f5102ed9ca 34 read_dma.destination(read_data, true);
shreeshas95 0:f0f5102ed9ca 35
shreeshas95 1:3cceef118195 36 // specify length
shreeshas95 1:3cceef118195 37 length = len;
shreeshas95 1:3cceef118195 38
shreeshas95 1:3cceef118195 39 // attach interrupt function
shreeshas95 1:3cceef118195 40 read_dma.attach(fun);
shreeshas95 3:e59d61aac1e1 41 }
shreeshas95 3:e59d61aac1e1 42
shreeshas95 3:e59d61aac1e1 43 void bulkRead_restart(){
shreeshas95 3:e59d61aac1e1 44 _spi.spi->C2 |= SPI_C2_RXDMAE_MASK;
shreeshas95 1:3cceef118195 45 }
shreeshas95 1:3cceef118195 46
shreeshas95 2:16545dbc88ae 47 /*
shreeshas95 2:16545dbc88ae 48 @brief: start the dma read process : has to be done everytime the buffer gets filled, can be used repeatedly
shreeshas95 2:16545dbc88ae 49 @param: none
shreeshas95 2:16545dbc88ae 50 @return: none
shreeshas95 2:16545dbc88ae 51 */
shreeshas95 1:3cceef118195 52 void bulkRead_start(){
shreeshas95 0:f0f5102ed9ca 53 // start the read_dma
shreeshas95 0:f0f5102ed9ca 54 read_dma.start(length);
shreeshas95 1:3cceef118195 55 }
shreeshas95 2:16545dbc88ae 56
shreeshas95 2:16545dbc88ae 57 /*
shreeshas95 2:16545dbc88ae 58 @brief: end dma process and return back to normal spi mode
shreeshas95 2:16545dbc88ae 59 @param: none
shreeshas95 2:16545dbc88ae 60 @return: none
shreeshas95 2:16545dbc88ae 61 */
shreeshas95 2:16545dbc88ae 62 void bulkRead_end(){
shreeshas95 2:16545dbc88ae 63 // turn off dma
shreeshas95 2:16545dbc88ae 64 _spi.spi->C2 &= ~(SPI_C2_RXDMAE_MASK);
shreeshas95 2:16545dbc88ae 65 }
shreeshas95 0:f0f5102ed9ca 66
shreeshas95 0:f0f5102ed9ca 67 private:
shreeshas95 1:3cceef118195 68 int length;
shreeshas95 0:f0f5102ed9ca 69 SimpleDMA read_dma;
shreeshas95 0:f0f5102ed9ca 70 };
shreeshas95 0:f0f5102ed9ca 71 #endif