lss1330 发表于 2016-11-22 08:34:27

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

调试之路曲折呀,一开始是不行,换了一个1003,可以了,但是不能录音,又换了一个1053,可以放歌可以录音,只是录音文件放出来的速度很快。百思不得其解。请各位指点指点。
void vs10xx_record(void)
{
      unsigned int data_count = 0;
      uint16_t u16data = 0;
      unsigned int file_size = 0;
      unsigned int idx = 0;
      uint8_t u8times = 0;
      uint8_t u8switch = 0;
      int ret;
      struct file_wav head = {
                        .ChunkID   = 0x46464952,
                        .ChunkSize = 0,
                        .Format    = 0x45564157,

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

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

      };
      INFOF((FILE" record strat\n"));
      file_size = sizeof(head);
      fd =create (FILE,777);
      if (fd < 0) {
                return;
      }
      ret = write(fd, &head, sizeof(struct file_wav));
      if (ret == 0) {
                close(fd);
                return;
      }
      fsync(fd);
      VS1003B_WriteCMD(SPI_BASS, 0);
      VS1003B_WriteCMD(SPI_AICTRL0, 8000);
      VS1003B_WriteCMD(SPI_AICTRL1, 4096);   //4倍增益
      VS1003B_WriteCMD(SPI_AICTRL2, 0);
      VS1003B_WriteCMD(SPI_AICTRL3, 6);   
      VS1003B_WriteCMD(SPI_CLOCKF, 0x2000);
      VS1003B_WriteCMD(SPI_MODE, 0x1804);
      mdelay(5);
      VS_Load_Patch((uint16_t *)wav_plugin, 40);
      while (Mp3ReadRegister(SPI_HDAT1) >> 8);
      while (1) {
                data_count = Mp3ReadRegister(SPI_HDAT1);
                if (data_count > 256 && data_count < 896) {
                        idx = 0;
                        while (idx < 512) {
                              u16data = Mp3ReadRegister(SPI_HDAT0);

                              data1= u16data & 0xff;
                              data1= u16data >> 8;
                        }
                        file_size += 512;
                        ret = write(fd, data1, idx);
                        if (ret <= 0) {
                              INFOF((" write error\n"));
                              close(fd);
                              break;
                        }
                        fsync(fd);
                        led_toggle(0);
                }

                if (gpio_get(VKEY1) == 0) {
                        while (gpio_get(VKEY1) == 0 ){
                              mdelay(200);
                        }
                        INFOF((FILE" record over\n"));
                        head.ChunkSize = file_size - 8; //算出大小,总文件大小-8
                        head.SubChunk3Size = file_size - sizeof(struct file_wav); //算出大小,总文件大小减去头部
                        lseek(fd, 0, SEEK_SET);
                        write(fd, &head, sizeof(head));
                        close(fd);
                        VS1003B_SoftReset();
                        INFOF(("file size: %d\n", head.ChunkSize + 8));
                        break;
                }
      }
}


void vs10xx_play(void)
{
      int status;
      int fd;
      char testbuf = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
      uint32_t file_size = 0;
      int count = 0;
      Mp3Reset();
      Mp3SoftReset();//里面包含VS1003B_WriteCMD(SPI_CLOCKF, 0x9800);
      VS1003B_SetVirtualSurroundOn();
      VS1003B_WriteCMD(SPI_DECODE_TIME,0x0000);   //复位解码器时间
      VS1003B_WriteCMD(SPI_DECODE_TIME,0x0000);
      VS_Load_Patch((uint16_t *)wav_plugin, 40);   //加载配置
      INFOF(("register SPI_CLOCKF: 0x%x\n", Mp3ReadRegister(SPI_CLOCKF)));
      INFOF(("play strat\n"));
      if ((fd = open(FILE,O_RDWR, 777))< 0) {
                INFOF(("open error: 0x%x\n", fd));
                return;
      }
      while(1){
                status = read( fd, testbuf, 512 );
                if ( status > 0 )
                {
                        count = 0;
                        Mp3DeselectControl();
                        Mp3SelectData();

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

                        led_toggle(0);
                        if (gpio_get(VKEY2) == 0) {
                              while (gpio_get(VKEY2) == 0 ){
                                        mdelay(200);
                              }
                              INFOF(("break\n"));
                              close(fd);
                              break;
                        }
                }
                else {
                        INFOF((FILE" play over\n"));
                        close(fd);
                        VS1003B_Fill2048Zero();
                        break;
                }
      }
}


这个是在多任务的操作系统实现的,任务级别是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);
      都不行。
是还有什么地方我没有设置好吗?还是说我漏了什么东西?

labtech 发表于 2016-11-23 14:33:45

晶体,相关软硬件有问题么?

lss1330 发表于 2016-11-28 12:24:49

labtech 发表于 2016-11-23 14:33
晶体,相关软硬件有问题么?

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

lss1330 发表于 2016-12-23 16:33:30

问题解决了,由于我用了中间层系统,所以导致整体的采样率并达不到我设定的比特率,最后录出来的文件大小也与算出来大小不等,把spi采样率提高就好了。
页: [1]
查看完整版本: VS1053b录音文件播放速度很快,请大神指点。