SPI slave program to enable communication between the FPGA and the STM32L432 board.

Dependencies:   mbed

DMA_SPI.h

Committer:
Zbyszek
Date:
2019-05-15
Revision:
15:791f35b0f220
Parent:
13:c7e8e277f884

File content as of revision 15:791f35b0f220:

#ifndef _DMA_SPI_H_
#define _DMA_SPI_H_

#define C2S     2
#define C3S     3

#define CCR_EN      0
#define CCR_TCIE    1
#define CCR_HTIE    2
#define CCR_TEIE    3
#define CCR_DIR     4
#define CCR_CIRC    5
#define CCR_PINC    6
#define CCR_MINC    7
#define CCR_PSIZE   8
#define CCR_MSIZE   10
#define CCR_PL      12
#define CCR_MEM2MEM 14


#define SPI1_DISABLE()      SPI1->CR1 &= ~SPI_CR1_SPE                           //Clear SPE bit in SPI1 CR1 register
#define SPI1_ENABLE()       SPI1->CR1 |=  SPI_CR1_SPE

#define CLEAR_SPI1_CR1_CRC_BIT()      SPI1->CR1 &= ~SPI_CR1_CRCEN

#define CLEAR_SPI1_CR1_MSTR_BIT()    SPI1->CR1 &= ~SPI_CR1_MSTR
#define SET_SPI1_CR1_MSTR_BIT()      SPI1->CR1 |=  SPI_CR1_MSTR

#define CLEAR_SPI1_CR1_BR_BITS()      SPI1->CR1 &= ~SPI_CR1_BR
#define SET_SPI1_CR1_BR_BITS()       SPI1->CR1 |= (3u<<3)                                //Sets the frequency to 1MHz 16/16 = 1

#define CLEAR_SPI1_CR1_SSM_BIT()      SPI1->CR1 &= ~SPI_CR1_SSM
#define SET_SPI1_CR1_SSM_BIT()        SPI1->CR1 |= SPI_CR1_SSM

#define CLEAR_SPI1_CR1_SSI_BIT()      SPI1->CR1 &= ~SPI_CR1_SSI
#define SET_SPI1_CR1_SSI_BIT()        SPI1->CR1 |= SPI_CR1_SSI                          

#define CLEAR_SPI1_CR1_CPOL_BIT()    SPI1->CR1 &= ~SPI_CR1_CPOL
#define SET_SPI1_CR1_CPOL_BIT()      SPI1->CR1 |=  SPI_CR1_CPOL

#define CLEAR_SPI1_CR1_CPHA_BIT()    SPI1->CR1 &= ~SPI_CR1_CPHA
#define SET_SPI1_CR1_CPHA_BIT()      SPI1->CR1 |=  SPI_CR1_CPHA

#define CLEAR_SPI1_CR2_DS_BITS()    SPI1->CR2 &= ~(0xF<<8) 
#define SET_SPI1_CR2_DS_BITS()      SPI1->CR2 |=  (0xF<<8)                       //Sets data frame to 16-bits

#define CLEAR_SPI1_CR2_RXDMAEN_BIT()        SPI1->CR2 &= ~(0x01<<0)
#define SET_SPI1_CR2_RXDMAEN_BIT()          SPI1->CR2 |=  (0x01<<0)

#define CLEAR_SPI1_CR2_TXDMAEN_BIT()        SPI1->CR2 &= ~(0x01<<1)
#define SET_SPI1_CR2_TXDMAEN_BIT()          SPI1->CR2 |=  (0x01<<1)

#define CLEAR_SPI1_CR2_RXEIE_BIT()        SPI1->CR2 &= ~(0x01<<6)
#define SET_SPI1_CR2_RXEIE_BIT()          SPI1->CR2 |=  (0x01<<6)

#define CLEAR_SPI1_CR2_TXEIE_BIT()        SPI1->CR2 &= ~(0x01<<7)
#define SET_SPI1_CR2_TXEIE_BIT()          SPI1->CR2 |=  (0x01<<7)


#define CLEAR_DMA1_SPI1RX_CSELR_BITS()      DMA1_CSELR->CSELR &= ~(0x01<<(4*(C2S - 1)))     //deselect SPI1_Rx on DMA1 Channel 2
#define SET_DMA1_SPI1RX_CSELR_BITS()        DMA1_CSELR->CSELR |=  (0x01<<(4*(C2S - 1)))     //Select SPI1_Rx on DMA1 Channel 2

#define CLEAR_DMA1_SPI1TX_CSELR_BITS()      DMA1_CSELR->CSELR &= ~(0x01<<(4*(C3S - 1)))     //deselect SPI1_Tx on DMA1 Channel 3
#define SET_DMA1_SPI1TX_CSELR_BITS()        DMA1_CSELR->CSELR |=  (0x01<<(4*(C3S - 1)))     //Select SPI1_Tx on DMA1 Channel 3


//--------------------------------------Channel2-----------------------------------------------------

#define DMA1_CH2_DISABLE()                         DMA1_Channel2->CCR &= ~(0x01<<CCR_EN) 
#define DMA1_CH2_ENABLE()                          DMA1_Channel2->CCR |=  (0x01<<CCR_EN) 

#define CLEAR_DMA1_CH2_CCR_DIR_BIT()               DMA1_Channel2->CCR &= ~(0x01 << CCR_DIR)
#define SET_DMA1_CH2_CCR_DIR_BIT()                 DMA1_Channel2->CCR |=  (0x01 << CCR_DIR)  

#define CLEAR_DMA1_CH2_CCR_PSIZE_BITS()            DMA1_Channel2->CCR &= ~(0x01 << CCR_PSIZE) 
#define SET_DMA1_CH2_CCR_PSIZE_BITS()              DMA1_Channel2->CCR |=  (0x01 << CCR_PSIZE)   //Set peripheral size to 16-bits

#define CLEAR_DMA1_CH2_CCR_MSIZE_BITS()            DMA1_Channel2->CCR &= ~(0x01 << CCR_MSIZE) 
#define SET_DMA1_CH2_CCR_MSIZE_BITS()              DMA1_Channel2->CCR |=  (0x01 << CCR_MSIZE)   //Set peripheral size to 16-bits

#define CLEAR_DMA1_CH2_CCR_MINC_BIT()              DMA1_Channel2->CCR &= ~(0x01 << CCR_MINC)
#define SET_DMA1_CH2_CCR_MINC_BIT()                DMA1_Channel2->CCR |=  (0x01 << CCR_MINC) 

#define CLEAR_DMA1_CH2_CCR_PINC_BIT()              DMA1_Channel2->CCR &= ~(0x01 << CCR_PINC)
#define SET_DMA1_CH2_CCR_PINC_BIT()                DMA1_Channel2->CCR |=  (0x01 << CCR_PINC) 

#define CLEAR_DMA1_CH2_CCR_TCIE_BIT()              DMA1_Channel2->CCR &= ~(0x01 << CCR_TCIE)
#define SET_DMA1_CH2_CCR_TCIE_BIT()                DMA1_Channel2->CCR |=  (0x01 << CCR_TCIE)

#define CLEAR_DMA1_CH2_CCR_CIRC_BIT()              DMA1_Channel2->CCR &= ~(0x01 << CCR_CIRC)
#define SET_DMA1_CH2_CCR_CIRC_BIT()                DMA1_Channel2->CCR |=  (0x01 << CCR_CIRC)

#define CLEAR_DMA1_CH2_CCR_MEM2MEM_BIT()           DMA1_Channel2->CCR &= ~(0x01 << CCR_CIRC)
#define SET_DMA1_CH2_CCR_MEM2MEM_BIT()             DMA1_Channel2->CCR |=  (0x01 << CCR_CIRC)

#define CLEAR_DMA1_CH2_CCR_PL_BITS()               DMA1_Channel2->CCR &= ~(0x03 << CCR_PL)
#define SET_DMA1_CH2_CCR_PL_BITS()                 DMA1_Channel2->CCR |=  (0x03 << CCR_PL)         //Set to highest priority level

#define CLEAR_DMA1_CH2_CCR_TEIE_BIT()              DMA1_Channel2->CCR &= ~(0x01<< CCR_TEIE)
#define SET_DMA1_CH2_CCR_TEIE_BIT()                DMA1_Channel2->CCR |=  (0x01<< CCR_TEIE)

#define CLEAR_DMA1_CH2_CNDTR_BITS()                DMA1_Channel2->CNDTR  =  0
#define CLEAR_DMA1_CH2_CPAR_BITS()                 DMA1_Channel2->CPAR   =  0
#define CLEAR_DMA1_CH2_CMAR_BITS()                 DMA1_Channel2->CMAR   =  0

#define CLEAR_DMA1_CH2_IFCR_GFLAG()                DMA1->IFCR |= (1u << (4*(C2S - 1)))

//--------------------------------------Channel3-----------------------------------------------------

#define DMA1_CH3_DISABLE()        DMA1_Channel3->CCR &= ~(0x01<<CCR_EN) 
#define DMA1_CH3_ENABLE()         DMA1_Channel3->CCR |=  (0x01<<CCR_EN) 

#define CLEAR_DMA1_CH3_CCR_DIR_BIT()            DMA1_Channel3->CCR &= ~(0x01 << CCR_DIR)
#define SET_DMA1_CH3_CCR_DIR_BIT()              DMA1_Channel3->CCR |=  (0x01 << CCR_DIR)  

#define CLEAR_DMA1_CH3_CCR_PSIZE_BITS()            DMA1_Channel3->CCR &= ~(0x01 << CCR_PSIZE) 
#define SET_DMA1_CH3_CCR_PSIZE_BITS()              DMA1_Channel3->CCR |=  (0x01 << CCR_PSIZE)   //Set peripheral size to 16-bits

#define CLEAR_DMA1_CH3_CCR_MSIZE_BITS()            DMA1_Channel3->CCR &= ~(0x01 << CCR_MSIZE) 
#define SET_DMA1_CH3_CCR_MSIZE_BITS()              DMA1_Channel3->CCR |=  (0x01 << CCR_MSIZE)   //Set peripheral size to 16-bits

#define CLEAR_DMA1_CH3_CCR_MINC_BIT()            DMA1_Channel3->CCR &= ~(0x01 << CCR_MINC)
#define SET_DMA1_CH3_CCR_MINC_BIT()              DMA1_Channel3->CCR |=  (0x01 << CCR_MINC) 

#define CLEAR_DMA1_CH3_CCR_PINC_BIT()            DMA1_Channel3->CCR &= ~(0x01 << CCR_PINC)
#define SET_DMA1_CH3_CCR_PINC_BIT()              DMA1_Channel3->CCR |=  (0x01 << CCR_PINC) 

#define CLEAR_DMA1_CH3_CCR_TCIE_BIT()            DMA1_Channel3->CCR &= ~(0x01 << CCR_TCIE)
#define SET_DMA1_CH3_CCR_TCIE_BIT()              DMA1_Channel3->CCR |=  (0x01 << CCR_TCIE)

#define CLEAR_DMA1_CH3_CCR_CIRC_BIT()            DMA1_Channel3->CCR &= ~(0x01 << CCR_CIRC)
#define SET_DMA1_CH3_CCR_CIRC_BIT()              DMA1_Channel3->CCR |=  (0x01 << CCR_CIRC)

#define CLEAR_DMA1_CH3_CCR_MEM2MEM_BIT()            DMA1_Channel3->CCR &= ~(0x01 << CCR_CIRC)
#define SET_DMA1_CH3_CCR_MEM2MEM_BIT()              DMA1_Channel3->CCR |=  (0x01 << CCR_CIRC)

#define CLEAR_DMA1_CH3_CCR_PL_BITS()            DMA1_Channel3->CCR &= ~(0x03 << CCR_PL)
#define SET_DMA1_CH3_CCR_PL_BITS()              DMA1_Channel3->CCR |=  (0x03 << CCR_PL)         //Set to highest priority level

#define CLEAR_DMA1_CH3_CCR_TEIE_BIT()            DMA1_Channel3->CCR &= ~(0x01<< CCR_TEIE)
#define SET_DMA1_CH3_CCR_TEIE_BIT()              DMA1_Channel3->CCR |=  (0x01<< CCR_TEIE)
     
#define CLEAR_DMA1_CH3_CNDTR_BITS()         DMA1_Channel3->CNDTR  =  0
#define CLEAR_DMA1_CH3_CPAR_BITS()          DMA1_Channel3->CPAR   =  0
#define CLEAR_DMA1_CH3_CMAR_BITS()          DMA1_Channel3->CMAR   =  0

#define CLEAR_DMA1_CH3_IFCR_GFLAG()         DMA1->IFCR |= (1u << (4*(C3S - 1)))


#define SCK_slave       1       
#define MISO_slave      6       
#define MOSI_slave      7           

#define clr_CS()    GPIOA->BSRR=(1u<<(CS_slave+16))
#define set_CS()    GPIOA->BSRR=(1u<<CS_slave)


#include <stm32l4xx.h> 
void initDMA();
extern int16_t data_to_transmit[12];
extern int16_t received_data[12];
extern int16_t IMU_Data_Array[12];
extern int16_t SampleFIFO[10][12];

extern int pointerOS;
extern int pointerNS;
extern int pointerFS;

extern char newDataFlag;
volatile extern char dataRequestFlag;
volatile extern char dataLoadedFlag;

void SPI_DMA_init();
void SPI_DMA_SLAVE_init();
void SPI_DMA_SLAVE_deinit();
void deinitDMA();
void startCommunication();

#endif