[mw_shl_code=c,true]#include <stdio.h>
#include <string.h>
#include "UART.h"
#include "GPIO.h"
#include "I2C.h"
#include "I2S.h"
#include "SYS.h"
#include "diskio.h"
#include "ff.h"
#include <Audio.h>
#include "adpcm4bit.h"
#include "SPI.h"
#include "LCD.h"
#include "Scankey.h"
#include "FatApp.h"
#define VS_WRITE_COM (0x02)
#define VS_SCI_MODE (0x00)
#define VS_SCI_BASS (0x02)
#define VS_SCI_CLOCKF (0x03)
#define VS_SCI_AUDATA (0x05)
#define VS_SCI_VOL (0x0B)
#define VS_XCS 2
#define VS_CS 3
void playmusic(uint8_t *mp3File);
void VS1053_writeData(uint8_t dat);
uint8_t VS1053_Vol;
typedef char TCHAR;
char TEXT2[16] = " ";
char TEXT5[16] = " ";
uint16_t i,j=0; // 计数器
uint8_t filebuf[50]; // 记录TXT文件号
uint32_t u32DataSize;
uint16_t tn;
FILINFO Finfo;
void Delay(uint32_t delayCnt)
{
while(delayCnt--)
{
__NOP();
__NOP();
}
}
void SPI_send(uint8_t data)
{
SPI1->TX[0] = data;
SPI1->CNTRL.GO_BUSY = 1;
while ( SPI1->CNTRL.GO_BUSY == 1 ); //check data out?
}
int DREQ()
{
int sssp;
sssp=DrvGPIO_GetBit(E_GPA, 1);
return sssp;
}
void SPI_init(void)
{
DrvGPIO_InitFunction(E_FUNC_SPI1);
DrvSPI_Open(eDRVSPI_PORT1,eDRVSPI_MASTER,eDRVSPI_TYPE1,8);
DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST);
DrvSPI_DisableAutoSS(eDRVSPI_PORT1);
DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);
DrvSPI_SetClockFreq(eDRVSPI_PORT1, 2000000, 0);
DrvGPIO_Open(E_GPE, VS_CS,E_IO_OUTPUT);
SPI_send(0xFF);
}
void InitTIMER0(void)
{
/* Step 1. Enable and Select Timer clock source */
SYSCLK->CLKSEL1.TMR0_S = 0; //Select 12Mhz for Timer0 clock source
SYSCLK->APBCLK.TMR0_EN =1; //Enable Timer0 clock source
/* Step 2. Select Operation mode */
TIMER0->TCSR.MODE=1; //Select periodic mode for operation mode
/* Step 3. Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/
TIMER0->TCSR.PRESCALE=63; // Set Prescale [0~255]
TIMER0->TCMPR = 187500; // Set TCMPR [0~16777215]
// (1/12000000)*(63+1)* 46875 = 0.25 sec
/* Step 4. Enable interrupt */
TIMER0->TCSR.IE = 1;
TIMER0->TISR.TIF = 1; //Write 1 to clear for safty
NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt
/* Step 5. Enable Timer module */
TIMER0->TCSR.CRST = 1; //Reset up counter
TIMER0->TCSR.CEN = 1; //Enable Timer0
// TIMER0->TCSR.TDR_EN=1; // Enable TDR function
}
void closeTIMER0(void)
{NVIC_DisableIRQ(TMR0_IRQn);}
void TMR0_IRQHandler(void) // Timer0 interrupt subroutine
{
sprintf(TEXT5,"time = %d sec",tn);
print_Line(2,TEXT5);
tn++;
InitTIMER0();
}
void VS1053_Reset()
{
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)
{
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);
}
void VS1053_writeData(uint8_t dat)
{
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_writeReg(VS_SCI_MODE,0x0807);
while(DREQ()==0)
{;}
DrvGPIO_ClrBit(E_GPE, VS_XCS);
//SPI_send(0x0);
//SPI_send(0x0);
//SPI_send(0x0);
SPI_send(0xFF);
DrvGPIO_SetBit(E_GPE, VS_XCS);
while(DREQ()==0)
{;}
}
void VS1053Init()
{
VS1053_Reset();
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)
{;}
VS1053_SoltReset();
}
void VS1053Test()
{
uint8_t i;
uint8_t test[]={0x53,0xEF,0x6E,0x24,0x00,0x00,0x00};
uint8_t back[]={0x45,0x78,0x69,0x74,0x00,0x00,0x00};
DrvSYS_Delay(100);
VS1053_writeReg(VS_SCI_MODE,0x0820);
while(DREQ()==0)
{;}
print_Line(2,"test1");
DrvGPIO_ClrBit(E_GPE, VS_XCS);
for(i=0;i<8;i++)
{VS1053_writeData(test);}
DrvGPIO_SetBit(E_GPE, VS_XCS);
DrvSYS_Delay(1000000);
DrvGPIO_ClrBit(E_GPE, VS_XCS);
for(i=0;i<8;i++)
{VS1053_writeData(back);}
DrvGPIO_SetBit(E_GPE, VS_XCS);
DrvSYS_Delay(200);
}
void keyhave()
{ uint8_t keyin,key2;
uint8_t filePath[40];
strcpy((char *)(filePath), "music/");
strcat((char *)filePath, (char *)(FileN[filebuf]));
keyin = ScanKey(); // scan keypad to input a number
if (keyin!=0) // CAN sending data
{ key2=keyin;
DrvSYS_Delay(100000);
DrvSYS_Delay(100000);
keyin = ScanKey();
// InitTIMER0();
if(keyin==0)
{//CAN_TX(key2);
switch(key2)
{case 1: print_Line(1,"last "); if(i>0) i--; break;
case 2: print_Line(1,"start "); playmusic(filePath); break;
case 3: print_Line(1,"next "); if(i<j) i++; break;
case 4: print_Line(1,"volume down "); break;
case 5: print_Line(1,"suspence "); break;
case 6: print_Line(1,"volume up "); break;
case 7: print_Line(1,"single "); break;
case 8: print_Line(1,"random "); break;
case 9: print_Line(1,"recycle "); break;
}
}
else
{ int tn_100=0;
closeTIMER0();
while(1)
{
switch(key2)
{
case 1: print_Line(1,"FFWD ");tn_100++; break;
case 3: print_Line(1,"BACK ");tn_100--; break;
default : break;
}
if(tn_100==70)
{tn+=1;
tn_100=0;
sprintf(TEXT5,"time = %d sec",tn); print_Line(2,TEXT5);
}
if(tn_100==-70)
{tn-=1;
tn_100=0;
sprintf(TEXT5,"time = %d sec",tn); print_Line(2,TEXT5);
}
keyin = ScanKey();
if(keyin==0)
{print_Line(3," ");InitTIMER0(); break;}
}
}
}
}
void playmusic(uint8_t *mp3File)
{
uint16_t k;
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)
{print_Line(2,"test2");
for(i=0;i<32;i++)
{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);
}
/*---------------------------------------------------------------------------------------------------------*/
/* Main function */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main (void)
{
int zanshi=i;
STR_UART_T sParam;
uint8_t filePath[40]; // 40个字节的路径,其中ebook/和.txt占了10个字节,剩余30个字节,可支持40个英文或20个汉字的文件名
uint8_t tempPath[10]; // 暂存路径,用来存放路劲ebook/
uint8_t num,txtnum; // 分别为文件总数,TXT文件数,目录页码
// uint8_t count; // 计数器
// uint16_t ypos; // TFT纵坐标
uint8_t temp1,temp2; // 暂存
//extern uint32_t SystemFrequency;
/* Unlock the locked registers */
UNLOCKREG();
DrvSYS_Open(50000000);
LOCKREG();
/* UART Setting */
sParam.u32BaudRate = 115200;
sParam.u8cDataBits = DRVUART_DATABITS_8;
sParam.u8cStopBits = DRVUART_STOPBITS_1;
sParam.u8cParity = DRVUART_PARITY_NONE;
sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;
/* Select UART Clock Source From 12MHz */
DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0);
/* Set UART Configuration */
DrvUART_Open(UART_PORT0,&sParam);
/* Set UART Pin */
DrvGPIO_InitFunction(E_FUNC_UART0);
DrvGPIO_Open(E_GPA, 1,E_IO_INPUT);
DrvGPIO_Open(E_GPE, VS_XCS,E_IO_OUTPUT);
SPI_init();
VS1053Init();
// DrvGPIO_Open(E_GPC, 8,E_IO_OUTPUT);
init_LCD(); //call initial pannel function
clear_LCD();
VS1053Test();
VS1053_SoltReset();
OpenKeyPad();
strcpy((char *)tempPath, "music/"); // 把文件名路径给了tempPath暂存
num = FileScan("music"); // 扫描ebook文件
if(num>50)num = 50; // 最多50个文件
for(i=0; i<num; i++) // 扫描所有文件类型 把mp3文件号码存储到filebuf中
{
if(flag==1) // 如果是mp3文件
{
filebuf[j]=i; // 记录,把mp3文件号存放到filebuf里面
j++;
}
}
txtnum = j;
sprintf(TEXT5,"i = %d ",txtnum);
print_Line(1,TEXT5);
i=0;
zanshi=i;
FileNameShow_HH(FileN[filebuf]);
// playmusic(FileN[filebuf]);
while(1)
{
if(zanshi!=i)
FileNameShow_HH(FileN[filebuf]);
zanshi=i;
keyhave();}
// InitTIMER0();
}
[/mw_shl_code]
|