HAL_SPI_Transmit_DMA ruft callback nicht

Gast #7011016
Lesenswert?

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
}
#7011126
Lesenswert?

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);
#7018063
Lesenswert?

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 #7018215
Lesenswert?

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

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