OpenEdv-开源电子网

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

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

[复制链接]

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
发表于 2016-11-21 22:08:26 | 显示全部楼层 |阅读模式
5金钱
调试之类曲折呀,一开始是不行,换了一个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[idx++]  = u16data & 0xff;
                                data1[idx++]  = 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[512] = {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 );
//                INFOF(("sizeof (buffer): %d\n",  sizeof (buffer)));
                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);
        都不行。
是还有什么地方我没有设置好吗?还是说我漏了什么东西?

最佳答案

查看完整内容[请看2#楼]

问题已解决,是spi整体采样率达不到所设的采样率,导致数据丢失,与配置无关。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
 楼主| 发表于 2016-11-21 22:08:27 | 显示全部楼层
问题已解决,是spi整体采样率达不到所设的采样率,导致数据丢失,与配置无关。
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-2-20
在线时间
10 小时
发表于 2017-2-26 14:27:12 | 显示全部楼层
谢谢楼主提示啊!
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-2-20
在线时间
10 小时
发表于 2017-2-26 17:23:17 | 显示全部楼层
楼主请问你是怎么解决的?
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
 楼主| 发表于 2017-2-27 17:07:21 | 显示全部楼层
chinayyk 发表于 2017-2-26 17:23
楼主请问你是怎么解决的?

用逻辑分析仪分析通信过程,发现单位时间传输的数据量并达不到我设置的比特率。
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-2-20
在线时间
10 小时
发表于 2017-3-1 15:41:49 | 显示全部楼层
lss1330 发表于 2017-2-27 17:07
用逻辑分析仪分析通信过程,发现单位时间传输的数据量并达不到我设置的比特率。

那你是怎么处理的,我的意思是怎么提高实际传输速率?谢谢指导。
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
 楼主| 发表于 2017-3-3 17:17:37 | 显示全部楼层
chinayyk 发表于 2017-3-1 15:41
那你是怎么处理的,我的意思是怎么提高实际传输速率?谢谢指导。

有几种可能,1、spi启动过程处理太多事情了;2、如果有操作系统,可能任务优先级不够高,导致任务得不到cpu使用权;3、读取数据后,保存文件耗时过长。
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-2-20
在线时间
10 小时
发表于 2017-3-7 16:36:17 | 显示全部楼层
楼主,请问你是因为什么原因导致的spi速率不够的?因为spi处理太多事情还是因为保存文件耗时长?我想请教一下你又是怎么调整来提高实际采样率的?
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
 楼主| 发表于 2017-3-16 17:16:47 | 显示全部楼层
chinayyk 发表于 2017-3-7 16:36
楼主,请问你是因为什么原因导致的spi速率不够的?因为spi处理太多事情还是因为保存文件耗时长?我想请教一 ...

用了系统,有中间层,导致spi启动慢。
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-2-20
在线时间
10 小时
发表于 2017-3-16 17:35:34 | 显示全部楼层
lss1330 发表于 2017-3-16 17:16
用了系统,有中间层,导致spi启动慢。

谢谢楼主提醒,我把板子的时钟提高后效果就好了很多,但偶尔还会有数据断流(就是听起来少了一两个字这样),不知道为什么
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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