@@ -89,8 +89,11 @@ static uint8_t get_mck_div(uint32_t frequency)
8989{
9090 switch (frequency ){
9191 case AUDIO_FREQUENCY_8K : return 48 ; //SCK_x = sai_x_ker_ck/48 = 1024KHz Ffs = SCK_x/64 = 16KHz stereo
92+ case AUDIO_FREQUENCY_11K : return 8 ; //SCK_x = sai_x_ker_ck/8 = 1411KHz Ffs = SCK_x/64 = 22KHz stereo
9293 case AUDIO_FREQUENCY_16K : return 24 ; //SCK_x = sai_x_ker_ck/24 = 2048KHz Ffs = SCK_x/64 = 32KHz stereo
94+ case AUDIO_FREQUENCY_22K : return 4 ; //SCK_x = sai_x_ker_ck/4 = 2822KHz Ffs = SCK_x/64 = 44KHz stereo
9395 case AUDIO_FREQUENCY_32K : return 12 ; //SCK_x = sai_x_ker_ck/12 = 4096KHz Ffs = SCK_x/64 = 64KHz stereo
96+ case AUDIO_FREQUENCY_44K : return 2 ; //SCK_x = sai_x_ker_ck/2 = 5644KHz Ffs = SCK_x/64 = 88KHz stereo
9497 case AUDIO_FREQUENCY_48K : return 8 ; //SCK_x = sai_x_ker_ck/8 = 6144KHz Ffs = SCK_x/64 = 96KHz stereo
9598 case AUDIO_FREQUENCY_64K : return 6 ; //SCK_x = sai_x_ker_ck/6 = 8192KHz Ffs = SCK_x/64 = 128KHz stereo
9699 case AUDIO_FREQUENCY_96K : return 4 ; //SCK_x = sai_x_ker_ck/4 = 12288KHz Ffs = SCK_x/64 = 192KHz stereo
@@ -141,26 +144,45 @@ int py_audio_init(size_t channels, uint32_t frequency, int gain_db, float highpa
141144
142145 HAL_RCCEx_GetPeriphCLKConfig (& rcc_ex_clk_init_struct );
143146
144- /* SAI clock config:
145- PLL2_VCO Input = HSE_VALUE/PLL2M = 1 Mhz
146- PLL2_VCO Output = PLL2_VCO Input * PLL2N = 344 Mhz
147- sai_x_ker_ck = PLL2_VCO Output/PLL2P = 344/7 = 49.142 Mhz */
148- rcc_ex_clk_init_struct .PeriphClockSelection = RCC_PERIPHCLK_SAI4A ;
149- rcc_ex_clk_init_struct .Sai4AClockSelection = RCC_SAI4ACLKSOURCE_PLL2 ;
150- rcc_ex_clk_init_struct .PLL2 .PLL2P = 7 ;
151- rcc_ex_clk_init_struct .PLL2 .PLL2Q = 1 ;
152- rcc_ex_clk_init_struct .PLL2 .PLL2R = 1 ;
153- rcc_ex_clk_init_struct .PLL2 .PLL2N = 344 ;
154- rcc_ex_clk_init_struct .PLL2 .PLL2M = isBoardRev2 () ? 25 : 27 ;
147+ if ((frequency == AUDIO_FREQUENCY_11K ) || (frequency == AUDIO_FREQUENCY_22K ) || (frequency == AUDIO_FREQUENCY_44K ))
148+ {
149+ /* SAI clock config:
150+ PLL2_VCO Input = HSE_VALUE/PLL2M = 1 Mhz
151+ PLL2_VCO Output = PLL2_VCO Input * PLL2N = 429 Mhz
152+ SAI_CLK_x = PLL2_VCO Output/PLL2P = 429/38 = 11.289 Mhz */
153+ rcc_ex_clk_init_struct .PeriphClockSelection = RCC_PERIPHCLK_SAI4A ;
154+ rcc_ex_clk_init_struct .Sai4AClockSelection = RCC_SAI4ACLKSOURCE_PLL2 ;
155+ rcc_ex_clk_init_struct .PLL2 .PLL2P = 38 ;
156+ rcc_ex_clk_init_struct .PLL2 .PLL2Q = 1 ;
157+ rcc_ex_clk_init_struct .PLL2 .PLL2R = 1 ;
158+ rcc_ex_clk_init_struct .PLL2 .PLL2N = 429 ;
159+ rcc_ex_clk_init_struct .PLL2 .PLL2M = isBoardRev2 () ? 25 : 27 ;
160+
161+ } else {
162+ /* SAI clock config:
163+ PLL2_VCO Input = HSE_VALUE/PLL2M = 1 Mhz
164+ PLL2_VCO Output = PLL2_VCO Input * PLL2N = 344 Mhz
165+ sai_x_ker_ck = PLL2_VCO Output/PLL2P = 344/7 = 49.142 Mhz */
166+ rcc_ex_clk_init_struct .PeriphClockSelection = RCC_PERIPHCLK_SAI4A ;
167+ rcc_ex_clk_init_struct .Sai4AClockSelection = RCC_SAI4ACLKSOURCE_PLL2 ;
168+ rcc_ex_clk_init_struct .PLL2 .PLL2P = 7 ;
169+ rcc_ex_clk_init_struct .PLL2 .PLL2Q = 1 ;
170+ rcc_ex_clk_init_struct .PLL2 .PLL2R = 1 ;
171+ rcc_ex_clk_init_struct .PLL2 .PLL2N = 344 ;
172+ rcc_ex_clk_init_struct .PLL2 .PLL2M = isBoardRev2 () ? 25 : 27 ;
173+ }
155174
156175 HAL_RCCEx_PeriphCLKConfig (& rcc_ex_clk_init_struct );
157176
158177 sai_init ();
159178
160179 // Sanity checks
161180 if ((frequency != AUDIO_FREQUENCY_8K ) &&
181+ (frequency != AUDIO_FREQUENCY_11K ) &&
162182 (frequency != AUDIO_FREQUENCY_16K ) &&
183+ (frequency != AUDIO_FREQUENCY_22K ) &&
163184 (frequency != AUDIO_FREQUENCY_32K ) &&
185+ (frequency != AUDIO_FREQUENCY_44K ) &&
164186 (frequency != AUDIO_FREQUENCY_48K ) &&
165187 (frequency != AUDIO_FREQUENCY_64K ) &&
166188 (frequency != AUDIO_FREQUENCY_96K )){
0 commit comments