本帖最后由 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;}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>