OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4535|回复: 2

求助,用新唐的NUC1409(cortex-m0)控制VS1053.传输数据时derq一直低电平。求帮助。

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-1-7
在线时间
0 小时
发表于 2015-1-7 13:02:31 | 显示全部楼层 |阅读模式
5金钱
[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]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-7 22:49:55 | 显示全部楼层
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-1-7
在线时间
0 小时
 楼主| 发表于 2015-1-8 10:11:05 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
大神,求指导啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 06:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表