hi
Ich habe einen STM32H750 und veruche einen Codec am SAI2 zu betreiben
Leider bekomme ich keinen Takt und er startet auch nicht.
HAL_SAI_Transmit_DMA() bleibt intern im Timeout hängen schlägt
schließlich fehl.
Taktquelle ist PLL2
1 | PeriphClkInitStruct.PLL2.PLL2M = 4;
|
2 | PeriphClkInitStruct.PLL2.PLL2N = 30;
|
3 | PeriphClkInitStruct.PLL2.PLL2P = 39;
|
4 | PeriphClkInitStruct.PLL2.PLL2Q = 128;
|
5 | PeriphClkInitStruct.PLL2.PLL2R = 2;
|
6 | PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_3;
|
7 | PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
|
8 | PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
|
9 | PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SAI2
|
10 | PeriphClkInitStruct.Sai23ClockSelection = RCC_SAI23CLKSOURCE_PLL2;
|
1 | hsai_output.Instance = SAI2_Block_A;
|
2 | hsai_output.Init.AudioMode = SAI_MODEMASTER_TX;
|
3 | hsai_output.Init.Synchro = SAI_ASYNCHRONOUS;
|
4 | hsai_output.Init.MckOutput = SAI_MCK_OUTPUT_ENABLE;
|
5 | hsai_output.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;
|
6 | hsai_output.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE;
|
7 | hsai_output.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_FULL;
|
8 | hsai_output.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_8K;
|
9 | hsai_output.Init.SynchroExt = SAI_SYNCEXT_DISABLE;
|
10 | hsai_output.Init.MonoStereoMode = SAI_STEREOMODE;
|
11 | hsai_output.Init.CompandingMode = SAI_NOCOMPANDING;
|
12 | hsai_output.Init.TriState = SAI_OUTPUT_NOTRELEASED;
|
13 | if (HAL_SAI_InitProtocol(&hsai_output, SAI_I2S_STANDARD, SAI_PROTOCOL_DATASIZE_16BIT, 2) != HAL_OK){
|
14 | Error_Handler();
|
15 | }
|
16 |
|
17 | hsai_input.Instance = SAI2_Block_B;
|
18 | hsai_input.Init.AudioMode = SAI_MODESLAVE_RX;
|
19 | hsai_input.Init.Synchro = SAI_SYNCHRONOUS;
|
20 | hsai_input.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;
|
21 | hsai_output.Init.MckOutput = SAI_MCK_OUTPUT_DISABLE;
|
22 | hsai_output.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_FULL;
|
23 | hsai_output.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_8K;
|
24 | hsai_output.Init.SynchroExt = SAI_SYNCEXT_DISABLE;
|
25 | hsai_output.Init.MonoStereoMode = SAI_STEREOMODE;
|
26 | hsai_output.Init.CompandingMode = SAI_NOCOMPANDING;
|
27 | hsai_output.Init.TriState = SAI_OUTPUT_NOTRELEASED;
|
28 | if (HAL_SAI_InitProtocol(&hsai_input, SAI_I2S_STANDARD, SAI_PROTOCOL_DATASIZE_16BIT, 2) != HAL_OK){
|
29 | Error_Handler();
|
30 | }
|
31 | }
|
mir fehlt irgendwie die Tabelle welcher DMA stream interrupt für SAI
zuständig ist.
Die neuen H7 haben ja den DMAMUX
Cube verwendet daher immer :
1 | hdma_sai2_a.Instance = DMA1_Stream0;
|
2 | hdma_sai2_a.Init.Request = DMA_REQUEST_SAI2_A;
|
3 | hdma_sai2_a.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
4 |
|
5 | hdma_sai2_b.Instance = DMA1_Stream1;
|
6 | hdma_sai2_b.Init.Request = DMA_REQUEST_SAI2_B;
|
7 | hdma_sai2_b.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
Gibt es eine tabelle welcher DMAx_Stream_xx verwendet werden soll
oder ist das wirklich egal?