Forum: Mikrocontroller und Digitale Elektronik LPC1758: Wie SSP über Interrupt


von Thomas Haslinger (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:

Ich benutze die beiden SSP Schnittstellen des LPC1758 um Messwerte von 8 
AD-Wandlern abzufragen.
Momentan mache ich das über Pollen, d.h. ich schreibe 3 Bytes an das SSP 
FIFO und warte, bis das Statusbit gesetzt is, das der FIFO leer ist.
Dann lese ich die 3 Empfangenen Bytes, lösche die CS-Leitung des ersten 
AD-Wandlers, setzt die CS-Leitung des nächsten AD-Wandlers und 
wiederhole das.

In den ganzen Wartezeiten wo ich warte bis die Bytes gesendet wurden, 
kann ich den µC nicht anderweitig nutzen, deswegen wollte ich das SSP 
senden über Interrupts machen.
D.h. ich sende 3 Bytes an den FIFO und wenn sie gesendet wurden, 
bräuchte ich eine Interrupt um die CS-Leitungen anders zu setzen und die 
nächsten Bytes zu senden.

Nun gibt es aber leider keinen solchen Interrupt der mir sagt, das das 
FIFO leer ist, sondern nur die folgendne:
-TX FIFO mindestens halb leer
-RX FIFO mindestens halb voll
-RX FIFO nicht leer und mindestens eine Timeout Zeit lang nicht gelesen
Leider ist die Timeout Zeit viel zu lange für mich...

Irgenjemand eine Idee? Die ganze Anwendung ist halt ziemlich 
zeitkritisch

von Turbo J (Gast)


Lesenswert?

Da kann man sich wohl nur mit dem DMA-Controller behelfen (GPDMA).
Einfach einen Kanal auf SSP Empfang von 3 Bytes programmieren und dann 
die 3 Bytes in den Sende-FIFO schreiben. Der entsprechende DMA-Interrupt 
wird ausgelöst, wenn die 3 Bytes angekomment sind - dann ist die 
Transaktion abgeschlossen. Nur ein Würgaround, ja, müsste aber so tun.

von Johannes V. (johannes_v)


Lesenswert?

Du könntest wenn du dich mit dem DMA nicht auseinandersetzen willst auch 
einfach einen Timer intterupt nehmen.

Angestoßen wird das ganze von einer externen Funktion die einfach nur 
die Timer Match Register enstsprechend konfiguriert und die ersten 3 
Byte in den SSP TX FIFO schreibt.
Die ISR leert dann den TX FIFO (schreibt die Daten an eine bekannte 
Position), schaltet (je nach zuvor gewähltem CS) den CS um, und schreibt 
die nächsten 3 Byte. Am Ende noch den Timer reseten oder das 
Matchregister auf einen höheren Wert justieren, fertig.

Deinem Hauptprogramm stehen jederzeit aktuelle Messswerte zur Verfügung 
"ohne" sie besorgen zu müssen ;)

Du musst natürlich dafür sorgen, dass kein anderer Prozess auf dieses 
SSP device zugreifen will oder irgendwelche zusätzlichen CS Leitungnen 
pulled, aber das ist ja wohl keine Schwierigkeit.

Einfach den Timer stoppen, das Busy bit Polen bis etwaige Übertragungen 
beendet sind, die Out-of-order SSP Abfrage synchron durchführen und 
danach die ISR steuerung wieder herstellen.

Evtl. noch eine Art Mutex pro Speicherzelle. Wenn die ISR merkt das 
gerade in dem Moment wo sie aufgerufen wird der neue Wert gelesen wird, 
dann wird dieser einfach verworfen. Oder einfach kurz interrupts 
abschalten wenn lesend auf die Messwerte zugegriffen wird, sollte noch 
einfacher sein.
Ein einziger Befehl in Assembler..

mfg

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.