hpdell 发表于 2018-1-2 23:02:43

请教下,关于sai接口的 i2s 采样率设置 ??

本帖最后由 hpdell 于 2018-1-3 19:38 编辑

现在想把 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)); i++)      {                if(AudioFreq == g_tPLLI2SPSC.Fs)                {      freqindex = i;                        break;                }            }
HAL_RCCEx_GetPeriphCLKConfig(&RCCSAI1_Sture);
if(freqindex != 0xff){    #if0   // 使用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;}

hpdell 发表于 2018-1-3 16:26:34

本帖最后由 hpdell 于 2018-1-3 19:37 编辑

终于找到原因了,原来是这个地方搞错了

貌似这样设置就对了
    RCCSAI1_Sture.PeriphClockSelection = RCC_PERIPHCLK_SAI1;      //外设时钟源选择
    RCCSAI1_Sture.Sai1ClockSelection   = RCC_SAI1CLKSOURCE_PLLI2S;// 选择 i2s 作为 sai的时钟源   

    RCCSAI1_Sture.PLLI2S.PLLI2SP       = 0;// RCC_PLLP_DIV2;// 适用于 SPDIFRX 时钟的 PLLI2S 分频系数 (PLLI2S division factor for SPDIFRX clock)
                                             //所以此处设置为0即可
    RCCSAI1_Sture.PLLI2S.PLLI2SN       = g_tPLLI2SPSC.PLLI2S_N;
    RCCSAI1_Sture.PLLI2S.PLLI2SQ       = g_tPLLI2SPSC.PLLI2S_Q;
    RCCSAI1_Sture.PLLI2SDivQ         = g_tPLLI2SPSC.PLLI2S_DivQ;

    HAL_RCCEx_PeriphCLKConfig(&RCCSAI1_Sture);
页: [1]
查看完整版本: 请教下,关于sai接口的 i2s 采样率设置 ??