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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.