OpenEdv-开源电子网

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

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

[复制链接]

260

主题

809

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1896
金钱
1896
注册时间
2012-10-28
在线时间
357 小时
发表于 2018-1-2 23:00:53 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 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;
}

最佳答案

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

貌似这样设置就对了 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) ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

260

主题

809

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1896
金钱
1896
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2018-1-2 23:00:54 | 显示全部楼层
正点原子 发表于 2018-1-3 01:26
根据参考手册,分频关系,去分析问题,这种应该是你配置的问题。

    貌似这样设置就对了

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.PLLI2S.PLLI2SR       = 4;   // 固定为 4,此项可以不用设置
    RCCSAI1_Sture.PLLI2SDivQ           = g_tPLLI2SPSC.PLLI2S_DivQ;
   
    HAL_RCCEx_PeriphCLKConfig(&RCCSAI1_Sture);
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-1-3 01:26:58 | 显示全部楼层
根据参考手册,分频关系,去分析问题,这种应该是你配置的问题。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 20:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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