请教下,关于sai采样率设置 ??

2019-07-20 10:13发布

本帖最后由 hpdell 于 2018-1-2 23:23 编辑

现在想把 sai 的采样时钟改成 i2s 的,出现了采样率快慢的情况,如果全部都使用 sai 的时钟源,貌似比较正常,但是使用 i2s 的时钟源,出现了不同的采样率的快慢不一致的情况,出现这样的情况,除了目前程序设置的外,还需要设置哪些 ???????
u8 SAIA_SampleRate_Set(u32 AudioFreq){     u8 i=0;  RCC_PeriphCLKInitTypeDef RCCSAI1_Sture;  
  uint8_t freqindex = 0xFF;
        /* 这里采用列表的形式配置PLLI2S的时钟供SAI时钟使用 */        for(i = 0; i < (sizeof(g_tPLLI2SPSC)/sizeof(g_tPLLI2SPSC[0])); i++)        {                if(AudioFreq == g_tPLLI2SPSC.Fs)                {      freqindex = i;                        break;                }               }  
  HAL_RCCEx_GetPeriphCLKConfig(&RCCSAI1_Sture);
  if(freqindex != 0xff)  {    #if  0   // 使用sai   如果使用这个 SAI 作为时钟,貌似基本没有什么问题        /* Configure PLLSAI prescalers */
        RCCSAI1_Sture.PeriphClockSelection = RCC_PERIPHCLK_SAI1;          //外设时钟源选择        RCCSAI1_Sture.Sai1ClockSelection   = RCC_SAI1CLKSOURCE_PLLSAI;    // 选择 sai 作为 sai的时钟源        RCCSAI1_Sture.PLLSAI.PLLSAIP       = RCC_PLLP_DIV2;        RCCSAI1_Sture.PLLSAI.PLLSAIN       = (u32)g_tPLLI2SPSC.PLLI2S_N;        RCCSAI1_Sture.PLLSAI.PLLSAIQ       = (u32)g_tPLLI2SPSC.PLLI2S_Q;          RCCSAI1_Sture.PLLSAIDivQ           = g_tPLLI2SPSC.PLLI2S_DivQ;  
    #else   // 使用 i2s 作为时钟源 ,使用不同的采样率时,出现了播放速度快慢的情况,具体如下: ??????
        if( (AudioFreq == AUDIO_FREQUENCY_44K)            || (AudioFreq == AUDIO_FREQUENCY_11K)            )        {
          /* Configure PLLSAI prescalers */        
          RCCSAI1_Sture.PeriphClockSelection = RCC_PERIPHCLK_SAI1;  // 采样率为44K时,需要选择这个时钟源          RCCSAI1_Sture.Sai1ClockSelection   = RCC_SAI1CLKSOURCE_PLLI2S;        // 选择 i2s 作为 sai的时钟源          RCCSAI1_Sture.PLLI2S.PLLI2SP       = RCC_PLLP_DIV2;        RCCSAI1_Sture.PLLI2S.PLLI2SN       = g_tPLLI2SPSC.PLLI2S_N;        RCCSAI1_Sture.PLLI2S.PLLI2SR       = g_tPLLI2SPSC.PLLI2S_Q;          RCCSAI1_Sture.PLLI2SDivQ           = g_tPLLI2SPSC.PLLI2S_DivQ;
        }        else if((AudioFreq == AUDIO_FREQUENCY_48K)                || (AudioFreq == AUDIO_FREQUENCY_96K)                || (AudioFreq == AUDIO_FREQUENCY_22K)                  || (AudioFreq == AUDIO_FREQUENCY_16K)                    || (AudioFreq == AUDIO_FREQUENCY_8K)                      )        {          /* AUDIO_FREQUENCY_8K, AUDIO_FREQUENCY_16K, AUDIO_FREQUENCY_22K, AUDIO_FREQUENCY_48K), AUDIO_FREQUENCY_96K */
          RCCSAI1_Sture.PeriphClockSelection = RCC_PERIPHCLK_I2S;   // 采样率为48K/96K/22K时,需要选择这个时钟源,而且这个时钟源,貌似只有48K/96K的采样率是非常好的,                                                                                                        // 其他的采样率速度都貌似有点快 ????????? 我这样设置,是不是还有其他地方需要更改啊 ???
          RCCSAI1_Sture.Sai1ClockSelection   = RCC_SAI1CLKSOURCE_PLLI2S;        // 选择 i2s 作为 sai的时钟源          RCCSAI1_Sture.PLLI2S.PLLI2SP       = RCC_PLLP_DIV2;        RCCSAI1_Sture.PLLI2S.PLLI2SN       = g_tPLLI2SPSC.PLLI2S_N;        RCCSAI1_Sture.PLLI2S.PLLI2SR       = g_tPLLI2SPSC.PLLI2S_Q;          RCCSAI1_Sture.PLLI2SDivQ           = g_tPLLI2SPSC.PLLI2S_DivQ;                 }    #endif
    HAL_RCCEx_PeriphCLKConfig(&RCCSAI1_Sture);  }

          /* 等待就绪 */HAL_Delay(5);
  return 0;}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。