Forum: Mikrocontroller und Digitale Elektronik STM32H750 DMA und SAI2


von 542325 (Gast)


Lesenswert?

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?

von 542325 (Gast)


Lesenswert?

der Interrupt wird genau 1x ausgeführt

aber bei dem half ISR deaktiviert:
          /* Disable the half transfer interrupt if the DMA mode is not 
CIRCULAR */
          if((((DMA_Stream_TypeDef   *)hdma->Instance)->CR & 
DMA_SxCR_CIRC) == 0U)
          {
            /* Disable the half transfer interrupt */
            ((DMA_Stream_TypeDef   *)hdma->Instance)->CR  &= 
~(DMA_IT_HT);
          }


der witz daran ist das bei der ini das CIRCULAR bit gesetzt wurde !!

von Michael O. (michaelor)


Lesenswert?

Moin,

>
1
hsai_output.Init.OutputDrive     = SAI_OUTPUTDRIVE_DISABLE;

Das bewirkt, dass Du Takte erst dann hast, wenn Du das Device aktiviert 
hast, sprich das EN bit im SAI_xCR1 Register gesetzt hast. Dafür sollte 
es auch einen entsprechenden Aufruf in der HAL geben.

>Gibt es eine tabelle welcher DMAx_Stream_xx verwendet werden soll oder ist das 
wirklich egal?

Das ist egal. Die 16 Kanäle können frei belegt werden. Das dürfte die 
HAL auch entsprechend dynamisch verwalten, wenn ich mich recht erinnere.

Welchen Speicherbereich benutzt Du für die DMA? Die beiden 
DMA-Controller können nur auf Speicher in der Domain 2 zugreifen 
(0x24000000 - 0x24080000).

Gruß
Micha

von 542325 (Gast)


Lesenswert?

hi
danke für die Antwort

Habe es herausgefunden!!  -> eigener Bockmist !!
der DMA2 CLK wurde erst mit SAI2_B  aktiviert

damit war das Register der TX DMA quasi nicht gesetzt


bei dem STM32F7xx der vorher im einsatz war waren SAI A und B vertauscht
( B -Y TX   und A RX )

Speicherbereiche musste ich dennoch anpassen
Liegen nun in in der richtigen section
Der H7 ist da deutlich empfindlicher  gegenüber dem F7

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.