407播放mp3, 播放节奏至少慢一半,声音低沉,女音变超低沉男音

2019-12-11 18:18发布

如题, 板子25M外部晶振,DSP用的是nxp的tef6635, 没用mck输出, 44.1k, 无论是音乐是64kbps还是128k, 320k效果一样,个人觉得不是解码速度慢的问题。
整体用的是原子的例程,没跑系统, 很多内存申请用的是外部ram.
请教各位高手可能是什么原因?

谢谢


const u16 I2S_PSC_TBL[][5]=
{
  // fs/10, PLLI2SN,  PLLI2SR,  I2SDIV,  ODD
  
        {800 ,  192,         2,           187,       1},                //8Khz²ÉÑùÂÊ
        {1600, 192,         3,            62,        1},                //16Khz²ÉÑùÂÊ
        {2205, 290,         3,            68,        1},                //22.05Khz²ÉÑùÂÊ
        {3200, 256,         2,            62,        1},                //32Khz²ÉÑùÂÊ
        {4410, 302,         2,            53,        1},                //44.1Khz²ÉÑùÂÊ
        {4800, 192,         5,            12,        1},                //48Khz²ÉÑùÂÊ
        {9600, 384,         5,            12,        1},          //96Khz²ÉÑùÂÊ
        {19200,424,        3,             11,       1},          //192Khz²ÉÑùÂÊ
}

u8 I2S2_SampleRate_Set(u32 samplerate)
{
        u8 i=0;
        u32 tempreg=0;
        samplerate/=10;//ËõС10±¶   
       
        for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//¿´¿´¸Ä²ÉÑùÂÊÊÇ·ñ¿ÉÒÔÖ§³Ö
        {
                if(samplerate==I2S_PSC_TBL[i][0])break;
        }

        RCC_PLLI2SCmd(DISABLE);//ÏȹرÕPLLI2S
        if(i==(sizeof(I2S_PSC_TBL)/10))return 1;//ËѱéÁËÒ²ÕÒ²»µ½
        RCC_PLLI2SConfig((u32)I2S_PSC_TBL[i][1],(u32)I2S_PSC_TBL[i][2]);//ÉèÖÃI2SxCLKµÄƵÂÊ(x=2)  ÉèÖÃPLLI2SN PLLI2SR

        RCC->CR|=1<<26;                                        //¿ªÆôI2SʱÖÓ
        while((RCC->CR&1<<27)==0);                //µÈ´ýI2SʱÖÓ¿ªÆô³É¹¦.
        tempreg=I2S_PSC_TBL[i][3]<<0;        //ÉèÖÃI2SDIV
        tempreg|=I2S_PSC_TBL[i][3]<<8;        //ÉèÖÃODDλ
        tempreg|=0<<9;                                        //ʹÄÜMCKOEλ,Êä³öMCK
        SPI2->I2SPR=tempreg;                        //ÉèÖÃI2SPR¼Ä´æÆ÷
        return 0;
}

I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_16bextended); // 这里用I2S_DataFormat_16b的话播放就会始终有断音。
I2S2_TX_DMA_Init(p1->i2sbuf1, p1->i2sbuf2,mp3ctrl->outsamples, TRUE);//ÅäÖÃTX DMA

void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num, BOOL DoubleBuffer_Flag)
{  
        NVIC_InitTypeDef   NVIC_InitStructure;
        DMA_InitTypeDef  DMA_InitStructure;
       

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ʱÖÓʹÄÜ
       
  DMA_DeInit(DMA1_Stream4);
  
  while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){}//µÈ´ýDMA1_Stream1¿ÉÅäÖÃ
               
  /* ÅäÖÃ DMA Stream */

  DMA_InitStructure.DMA_Channel = DMA_Channel_0;  //ͨµÀ0 SPI2_TXͨµÀ
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;//ÍâÉèµØַΪ:(u32)&SPI2->DR
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;//DMA ´æ´¢Æ÷0µØÖ·
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//´æ´¢Æ÷µ½ÍâÉèģʽ
  DMA_InitStructure.DMA_BufferSize = num;//Êý¾Ý´«ÊäÁ¿
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉè·ÇÔöÁ¿Ä£Ê½
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//´æ´¢Æ÷ÔöÁ¿Ä£Ê½
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//ÍâÉèÊý¾Ý³¤¶È:16λ
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//´æ´¢Æ÷Êý¾Ý³¤¶È£º16λ
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ʹÓÃÑ­»·Ä£Ê½
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//¸ßÓÅÏȼ¶
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //²»Ê¹ÓÃFIFOģʽ        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//ÍâÉèÍ»·¢µ¥´Î´«Êä
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//´æ´¢Æ÷Í»·¢µ¥´Î´«Êä
  DMA_Init(DMA1_Stream4, &DMA_InitStructure);//³õʼ»¯DMA Stream

  if(DoubleBuffer_Flag)
          {
         DMA_DoubleBufferModeConfig(DMA1_Stream4,(u32)buf1,DMA_Memory_0);//Ë«»º³åģʽÅäÖÃ

         DMA_DoubleBufferModeCmd(DMA1_Stream4,ENABLE);//Ë«»º³åģʽ¿ªÆô
          }

  DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);//¿ªÆô´«ÊäÍê³ÉÖжÏ
       
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//ÇÀÕ¼ÓÅÏȼ¶0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//×ÓÓÅÏȼ¶0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ
  NVIC_Init(&NVIC_InitStructure);//ÅäÖÃ
  
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
leonliu_1128
1楼-- · 2019-12-12 23:18
qq854149876 发表于 2017-10-19 09:56
你这种女声变男生的根本原因就是采样率变低了,你可以用示波器测量407的I2S输出时钟速度。407解码mp3资源 ...

手册上写
音频频率精度(针对PLLM VCO = 1 MHz 或2 MHz)-- 是25MHz, PLL_M=25
主时钟关闭 44100, 16位 {4410, 302,         2,            53,        1}, -->我的mck没连  tempreg|=0<<9;  SPI2->I2SPR=tempreg;       

FS= I2SxCLK / [(16*2)*((2*I2SDIV)+ODD))]= 151M/[32x(2x53+1)]=151M/3424=44100
I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR = 25M/25x 302/2=151M

看上去没错阿
等会接示波器看看
qq854149876
2楼-- · 2019-12-13 01:15
leonliu_1128 发表于 2017-10-19 10:20
手册上写
音频频率精度(针对PLLM VCO = 1 MHz 或2 MHz)-- 是25MHz, PLL_M=25
主时钟关闭 44100, 16位  ...

TIM截图20171019104433.png (37.37 KB, 下载次数: 0)

下载附件

2017-10-19 10:45 上传


PLL你这样试试吧
然后I2S也要配成44100
leonliu_1128
3楼-- · 2019-12-13 07:14
 精彩回答 2  元偷偷看……
leonliu_1128
4楼-- · 2019-12-13 08:36
示波器测了,I2S2_CK是1.41MHz, I2S2_WS是22.05kHz, 这是怎么回事啊?
leonliu_1128
5楼-- · 2019-12-13 14:06
现在是用I2S_DataFormat_16b, I2S2_WS是44.1kHz, 但声音播放速度正常, 感觉是快速的卡顿,所以听不太清楚, 隐约能听到女声.
之前用的是I2S_DataFormat_16bextended,  I2S2_WS是22.05kHz, 效果就是前面那种.
原子例程里用的是I2S_DataFormat_16bextended, 请问为什么会这样啊?
leonliu_1128
6楼-- · 2019-12-13 14:50
设成这样就好了
I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_32b);
I2S2_SampleRate_Set里选44.1k时16位的参数值。

谁知道为什么吗?

一周热门 更多>