/* * spi.c * * Created on: 2021Äê6ÔÂ26ÈÕ * Author: graydon */ #include #include #include #include #include //#include //#include #include #include #include "spi.h" #include "config.h" typedef struct{ spi_status_e status; spi_direction_e direction; short spi_buff[SPI_PKT_SIZE]; }spi_event,*pspi_event; static spi_event spi; static void SPIDMA_Handler(uint32_t iid, void* arg) { adi_int_ClearPending(iid); *pSPICTL = 0; //½ûÖ¹SPI £¬·ñÔò¿ÉÄܵ¼ÖÂËÀ»ú spi.status = spi_completed; SRU(LOW,DPI_PB11_I); //֪ͨMCU Í£Ö¹SPIͨÐÅ } void spi_config_dma(spi_direction_e direction) { //change receive to a new dma if(spi.direction==spi_tx){ *pSPICTL = 0; *pSPIDMAC = 0; *pSPISTAT = 0x56; } else if(spi.direction==spi_rx){ *pSPICTL = 0; *pSPIDMAC = 0x00000080; *pSPISTAT = 0x56; } *pIISPI = (int)spi.spi_buff; *pIMSPI = 1; *pCSPI = SPI_PKT_SIZE; *pSPICTL = (SPIEN | WL16 | LSBF | TIMOD2| CPHASE |CLKPL |GM); if(direction==spi_tx){ *pSPIDMAC = SPIDEN | INTEN |INTETC ; } else if(direction==spi_rx){ *pSPIDMAC = SPIDEN | SPIRCV | INTEN |INTETC ; } spi.direction = direction; spi.status = spi_processing; } int spi_init() { *pSPICTL = 0 ; *pSPIFLG = 0; *pSPISTAT= 0x56; *pSPIDMAC = 0; *pSPIBAUD = 0; adi_int_InstallHandler(ADI_CID_SPIHI, SPIDMA_Handler, 0, true); spi_config_dma(spi_rx); //spi.status = spi_completed; //spi.direction = spi_tx; return 0; } spi_status_e spi_get_status() { return spi.status; } void* spi_get_buffer() { return (void*)spi.spi_buff; } spi_direction_e spi_get_direction() { return spi.direction; }