本帖最后由 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[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; } |
终于找到原因了,原来是这个地方搞错了
貌似这样设置就对了
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);
评分
查看全部评分