/* * spi.c * * Created on: 2021Äê6ÔÂ26ÈÕ * Author: graydon */ #include #include #include #include #include "spi.h" #include "gpio.h" #include "config.h" #include #define MASTER 0 #define CPHA 1 #define CPOL 0 #define BITS 0 //8-bit #define CS 1 #define MSIZE 0 #define PSIZE 0 volatile unsigned char SPI_Tx_BUFFER[SPI_BUFFER_SIZE]; volatile unsigned char SPI_Rx_BUFFER[SPI_BUFFER_SIZE]; // volatile short SPIRxDone =1; volatile short SPITxDone =1; static void SPIDMA_Handler(uint32_t iid, void* arg) { if(iid == INTR_SPI2_RXDMA){ *pREG_DMA27_STAT |= ENUM_DMA_STAT_IRQDONE ; GPIO_SetOutPut(GPIOA, GPIO_Pin12|GPIO_Pin13, GPIO_HIGH); GPIO_SetOutPut(GPIOB, GPIO_Pin5, GPIO_HIGH); GPIO_SetOutPut(GPIOC, GPIO_Pin4|GPIO_Pin7, GPIO_HIGH); SPIRxDone = 1; SPITxDone = 1; } // else if(iid == INTR_SPI2_TXDMA) { // *pREG_DMA26_STAT |= ENUM_DMA_STAT_IRQDONE ; // GPIO_SetOutPut(GPIOC, GPIO_Pin4, GPIO_HIGH); // SPITxDone = 1; // } // adi_int_ClearPending(iid); } static void DMAConfig(SPIStatus status) { if(status == SPI_TX) { *pREG_DMA26_CFG = (MSIZE<<8) | (PSIZE<<4) | 4 ; *pREG_DMA26_XCNT = SPI_BUFFER_SIZE; *pREG_DMA26_XMOD = 1; *pREG_DMA26_ADDRSTART= (uint32_t)SPI_Tx_BUFFER|MP_OFFSET; *pREG_DMA26_CFG |= 1 ; *pREG_SPI2_TXCTL |= (1<<0); } if(status == SPI_RX) { *pREG_DMA27_CFG = (1<<1)| (MSIZE<<8) | (PSIZE<<4) | (1<<20) | 4 ; *pREG_DMA27_XCNT = SPI_BUFFER_SIZE; *pREG_DMA27_XMOD = 1; *pREG_DMA27_ADDRSTART= (uint32_t)SPI_Rx_BUFFER|MP_OFFSET; *pREG_DMA27_CFG |= 1 ; *pREG_SPI2_RXCTL |= (1<<0); } } void SPI_xfer(int8_t* rx, int8_t* tx, uint32_t len) { int i; *pREG_SPI2_RWC = SPI_BUFFER_SIZE; *pREG_SPI2_TWC = SPI_BUFFER_SIZE; for(i=0; i < len; i++) { *pREG_SPI2_TFIFO = tx[i]; while(*pREG_SPI2_STAT&(1<<23)); while(*pREG_SPI2_STAT&(1<<22)); rx[i] = *pREG_SPI2_RFIFO; } } int SPI2_Init() { *pREG_SPI2_CLK =0 ;// spi slave. *pREG_SPI2_DLY = (1<<0)|(1<<8)|(1<<9); *pREG_SPI2_CTL = (MASTER<<1)|(0<<3)|(CPHA<<4)|(CPOL<<5)|(1<<6)|(1<<8)|(BITS<<9); *pREG_SPI2_TXCTL = (1<<4); *pREG_SPI2_RXCTL = (1<<4); *pREG_SPI2_TWCR = 0; *pREG_SPI2_RWCR = 0; *pREG_SPI2_SLVSEL = 0xfe00; if(MASTER) { *pREG_SPI2_SLVSEL |= 1<