@@ -89,8 +89,11 @@ static uint8_t get_mck_div(uint32_t frequency)
89
89
{
90
90
switch (frequency ){
91
91
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
92
93
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
93
95
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
94
97
case AUDIO_FREQUENCY_48K : return 8 ; //SCK_x = sai_x_ker_ck/8 = 6144KHz Ffs = SCK_x/64 = 96KHz stereo
95
98
case AUDIO_FREQUENCY_64K : return 6 ; //SCK_x = sai_x_ker_ck/6 = 8192KHz Ffs = SCK_x/64 = 128KHz stereo
96
99
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
141
144
142
145
HAL_RCCEx_GetPeriphCLKConfig (& rcc_ex_clk_init_struct );
143
146
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
+ }
155
174
156
175
HAL_RCCEx_PeriphCLKConfig (& rcc_ex_clk_init_struct );
157
176
158
177
sai_init ();
159
178
160
179
// Sanity checks
161
180
if ((frequency != AUDIO_FREQUENCY_8K ) &&
181
+ (frequency != AUDIO_FREQUENCY_11K ) &&
162
182
(frequency != AUDIO_FREQUENCY_16K ) &&
183
+ (frequency != AUDIO_FREQUENCY_22K ) &&
163
184
(frequency != AUDIO_FREQUENCY_32K ) &&
185
+ (frequency != AUDIO_FREQUENCY_44K ) &&
164
186
(frequency != AUDIO_FREQUENCY_48K ) &&
165
187
(frequency != AUDIO_FREQUENCY_64K ) &&
166
188
(frequency != AUDIO_FREQUENCY_96K )){
0 commit comments