/*
|
* spi.c
|
*
|
* Created on: 2021Äê6ÔÂ26ÈÕ
|
* Author: graydon
|
*/
|
#include <stdint.h>
|
#include <stdio.h>
|
#include <sru.h>
|
#include <def1802.h>
|
#include <cdef1802.h>
|
//#include <def21489.h>
|
//#include <cdef21489.h>
|
#include <services/int/adi_int.h>
|
#include <signal.h>
|
#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;
|
}
|