#include #include #include #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=256){ wr=0; } }; } */