Forum: Mikrocontroller und Digitale Elektronik HAL_SPI_Transmit_DMA ruft callback nicht


von Wechmarer (Gast)


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
}

von Εrnst B. (ernst)


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

von Wechmarer (Gast)


Lesenswert?

Ja, das ist alles so aktiviert.

von Εrnst B. (ernst)


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

von Wechmarer (Gast)


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

von Tobias H. (tobias_h747)


Lesenswert?

Zur Vollständigkeit, obwohl der Thread schon älter ist. Das geht 
mittlerweile im CubeMX:

STM32CubeMX Project Manager > Advanced Settings > Register Callback

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.