Forum: Mikrocontroller und Digitale Elektronik STM32MP1 SPI DMA und Double Buffer


von Wechmarer (Gast)


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);

von Wechmarer (Gast)


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
}

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.