#include <stdio.h>
|
#include <stdlib.h>
|
#include <string.h>
|
#include "global.h"
|
#include "spi.h"
|
#include "scene.h"
|
#include "queue.h"
|
|
#define SPIB_CS 1
|
extern void* hrx_que,*htx_que;
|
|
|
void spi_dma_isr(int ui);
|
void spi_int_isr(int ui);
|
|
void spi_poll(void);
|
|
typedef volatile struct{
|
spi_status_e status;
|
spi_direction_e direction;
|
short spi_buff[SPI_PKT_SIZE];
|
}spi_event,*pspi_event;
|
|
static spi_event spi;
|
|
void spi_init(int mode)//int id,int cs,int master,edevice_manner mode
|
{
|
|
*pSPICTL = 0 ;
|
*pSPIFLG = 0;
|
*pSPISTAT= 0x56;
|
*pSPIDMAC = 0;
|
*pSPIBAUD = 0;
|
|
switch(mode){
|
case DEVICE_POLL:
|
*pSPICTL = (SPIEN | WL16 | MSBF | CPHASE |GM);
|
// spi_poll();
|
break;
|
case DEVICE_INT:
|
interrupts(SIG_P1, spi_int_isr);
|
*pSPICTL = (SPIEN | WL16 | MSBF | CPHASE |SENDZ );
|
break;
|
case DEVICE_DMA:
|
interrupts(SIG_P1, spi_dma_isr);
|
spi_config_dma(spi_rx);
|
break;
|
}
|
}
|
|
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;
|
}
|
|
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;
|
}
|
|
void spi_int_isr(int ui)
|
{
|
|
}
|
|
extern void* htx_que,*hrx_que;
|
|
|
void spi_dma_isr(int ui)
|
{
|
*pSPICTL = 0; //½ûÖ¹SPI £¬·ñÔò¿ÉÄܵ¼ÖÂËÀ»ú
|
spi.status = spi_completed;
|
SRU(LOW,DPI_PB11_I); //֪ͨMCU Í£Ö¹SPIͨÐÅ
|
|
/* if(spi.direction==spi_rx){
|
queue_push(hrx_que,spi.spi_buff,SPI_PKT_SIZE);
|
}
|
|
|
//ÅжϷ¢ËͲ»ÄÜ·ÅÔÚÕâÀÒòΪ¸Ã´¥·¢¿¿Öжϣ¬
|
//¼ÙÉèÀ´Ò»¸ö°ü£¬´¦ÀíÍêºóDSPÐèÒª·¢ËÍ£¬ÐèÒªÀ´µÚ¶þ¸ö°ü²ÅÄܱä³É·¢ËÍģʽ
|
if(queue_count(htx_que)>=SPI_PKT_SIZE){
|
//·¢ËͶÓÁв»¿ÕÅäÖóɷ¢ËÍģʽ
|
queue_pop(htx_que,spi.spi_buff,SPI_PKT_SIZE);
|
spi_config_dma(spi_tx);
|
SRU(LOW,DPI_PB11_I);
|
}
|
else{
|
spi_config_dma(spi_rx);
|
SRU(HIGH,DPI_PB11_I);
|
}
|
// SRU(LOW,DPI_PB12_I);//֪ͨMCU SPI¿ÉÓÃ
|
*/
|
}
|
|
|
int spi_xfer(short *pin,const short* pout,int len)
|
{
|
int i;
|
|
|
for(i=0;i<len;i++){
|
//trasimit
|
if(pout){
|
*pTXSPI = pout[i] ;
|
}
|
while (*pSPISTAT & TXS);
|
|
|
//receive
|
while(!(*pSPISTAT & RXS));
|
|
if(pin){
|
pin[i] = *pRXSPI;
|
}
|
else{
|
*pRXSPI;
|
}
|
}
|
|
Delay(10);
|
return 0;
|
|
|
}
|
/*
|
short wbuf[256][64];
|
short wr=0;
|
|
void spi_poll()
|
{
|
short tbuf[64];
|
while(1){
|
spi_xfer(tbuf,tbuf,64);
|
memcpy(wbuf[wr++],tbuf,64);
|
if(wr>=256){
|
wr=0;
|
}
|
};
|
}
|
*/
|