stm32 interrupt im callback deaktivieren gpio abfragen

OP Persönliche Seite #6232401
Lesenswert?
• ▲
▼
Hi

Ich (Anfänger) versuche gerade meinen ADAS1000 via SPI (HAL) zu 
überreden Daten zu streamen (an mein Blue Pill Board).

Der ADAS1000 hat einen DRDY PIN der mir anzeigt wenn Daten fertig zum 
auslesen sind, dann schaltet der Pin auf LOW und bleibt solange LOW bis 
ich alle Daten ausgelesen habe und dann geht er wieder auf HIGH während 
er die nächsten Daten generiert...

Dann habe ich den DRDY Pin an PB1 gehangen und diesen als GPIOI_EXT1 
konfiguriert und ein Callback in main.c geschrieben. Der Interrupt löst 
auch brav und richtig aus.

Im Callback muss ich nun (solange DRDY noch LOW ist) weiter NOP's senden 
bis ich auf das HEADER WORD stoße (0x80000000) das mir anzeigt das die 
nächsten drei WORD's meine Daten sind.

Meine Frage ist nun, wie kann ich nun PB1 weiter abfragen ob es LOW 
bekommt wärend ich im Callback bin und PB1 ja als Interrupt konfiguriert 
ist?

Muss/kann ich dann PB1 im Callback wieder als GPIO-IN rekonfigurieren 
und dann einfach HAL_GPIO_READ abfragen und am ende wieder auf 
GPIOI_EXT1 zurückstellen?

Mein Callback sieht so aus:
1
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
2
{
3
  if(GPIO_Pin == DRDY_Pin)
4
  {
5
    // hier PB1 als GPIO-IN konfigurieren
6
    while(HAL_GPIO_ReadPin(DRDY_GPIO_Port, DRDY_Pin != GPIO_PIN_SET))  // solange LOW ist...
7
      {
8
  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET);
9
  HAL_SPI_TransmitReceive(&hspi1, NOP, rxBuffer, 4, timeOut);
10
  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_SET);
11
  if(rxBuffer[0] == 0x80)   //  ... nach 0x80 header suchen und ...
12
  {
13
                    // ...daten auswerten
14
  }
15
      }
16
    // hier PB1 als GPIOI_EXT1 konfigurieren
17
   }
18
   else
19
   {
20
     __NOP();
21
   }
22
}

Würde man das so machen oder ist das Blödsinn?
Angehängte Dateien:
Gast #6232498
Lesenswert?
• ▲
▼
Paul G. schrieb:
> Der ADAS1000 hat einen DRDY PIN der mir anzeigt wenn Daten fertig zum
> auslesen sind, dann schaltet der Pin auf LOW und bleibt solange LOW bis
> ich alle Daten ausgelesen habe und dann geht er wieder auf HIGH während
> er die nächsten Daten generiert...
> ...

> Im Callback muss ich nun (solange DRDY noch LOW ist) weiter NOP's senden
> bis ich auf das HEADER WORD stoße

Wieso mußt du NOP's senden? Soweit ich das aus deinen Worten sehe (ohne 
den ADAS... zu kennen), brauchst du ja bloß die anstehenden Daten zu 
lesen und in einen Ringpuffer zu stopfen, bis dein DRDY wieder auf High 
geht. Anschließend kannst du in aller Ruhe die Daten aus dem Ringpuffer 
durchsehen, was du davon haben willst.

Und wozu eine Callback-Funktion? Nur, um das HAL-Zeugs von ST zu 
benutzen? Wenn du es selber tust, dann weißt du wenigstens, was da im 
eigentlichen Interrupt passiert.

W.S.
OP Persönliche Seite #6232515
Lesenswert?
• ▲
▼
W.S. schrieb:
> Wieso mußt du NOP's senden?
1
"...When the configuration is complete, the user can begin reading frames by issuing a read command to the frame header register (see Table 54). The ADAS1000/ADAS1000-1/ADAS1000-2 continue to make frames available until another register address is written (read or write command). To continue reading frame data, continue to write all zeros on SDI, which is a write of the NOP register (Address 0x00). A frame is interrupted only when another read or write command is issued.
2
(Seite 55 Data Frames/Packets)

W.S. schrieb:
> Und wozu eine Callback-Funktion?

Weil ich gerade erst in das Thema eingestiegen bin und mir dachte, 
fängste erstma mit dem HAL zeug an und wenns nötig wird kannste ja 
tiefer eintauchen...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.