[技术问答] 新唐nuc140接vs1053做mp3播放器。谁能帮帮看代码

[复制链接]
1819|10
 楼主| 492072866 发表于 2015-1-8 13:50 | 显示全部楼层 |阅读模式
  1. 代码如下,那位大神帮看看问题在哪?目测是spi通信问题。

  2. void SPI_send(uint8_t data)  //spi发送函数
  3. {        
  4.         SPI1->TX[0] = data;
  5.         SPI1->CNTRL.GO_BUSY = 1;
  6.         while ( SPI1->CNTRL.GO_BUSY == 1 );         //check data out?        
  7. }

  8. void SPI_read(uint8_t data)   //spi接受函数
  9. {        
  10.          data=SPI1->RX[0];
  11.         SPI1->CNTRL.GO_BUSY = 1;
  12.         while ( SPI1->CNTRL.GO_BUSY == 1 );         //check data out?        
  13. }



  14. int DREQ()    //获取DREQ引脚
  15. {
  16. int sssp;
  17. sssp=DrvGPIO_GetBit(E_GPA, 1);
  18. return sssp;
  19. }

  20. void SPI_init(void)  //spi初始化
  21. {         
  22.         DrvGPIO_InitFunction(E_FUNC_SPI1);
  23.         DrvSPI_Open(eDRVSPI_PORT1,eDRVSPI_MASTER,eDRVSPI_TYPE1,8);
  24.         DrvSPI_SetBitLength(eDRVSPI_PORT1,8);
  25.         DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST);
  26.         DrvSPI_DisableAutoSS(eDRVSPI_PORT1);
  27.         DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);
  28.         DrvSPI_SetClockFreq(eDRVSPI_PORT1, 9000000, 0);
  29.         DrvGPIO_Open(E_GPE, VS_CS,E_IO_OUTPUT);
  30.         SPI_send(0xFF);
  31. }

  32. void VS1053_Reset()  //vs1053硬复位
  33. {
  34. DrvGPIO_SetBit(E_GPE, VS_XCS);
  35. DrvGPIO_SetBit(E_GPE, VS_CS);
  36.   DrvGPIO_ClrBit(E_GPE, 4);
  37.   DrvSYS_Delay(1000);
  38.   DrvGPIO_SetBit(E_GPE, 4);
  39.   while(DREQ()==0)
  40.         {;}
  41. }


  42. void VS1053_writeReg(uint8_t addr,uint16_t dat)    //vs1053写指令
  43. {DrvSPI_SetClockFreq(eDRVSPI_PORT1, 1125000, 0);
  44. DrvGPIO_SetBit(E_GPE, VS_XCS);
  45. DrvGPIO_ClrBit(E_GPE, VS_CS);
  46. SPI_send(VS_WRITE_COM);
  47. SPI_send(addr);
  48. SPI_send((uint8_t)(dat>>8));
  49. SPI_send((uint8_t)(dat));
  50. DrvGPIO_SetBit(E_GPE, VS_CS);
  51. DrvSPI_SetClockFreq(eDRVSPI_PORT1, 9000000, 0);
  52. }

  53. void VS1053_writeData(uint8_t dat)         //向vs1053写数据
  54. {
  55. DrvGPIO_ClrBit(E_GPE, VS_XCS);
  56. //DrvGPIO_SetBit(E_GPE, 3);
  57. //DrvGPIO_ClrBit(E_GPC, 8);
  58. //SPI_send(VS_WRITE_COM);
  59. //SPI_send(VS_SCI_AUDATA);
  60. SPI_send((uint8_t)(dat));
  61. DrvGPIO_SetBit(E_GPE, VS_XCS);
  62. }

  63. void VS1053_SoltReset()                                                //软件复位vs1053
  64. {DrvSPI_SetClockFreq(eDRVSPI_PORT1, 281000, 0);
  65. VS1053_writeReg(VS_SCI_MODE,0x0807);
  66. while(DREQ()==0)
  67.         {;}
  68.           VS1053_writeReg(VS_SCI_CLOCKF,0x9800);
  69.   DrvSPI_SetClockFreq(eDRVSPI_PORT1, 9000000, 0);
  70. DrvGPIO_ClrBit(E_GPE, VS_XCS);
  71.   SPI_send(0x0);
  72.   SPI_send(0x0);
  73.   SPI_send(0x0);
  74.   SPI_send(0x0);
  75. DrvGPIO_SetBit(E_GPE, VS_XCS);
  76. while(DREQ()==0)
  77.         {;}
  78. }

  79. void VS1053Init()                                  //初始化vs1053
  80. {
  81. VS1053_Reset();
  82.         VS1053_SoltReset();
  83. VS1053_writeReg(VS_SCI_MODE,0x0803);
  84.   VS1053_writeReg(VS_SCI_BASS,0x0055);
  85.    VS1053_writeReg(VS_SCI_CLOCKF,0x9800);
  86.    VS1053_Vol=0xCA;
  87.     VS1053_writeReg(VS_SCI_VOL,(VS1053_Vol<<8)|VS1053_Vol);
  88.         while(DREQ()==0)
  89.         {;}
  90. }

  91. uint16_t VS1053read(uint8_t addr)       //读取vs1053寄存器
  92. {
  93. uint16_t tem;
  94. while(DREQ()==0)
  95.         {;}
  96. DrvSPI_SetClockFreq(eDRVSPI_PORT1, 1125000, 0);
  97. DrvGPIO_SetBit(E_GPE, VS_XCS);
  98. DrvGPIO_ClrBit(E_GPE, VS_CS);
  99. SPI_send(VS_READ_COM);
  100. SPI_send(addr);
  101. SPI_read(tem);
  102. tem=tem<<8;
  103. SPI_read(tem);
  104. DrvGPIO_SetBit(E_GPE, VS_CS);
  105. DrvSPI_SetClockFreq(eDRVSPI_PORT1, 9000000, 0);
  106. return tem;
  107. }


  108. void playmusic(uint8_t *mp3File)   //播放音乐
  109. {
  110. uint16_t k;
  111. int t;
  112. FATFS fs;
  113. BYTE MMcbuf[512];
  114. FIL file;
  115. UINT br;
  116. FRESULT res;
  117. f_mount(0,&fs);           // 加载文件系统

  118.         res = f_open(&file,(const TCHAR *)mp3File, FA_OPEN_EXISTING|FA_READ); // 打开文件
  119.         
  120.     if(res == FR_OK)  // 如果没有正确打开文件
  121.     {
  122.           while(1)
  123.            {
  124.             res=f_read(&file,MMcbuf,512,&br);
  125.                 k=0;
  126.                 do
  127.                 {
  128.                  if(DREQ()==1&&res == FR_OK)
  129.                   {
  130.                    for(t=0;t<32;t++)
  131.                    {VS1053_writeData(MMcbuf[k++]);}
  132.                   }
  133.                   if (ScanKey()!=0) keyhave();
  134.                 }while(k<512);
  135.            if((res!= FR_OK)||(br<512)) break;
  136.            }
  137.         }
  138.         f_close(&file);
  139.         f_mount(0,0);
  140. }
tihty 发表于 2015-1-8 14:22 | 显示全部楼层
哇塞 自己做的MP3 好牛
 楼主| 492072866 发表于 2015-1-8 15:20 | 显示全部楼层
那位大神懂。求救啊
gaoyang9992006 发表于 2015-1-8 21:41 | 显示全部楼层
你的代码到底肿么了?
gaoyang9992006 发表于 2015-1-8 21:41 | 显示全部楼层
你要给我们说明你的电路,以及你的目的,过程,然后遇到了什么问题,你觉得问题出在哪儿?
gaoyang9992006 发表于 2015-1-8 21:45 | 显示全部楼层
如果是单独的SPI问题,建议楼主直接从官方的库函数里,复制过来库函数使用。这样不会出错的。
gaoyang9992006 发表于 2015-1-8 21:46 | 显示全部楼层
官方的库函数有两个版本,好像是,一个IO模拟的,这个你可以修改为任意引脚,但是看好了里面定义的变量要跟你的对应好,另外一个采用SPI外设的专有接口。
lovecat2015 发表于 2015-1-29 12:58 来自手机 | 显示全部楼层
代码的问题最好自己看吧,大家谁有这么多时间啊
lovecat2015 发表于 2015-1-29 12:59 来自手机 | 显示全部楼层
有问题,最好把具体问题说出来,这样别人也好帮你,自己也能进步
quray1985 发表于 2015-1-29 19:51 | 显示全部楼层
楼主还是自己要求进步啊,自己把遇到的具体问题说清楚,只列出一堆代码,大家都没时间看啊
ccw1986 发表于 2015-1-29 22:11 | 显示全部楼层
代码有些长啊,看着好费劲
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部