HAL_SPI_Transmit_DMA ruft callback nicht

Gast #7011016
Ich versuche, per HAL_SPI_Transmit_DMA Daten zu versenden. Das klappt 
1x, aber am Ende wird der registrierte Callback nicht aufgerufen.
Ich habe eine j-link dran und sehe, daß wTransferState sich nicht 
ändert.
CPU ist STM32MP157. Ich bin auf dem M4. Der SPI ist dem M4 zugewiesen.
1
enum {
2
  TRANSFER_WAIT,
3
  TRANSFER_COMPLETE,
4
  TRANSFER_ERROR
5
};
6

7
while (1)
8
{
9
  wTransferState = TRANSFER_WAIT;
10
  if(HAL_SPI_Transmit_DMA(&hspi2, (uint8_t*)aTxBuffer, BUFFER_SIZE) != HAL_OK)
11
  {
12
    Error_Handler();
13
  }
14
  unsigned long counter = 0;
15
  while (wTransferState == TRANSFER_WAIT)
16
  {
17
    ++counter;
18
  }
19
}
20

21
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
22
{
23
  wTransferState = TRANSFER_COMPLETE;
24
}
Hast du den IRQ-Handler verlinkt?
1
 SPI_HandleTypeDef spiHal;
2

3
extern "C" void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef* hspi);
4
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef* hspi) {
5
 if (hspi == &spiHal) {
6
...
7
 }
8
}
9
extern "C" void SPI1_IRQHandler();
10
void SPI1_IRQHandler(void) {
11
    HAL_SPI_IRQHandler(&spiHal);
12
}
13

14

15
... und den IRQ anschalten:
16
 HAL_NVIC_EnableIRQ(SPI1_IRQn);
Wechmarer schrieb:
> Ja, das ist alles so aktiviert.

Hmmm... dann zweite Option:

ist bei dir ein #define "USE_HAL_SPI_REGISTER_CALLBACKS" vorhanden?

Wenn ja, dann kriegst du den Callback nicht als überschriebene 
"WEAK"-Funktion, sondern musst einen Funktionspointer in deiner 
SPI_HandleTypeDef registrieren.

--> HAL_SPI_RegisterCallback

ist eigentlich auch die elegantere Lösung
Gast
Ja, danke das war's. Ich weiß noch nicht, warum genau die Callbacks 
nicht als 'weak' generiert werden. Die anderen Callbacks sind nicht 
markiert.
1
#define USE_HAL_ADC_REGISTER_CALLBACKS    0u
2
#define USE_HAL_CEC_REGISTER_CALLBACKS    0u
3
#define USE_HAL_DAC_REGISTER_CALLBACKS    0u
4
#define USE_HAL_I2C_REGISTER_CALLBACKS    0u
5
#define USE_HAL_RNG_REGISTER_CALLBACKS    0u
6
#define USE_HAL_SPI_REGISTER_CALLBACKS    1u
7
#define USE_HAL_UART_REGISTER_CALLBACKS   0u
8
#define USE_HAL_USART_REGISTER_CALLBACKS  0u
9
#define USE_HAL_WWDG_REGISTER_CALLBACKS   0u

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.