OpenEdv-开源电子网

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

VS1053音频实验

[复制链接]

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2017-12-13 14:36:32 | 显示全部楼层 |阅读模式
原子的音乐播放器例程是用SD卡加FATS文件系统做的,我现在是把wav文件用XMODEM协议从串口助手下载到W25Q128里面去了,也没有用FATS,而是仿照例程,直接从W25Q128里面将wav数据按照4096字节读出来,然后用VS_Send_MusicData()函数发送给VS1053,但是并不能播放,没有声音。我看原子在别的贴里面回复说要发送音频文件头,这个文件头是要我自己组织发送,还是已经包含在.wav文件里面了呢?下面是我的音频播放函数。

int audio_play(uint8_t num)
{
        uint8_t         *databuf;
        uint8_t         temp,i;
        uint32_t         datacount,datasize;
       
        //分配一个缓冲区
        databuf=(uint8_t*)malloc(4096*sizeof(uint8_t));
        if(databuf==NULL) return -1;
       
        //检测是否写入音频文件(一个文件占用1M空间)
        W25QXX_Read(&temp,SOUNDSTART+num*16*0x10000,1);
        if(temp!=0xaa) return -2;
        //读出文件大小信息
        datasize=0;
        for(i=0;i<4;i++)
        {
                W25QXX_Read(&temp,SOUNDSTART+num*16*0x10000+i+1,1);
                datasize<<=8;
                datasize|=temp;
        }
        //重启播放
        VS_Restart_Play();
        //设置音量等信息
        VS_Set_All();
        //复位解码时间
        VS_Reset_DecodeTime();
        //设置VS1053高速发送数据
        VS_SPI_SpeedHigh();
        //开启功放
        VS_SPK_Set(1);
        //将文件按照4096字节大小复制到缓冲区中
        datacount=0;
        while(1)
        {
                //如果剩余文件超过4096字节,则复制4096字节的音频数据出来
                if((datasize-datacount)>=4096)
                {
                        memset(databuf,0,4096);
                        W25QXX_Read(databuf,SOUNDSTART+num*16*0x10000+5+datacount,4096);
                        datacount+=4096;
                        //播放音频数据流
                        for(i=0;i<128;i++)
                        {                       
                                VS_Send_MusicData(databuf+i*32);
                        }
                        continue;
                }
                else
                {
                        memset(databuf,0,4096);
                        W25QXX_Read(databuf,SOUNDSTART+num*16*0x10000+5+datacount,datasize-datacount);
                        datacount=datasize;
                        //发送最后一包音频文件
                        temp=(datasize-datacount)/32+1;
                        for(i=0;i<temp;i++) VS_Send_MusicData(databuf+i*32);
                        break;
                }
        }
       
        LED0=~LED0;
        //释放内存空间
        free(databuf);
        databuf=NULL;
       
        return 0;
}

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

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2017-12-15 09:17:50 | 显示全部楼层
哎呀,没人回复。昨天搞定啦,问题出在两遍正弦测试上。我就觉得很奇怪,明明是不同频率的两次测试,但是只听到了一次声音。第二次完全没用。感觉是第二次进入正弦测试的时候有问题。因为进入正弦测试必须按照先复位,后进入测试模式的流程。而原子的代码是退出第一次后没有进行复位,直接进入第二次。我把第二次测试去掉,然后硬复位加软复位,再调用audio_play就可以播放了。但是不知道为什么,中间老是有卡次的声音,像是4096字节数据用完了,再次读取中间发生了数据断流,这个怎么可以解决呀。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-24 05:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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