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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren