STM32H750 DMA und SAI2

Gast #6849166
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?
Gast #6851396
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 !!
#6851915
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
Gast #6852187
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.