OpenEdv-开源电子网

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

阿波罗 STM32F7 MP3无法拨放问题

[复制链接]

4

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2020-11-4
在线时间
36 小时
发表于 2021-8-11 16:23:50 | 显示全部楼层 |阅读模式
5金钱
想询问一下各位大佬,移植综合实验的MP3,为何都无法拨放,反而wav就可以?这边有用仪器去测测过,
wav只要呼叫到SAIA_SampleRate_Set时序就会打出来,反观呼叫到SAIA_SampleRate_Set mp3时序就打不出来这是甚么原因造成的呢?




void SAIA_Init(u32 mode,u32 cpol,u32 datalen)
{

    HAL_SAI_DeInit(&SAI1A_Handler);                          //清除以前的配置
    SAI1A_Handler.Instance=SAI1_Block_A;                     //SAI1 Bock A
    SAI1A_Handler.Init.AudioMode=mode;                       //设置SAI1工作模式
    SAI1A_Handler.Init.Synchro=SAI_ASYNCHRONOUS;             //音频模块异步
    SAI1A_Handler.Init.OutputDrive=SAI_OUTPUTDRIVE_ENABLE;   //立即驱动音频模块输出
    SAI1A_Handler.Init.NoDivider=SAI_MASTERDIVIDER_ENABLE;   //使能主时钟分频器(MCKDIV)
    SAI1A_Handler.Init.FIFOThreshold=SAI_FIFOTHRESHOLD_1QF;  //设置FIFO阈值,1/4 FIFO
    SAI1A_Handler.Init.MonoStereoMode=SAI_STEREOMODE;        //立体声模式
    SAI1A_Handler.Init.Protocol=SAI_FREE_PROTOCOL;           //设置SAI1协议为:自由协议(支持I2S/LSB/MSB/TDM/PCM/DSP等协议)
    SAI1A_Handler.Init.DataSize=datalen;                     //设置数据大小
    SAI1A_Handler.Init.FirstBit=SAI_FIRSTBIT_MSB;            //数据MSB位优先
    SAI1A_Handler.Init.ClockStrobing=cpol;                   //数据在时钟的上升/下降沿选通

    //帧设置
    SAI1A_Handler.FrameInit.FrameLength=64;                  //设置帧长度为64,左通道32个SCK,右通道32个SCK.
    SAI1A_Handler.FrameInit.ActiveFrameLength=32;            //设置帧同步有效电平长度,在I2S模式下=1/2帧长.
    SAI1A_Handler.FrameInit.FSDefinition=SAI_FS_CHANNEL_IDENTIFICATION;//FS信号为SOF信号+通道识别信号
    SAI1A_Handler.FrameInit.FSPolarity=SAI_FS_ACTIVE_LOW;    //FS低电平有效(下降沿)
    SAI1A_Handler.FrameInit.FSOffset=SAI_FS_BEFOREFIRSTBIT;  //在slot0的第一位的前一位使能FS,以匹配飞利浦标准       

    //SLOT设置
    SAI1A_Handler.SlotInit.FirstBitOffset=0;                 //slot偏移(FBOFF)为0
    SAI1A_Handler.SlotInit.SlotSize=SAI_SLOTSIZE_32B;        //slot大小为32位
    SAI1A_Handler.SlotInit.SlotNumber=2;                     //slot数为2个   
    SAI1A_Handler.SlotInit.SlotActive=SAI_SLOTACTIVE_0|SAI_SLOTACTIVE_1;//使能slot0和slot1

    HAL_SAI_Init(&SAI1A_Handler);                            //初始化SAI
    __HAL_SAI_ENABLE(&SAI1A_Handler);                        //使能SAI


}
                WM8978_I2S_Cfg(2,0);        //飞利浦标准,16位数据长度
                SAIA_Init(0,1,4);                //设置SAI,主发送,16位数据
                SAIA_SampleRate_Set(mp3ctrl->samplerate);//设置采样率  
                SAIA_TX_DMA_Init(audiodev.saibuf1,audiodev.saibuf2,mp3ctrl->outsamples,1);//配置TX DMA
                sai_tx_callback=mp3_sai_dma_tx_callback;                //回调函数指向mp3_sai_dma_tx_callback
                mp3decoder=MP3InitDecoder();                                         //MP3解码申请内存
                res=f_open(audiodev.file,(char*)fname,FA_READ);        //打开文件

最佳答案

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

找到问题了 综合实验mp3_play_song 里的SAIA_Init(0,1,4); ,移植到 HAL库要改为SAIA_Init(0,1,4
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2020-11-4
在线时间
36 小时
 楼主| 发表于 2021-8-11 16:23:51 | 显示全部楼层
找到问题了 综合实验mp3_play_song 里的SAIA_Init(0,1,4);
,移植到 HAL库要改为SAIA_Init(0,1,4<<5); 或是SAIA_Init(0,1, SAI_DATASIZE_16);
时序就正常了,给想要移植综合实验MP3的人参考一下
回复

使用道具 举报

4

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2020-11-4
在线时间
36 小时
 楼主| 发表于 2021-8-11 16:30:40 | 显示全部楼层
补充
const u16 SAI_PSC_TBL[][5]=
{
        {800 ,344,7,0,12},        //8Khz采样率
        {1102,429,2,18,2},        //11.025Khz采样率
        {1600,344,7, 0,6},        //16Khz采样率
        {2205,429,2,18,1},        //22.05Khz采样率
        {3200,344,7, 0,3},        //32Khz采样率
        {4410,429,2,18,0},        //44.1Khz采样率
        {4800,344,7, 0,2},        //48Khz采样率
        {8820,271,2, 2,1},        //88.2Khz采样率
        {9600,344,7, 0,1},        //96Khz采样率
        {17640,271,6,0,0},        //176.4Khz采样率
        {19200,295,6,0,0},        //192Khz采样率   
   
};

u8 SAIA_SampleRate_Set(u32 samplerate)
{   
   
    u8 i=0;   
    RCC_PeriphCLKInitTypeDef RCCSAI1_Sture;  
    Debug_samplerate = samplerate;
          for(i=0;i<(sizeof(SAI_PSC_TBL)/10);i++)//看看改采样率是否可以支持
          {
                if((samplerate/10)==SAI_PSC_TBL[i][0])break;
          }
    if(i==(sizeof(SAI_PSC_TBL)/10))return 1;//搜遍了也找不到
    RCCSAI1_Sture.PeriphClockSelection=RCC_PERIPHCLK_SAI1;      //外设时钟源选择
    RCCSAI1_Sture.Sai1ClockSelection=RCC_SAI1CLKSOURCE_PLLSAI;  
    RCCSAI1_Sture.PLLSAI.PLLSAIN=(u32)SAI_PSC_TBL[i][1];        //设置PLLSAIN
    RCCSAI1_Sture.PLLSAI.PLLSAIQ=(u32)SAI_PSC_TBL[i][2];        //设置PLLSAIQ
    RCCSAI1_Sture.PLLSAIDivQ=SAI_PSC_TBL[i][3];                 //设置PLLSAIDivQ   
    HAL_RCCEx_PeriphCLKConfig(&RCCSAI1_Sture);                  //设置时钟
   
    __HAL_SAI_DISABLE(&SAI1A_Handler);                          //关闭SAI
    SAI1A_Handler.Init.AudioFrequency=samplerate;               //设置播放频率  
    HAL_SAI_Init(&SAI1A_Handler);                               //初始化SAI
    SAIA_DMA_Enable();                                          //开启SAI的DMA功能
    __HAL_SAI_ENABLE(&SAI1A_Handler);                           //开启SAI
    return 0;
   
   
}
回复

使用道具 举报

4

主题

881

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4198
金钱
4198
注册时间
2019-9-4
在线时间
881 小时
发表于 2021-8-11 17:17:17 | 显示全部楼层
帮顶   
回复

使用道具 举报

4

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2020-11-4
在线时间
36 小时
 楼主| 发表于 2021-8-12 09:23:21 | 显示全部楼层
我顶,有人有遇过类似问题么?
回复

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2021-8-12 09:50:31 | 显示全部楼层
帮顶  
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2021-5-29
在线时间
51 小时
发表于 2022-3-17 09:21:03 | 显示全部楼层
遇到一样的问题了,顺利解决,感谢
回复

使用道具 举报

9

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2019-12-6
在线时间
149 小时
发表于 2024-4-29 23:26:14 | 显示全部楼层
跪谢大佬 终于移植成功了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 15:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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