STM32MP1 SPI DMA und Double Buffer

Gast #7020464
Lesenswert?
• ▲
▼
Ich möchte mit HAL_SPI_Transmit_DMA Daten über SPI ausgeben.
Ich habe die beiden Callbacks HAL_SPI_TxCpltCallback und 
HAL_SPI_TxHalfCpltCallback registriert.
1
HAL_SPI_Transmit_DMA(&hspi2, (uint8_t*)txBuffer, BUFFER_SIZE)
gebe ich eine Puffer mit.

Im Callback schreibe ich jeweils eine Hälfte des Puffers, aber laut 
Logic Analyser ist das Ergebnis nicht richtig. Anhand der GPIOs und mit 
dem Debugger kann ich sehen, daß HAL_SPI_TxHalfCpltCallback aufgerufen 
wird, aber zwischen zwei Aufrufen werden alle Bytes ausgeben.
Ich habe vermutet, daß nur eine Hälfte des Puffers ausgegeben wird und 
ich in dieser Zeit auf die andere Hälfte schreiben kann.
Wie gebe ich den 2. Puffer an?
1
void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi)
2
{
3
  static const uint32_t BUFFER_HALF = BUFFER_SIZE / 2;
4
  static value = 0;
5
  HAL_GPIO_WritePin(M4_PD8_GPIO_Port, M4_PD8_Pin, GPIO_PIN_SET);
6
  if (txBufferHalf == 0) {
7
    for (unsigned int i = 0; i < BUFFER_HALF; ++i) {
8
        txBuffer[i] = value;
9
    }
10
    HAL_GPIO_WritePin(M4_PB11_GPIO_Port, M4_PB11_Pin, GPIO_PIN_SET);
11
    txBufferHalf = 1;
12
  }
13
  else
14
  {
15
    for (unsigned int i = BUFFER_HALF; i < BUFFER; ++i) {
16
        txBuffer[i] = value + 100;
17
    }
18
    HAL_GPIO_WritePin(M4_PB11_GPIO_Port, M4_PB11_Pin, GPIO_PIN_RESET);
19
    txBufferHalf = 0;
20
  }
21
  HAL_GPIO_WritePin(M4_PD8_GPIO_Port, M4_PD8_Pin, GPIO_PIN_RESET);
Gast #7020537
Lesenswert?
• ▲
▼
Ich habe die Lösung gefunden. Ich hatte angenommen, daß pro 
Transferhälte immer HAL_SPI_TxHalfCpltCallback aufgerufen wird.
Aber es wird HAL_SPI_TxHalfCpltCallback nach der ersten Hälfte und 
HAL_SPI_TxCpltCallback nach der zweiten Hälfte aufgerufen

So sieht's dann aus:
1
void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi)
2
{
3
  HAL_GPIO_WritePin(M4_PD8_GPIO_Port, M4_PD8_Pin, GPIO_PIN_SET);
4
  int value = 0;
5
  for (unsigned int i = 0; i < BUFFER_SIZE / 2; ++i) {
6
      txBuffer[i] = ++value;
7
  }
8
  HAL_GPIO_WritePin(M4_PB11_GPIO_Port, M4_PB11_Pin, GPIO_PIN_SET);
9
  HAL_GPIO_WritePin(M4_PD8_GPIO_Port, M4_PD8_Pin, GPIO_PIN_RESET);
10
}
11
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
12
{
13
  HAL_GPIO_WritePin(M4_PD8_GPIO_Port, M4_PD8_Pin, GPIO_PIN_SET);
14
  int value = 100;
15
  for (unsigned int i = BUFFER_SIZE / 2; i < BUFFER_SIZE; ++i) {
16
      txBuffer[i] = ++value;
17
  }
18
  HAL_GPIO_WritePin(M4_PB11_GPIO_Port, M4_PB11_Pin, GPIO_PIN_RESET);
19
  HAL_GPIO_WritePin(M4_PD8_GPIO_Port, M4_PD8_Pin, GPIO_PIN_RESET);
20

21
}

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.