搜索
bottom↓
回复: 3

VS1053b录音文件播放速度很快,请大神指点。

[复制链接]

出0入0汤圆

发表于 2016-11-22 08:34:27 | 显示全部楼层 |阅读模式
调试之路曲折呀,一开始是不行,换了一个1003,可以了,但是不能录音,又换了一个1053,可以放歌可以录音,只是录音文件放出来的速度很快。百思不得其解。请各位指点指点。
  1. void vs10xx_record(void)
  2. {
  3.         unsigned int data_count = 0;
  4.         uint16_t u16data = 0;
  5.         unsigned int file_size = 0;
  6.         unsigned int idx = 0;
  7.         uint8_t u8times = 0;
  8.         uint8_t u8switch = 0;
  9.         int ret;
  10.         struct file_wav head = {
  11.                         .ChunkID   = 0x46464952,
  12.                         .ChunkSize = 0,
  13.                         .Format    = 0x45564157,

  14.                         .SubChunk1ID = 0x20746d66,  //"fmt "
  15.                         .SubChunk1Size = 16,    //大小为16字节
  16.                         .AudioFormat = 0x01,    // ADPCM
  17.                         .NumOfChannels = 1,    // 单声道
  18.                         .SampleRate = 8000,    //8000比特率
  19.                         .ByteRate = 16000,    // 8000 * 2
  20.                         .BlockAlign = 2,    //每一块为2字节
  21.                         .BitsPerSample = 16,            //十六位

  22.                         .SubChunk3ID = 0x61746164,  //"data"
  23.                         .SubChunk3Size = 0

  24.         };
  25.         INFOF((FILE" record strat\n"));
  26.         file_size = sizeof(head);
  27.         fd =create (FILE,  777);
  28.         if (fd < 0) {
  29.                 return;
  30.         }
  31.         ret = write(fd, &head, sizeof(struct file_wav));
  32.         if (ret == 0) {
  33.                 close(fd);
  34.                 return;
  35.         }
  36.         fsync(fd);
  37.         VS1003B_WriteCMD(SPI_BASS, 0);
  38.         VS1003B_WriteCMD(SPI_AICTRL0, 8000);
  39.         VS1003B_WriteCMD(SPI_AICTRL1, 4096);     //4倍增益
  40.         VS1003B_WriteCMD(SPI_AICTRL2, 0);
  41.         VS1003B_WriteCMD(SPI_AICTRL3, 6);   
  42.         VS1003B_WriteCMD(SPI_CLOCKF, 0x2000);
  43.         VS1003B_WriteCMD(SPI_MODE, 0x1804);
  44.         mdelay(5);
  45.         VS_Load_Patch((uint16_t *)wav_plugin, 40);
  46.         while (Mp3ReadRegister(SPI_HDAT1) >> 8);
  47.         while (1) {
  48.                 data_count = Mp3ReadRegister(SPI_HDAT1);
  49.                 if (data_count > 256 && data_count < 896) {
  50.                         idx = 0;
  51.                         while (idx < 512) {
  52.                                 u16data = Mp3ReadRegister(SPI_HDAT0);

  53.                                 data1[idx++]  = u16data & 0xff;
  54.                                 data1[idx++]  = u16data >> 8;
  55.                         }
  56.                         file_size += 512;
  57.                         ret = write(fd, data1, idx);
  58.                         if (ret <= 0) {
  59.                                 INFOF((" write error\n"));
  60.                                 close(fd);
  61.                                 break;
  62.                         }
  63.                         fsync(fd);
  64.                         led_toggle(0);
  65.                 }

  66.                 if (gpio_get(VKEY1) == 0) {
  67.                         while (gpio_get(VKEY1) == 0 ){
  68.                                 mdelay(200);
  69.                         }
  70.                         INFOF((FILE" record over\n"));
  71.                         head.ChunkSize = file_size - 8; //算出大小,总文件大小-8
  72.                         head.SubChunk3Size = file_size - sizeof(struct file_wav); //算出大小,总文件大小减去头部
  73.                         lseek(fd, 0, SEEK_SET);
  74.                         write(fd, &head, sizeof(head));
  75.                         close(fd);
  76.                         VS1003B_SoftReset();
  77.                         INFOF(("file size: %d\n", head.ChunkSize + 8));
  78.                         break;
  79.                 }
  80.         }
  81. }


  82. void vs10xx_play(void)
  83. {
  84.         int status;
  85.         int fd;
  86.         char testbuf[512] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
  87.         uint32_t file_size = 0;
  88.         int count = 0;
  89.         Mp3Reset();
  90.         Mp3SoftReset();//里面包含VS1003B_WriteCMD(SPI_CLOCKF, 0x9800);
  91.         VS1003B_SetVirtualSurroundOn();
  92.         VS1003B_WriteCMD(SPI_DECODE_TIME,0x0000);     //复位解码器时间
  93.         VS1003B_WriteCMD(SPI_DECODE_TIME,0x0000);
  94.         VS_Load_Patch((uint16_t *)wav_plugin, 40);     //加载配置
  95.         INFOF(("register SPI_CLOCKF: 0x%x\n", Mp3ReadRegister(SPI_CLOCKF)));
  96.         INFOF(("play strat\n"));
  97.         if ((fd = open(FILE,  O_RDWR, 777))  < 0) {
  98.                 INFOF(("open error: 0x%x\n", fd));
  99.                 return;
  100.         }
  101.         while(1){
  102.                 status = read( fd, testbuf, 512 );
  103.                 if ( status > 0 )
  104.                 {
  105.                         count = 0;
  106.                         Mp3DeselectControl();
  107.                         Mp3SelectData();

  108.                         while ( count < 512)  /* SD?¨?áè?ò???sector£?ò???sector?a512×??ú */
  109.                         {
  110.                                 if ( MP3_DREQ != 0 )              /* μè′yDREQ?a??£????óêy?Yê?è? */
  111.                                 {
  112.                                         VS1003B_WriteDAT( testbuf + count, 32);
  113.                                         count += 32;
  114.                                 }
  115.                         }
  116.                         Mp3DeselectData();

  117.                         led_toggle(0);
  118.                         if (gpio_get(VKEY2) == 0) {
  119.                                 while (gpio_get(VKEY2) == 0 ){
  120.                                         mdelay(200);
  121.                                 }
  122.                                 INFOF(("break\n"));
  123.                                 close(fd);
  124.                                 break;
  125.                         }
  126.                 }
  127.                 else {
  128.                         INFOF((FILE" play over\n"));
  129.                         close(fd);
  130.                         VS1003B_Fill2048Zero();
  131.                         break;
  132.                 }
  133.         }
  134. }
复制代码



这个是在多任务的操作系统实现的,任务级别是2,其实挺高级的任务了。
我自己排除了一些情况:
    1、卡的读写速度不够,导致漏了数据。
        我创建了一个10M的数组,直接将录音数据存放在数组中,播放时直接播放数组,还是一样的情况。
    2、时钟频率不匹配的问题,
        我试过录音时VS1003B_WriteCMD(SPI_CLOCKF, 0x2000);播放是设(SPI_CLOCKF, 0x9800);
        试过录音时VS1003B_WriteCMD(SPI_CLOCKF, 0x9800);播放是设(SPI_CLOCKF, 0x9800);
        试过录音时VS1003B_WriteCMD(SPI_CLOCKF, 0x9800);播放是设(SPI_CLOCKF, 0x2000);
        试过录音时VS1003B_WriteCMD(SPI_CLOCKF, 0x9800);播放是设(SPI_CLOCKF, 0x2000);
        都不行。
是还有什么地方我没有设置好吗?还是说我漏了什么东西?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-11-23 14:33:45 来自手机 | 显示全部楼层
晶体,相关软硬件有问题么?

出0入0汤圆

 楼主| 发表于 2016-11-28 12:24:49 | 显示全部楼层
labtech 发表于 2016-11-23 14:33
晶体,相关软硬件有问题么?

一开始我怀疑是逻辑上的问题,后来用逻辑分析仪抓数据看了之后发现实际采样率达不到要求。现在还在处理。

出0入0汤圆

 楼主| 发表于 2016-12-23 16:33:30 | 显示全部楼层
问题解决了,由于我用了中间层系统,所以导致整体的采样率并达不到我设定的比特率,最后录出来的文件大小也与算出来大小不等,把spi采样率提高就好了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 22:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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