- 代码如下,那位大神帮看看问题在哪?目测是spi通信问题。
- void SPI_send(uint8_t data) //spi发送函数
- {
- SPI1->TX[0] = data;
- SPI1->CNTRL.GO_BUSY = 1;
- while ( SPI1->CNTRL.GO_BUSY == 1 ); //check data out?
- }
- void SPI_read(uint8_t data) //spi接受函数
- {
- data=SPI1->RX[0];
- SPI1->CNTRL.GO_BUSY = 1;
- while ( SPI1->CNTRL.GO_BUSY == 1 ); //check data out?
- }
- int DREQ() //获取DREQ引脚
- {
- int sssp;
- sssp=DrvGPIO_GetBit(E_GPA, 1);
- return sssp;
- }
- void SPI_init(void) //spi初始化
- {
- DrvGPIO_InitFunction(E_FUNC_SPI1);
- DrvSPI_Open(eDRVSPI_PORT1,eDRVSPI_MASTER,eDRVSPI_TYPE1,8);
- DrvSPI_SetBitLength(eDRVSPI_PORT1,8);
- DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST);
- DrvSPI_DisableAutoSS(eDRVSPI_PORT1);
- DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);
- DrvSPI_SetClockFreq(eDRVSPI_PORT1, 9000000, 0);
- DrvGPIO_Open(E_GPE, VS_CS,E_IO_OUTPUT);
- SPI_send(0xFF);
- }
- void VS1053_Reset() //vs1053硬复位
- {
- DrvGPIO_SetBit(E_GPE, VS_XCS);
- DrvGPIO_SetBit(E_GPE, VS_CS);
- DrvGPIO_ClrBit(E_GPE, 4);
- DrvSYS_Delay(1000);
- DrvGPIO_SetBit(E_GPE, 4);
- while(DREQ()==0)
- {;}
- }
- void VS1053_writeReg(uint8_t addr,uint16_t dat) //vs1053写指令
- {DrvSPI_SetClockFreq(eDRVSPI_PORT1, 1125000, 0);
- DrvGPIO_SetBit(E_GPE, VS_XCS);
- DrvGPIO_ClrBit(E_GPE, VS_CS);
- SPI_send(VS_WRITE_COM);
- SPI_send(addr);
- SPI_send((uint8_t)(dat>>8));
- SPI_send((uint8_t)(dat));
- DrvGPIO_SetBit(E_GPE, VS_CS);
- DrvSPI_SetClockFreq(eDRVSPI_PORT1, 9000000, 0);
- }
- void VS1053_writeData(uint8_t dat) //向vs1053写数据
- {
- DrvGPIO_ClrBit(E_GPE, VS_XCS);
- //DrvGPIO_SetBit(E_GPE, 3);
- //DrvGPIO_ClrBit(E_GPC, 8);
- //SPI_send(VS_WRITE_COM);
- //SPI_send(VS_SCI_AUDATA);
- SPI_send((uint8_t)(dat));
- DrvGPIO_SetBit(E_GPE, VS_XCS);
- }
- void VS1053_SoltReset() //软件复位vs1053
- {DrvSPI_SetClockFreq(eDRVSPI_PORT1, 281000, 0);
- VS1053_writeReg(VS_SCI_MODE,0x0807);
- while(DREQ()==0)
- {;}
- VS1053_writeReg(VS_SCI_CLOCKF,0x9800);
- DrvSPI_SetClockFreq(eDRVSPI_PORT1, 9000000, 0);
- DrvGPIO_ClrBit(E_GPE, VS_XCS);
- SPI_send(0x0);
- SPI_send(0x0);
- SPI_send(0x0);
- SPI_send(0x0);
- DrvGPIO_SetBit(E_GPE, VS_XCS);
- while(DREQ()==0)
- {;}
- }
- void VS1053Init() //初始化vs1053
- {
- VS1053_Reset();
- VS1053_SoltReset();
- VS1053_writeReg(VS_SCI_MODE,0x0803);
- VS1053_writeReg(VS_SCI_BASS,0x0055);
- VS1053_writeReg(VS_SCI_CLOCKF,0x9800);
- VS1053_Vol=0xCA;
- VS1053_writeReg(VS_SCI_VOL,(VS1053_Vol<<8)|VS1053_Vol);
- while(DREQ()==0)
- {;}
- }
- uint16_t VS1053read(uint8_t addr) //读取vs1053寄存器
- {
- uint16_t tem;
- while(DREQ()==0)
- {;}
- DrvSPI_SetClockFreq(eDRVSPI_PORT1, 1125000, 0);
- DrvGPIO_SetBit(E_GPE, VS_XCS);
- DrvGPIO_ClrBit(E_GPE, VS_CS);
- SPI_send(VS_READ_COM);
- SPI_send(addr);
- SPI_read(tem);
- tem=tem<<8;
- SPI_read(tem);
- DrvGPIO_SetBit(E_GPE, VS_CS);
- DrvSPI_SetClockFreq(eDRVSPI_PORT1, 9000000, 0);
- return tem;
- }
- void playmusic(uint8_t *mp3File) //播放音乐
- {
- uint16_t k;
- int t;
- FATFS fs;
- BYTE MMcbuf[512];
- FIL file;
- UINT br;
- FRESULT res;
- f_mount(0,&fs); // 加载文件系统
- res = f_open(&file,(const TCHAR *)mp3File, FA_OPEN_EXISTING|FA_READ); // 打开文件
-
- if(res == FR_OK) // 如果没有正确打开文件
- {
- while(1)
- {
- res=f_read(&file,MMcbuf,512,&br);
- k=0;
- do
- {
- if(DREQ()==1&&res == FR_OK)
- {
- for(t=0;t<32;t++)
- {VS1053_writeData(MMcbuf[k++]);}
- }
- if (ScanKey()!=0) keyhave();
- }while(k<512);
- if((res!= FR_OK)||(br<512)) break;
- }
- }
- f_close(&file);
- f_mount(0,0);
- }