Hallo zusammen, ich versuche bei meinem STR912FA die Interupts zu verwenden, leider ohne Erfolg. Zuerst wurde der SSP0 IRQ-Handler ständig ausgeführt. Nach etwas Testen habe ich gemerkt, das es so aussieht als ob ständig Daten im RxBuffer sind und das SSP_FLAG_RxFifoNotEmpty-Flag ständig gesetzt ist. Was mache ich falsch??? Im nachfolgenden Code erhalte ich im Loopback-Mode die 0xAA zurück, ohne Loopback-Mode wird der Code trotzdem ausgeführt und 0xFF empfangen. while(1){ SSP_SendData(SSP0, 0xAA); while(SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty)==SET){ // Always executed! data = SSP_ReceiveData(SSP0); SSP_ClearFlag(SSP0, SSP_FLAG_RxFifoNotEmpty); //Necessary??? }; };
Erster Geistesblitz! Logisch das er was im Speicher hat, SPI ließt ja auch automatisch bei jedem Senden die Werte vom Slave ein (Pull-up, darum 0xFF). Wieso lößt aber auch der RxFifo-Interrupt aus bzw. Flag gesetzt, wenn ich auch nichts Sende - also auch nichts eingelesen werden sollte? Wo ist dann der Sinn des Flags?
Na dann beantworte ich meine Fragen halt selber ;-) Also der Rx-Interrupt wird schon nur dann ausgelößt, wenn auch was empfangen wurde. Da SPI aber bidirektional ist und der Controller im Master-Mode arbeitet, wird von MISO immer dann gelesen wenn auch Daten über MOSI gesendet werden (Master taktet den CLK und bei jedem Takt auf CLK wird ein Bit auf MOSI ausgegeben und ein Bit von MISO eingelesen). Bei jedem Senden wird also auch der Empfangs-Interrupt ausgelößt. Eigentlich ganz logisch wenn man mal ne Nacht drüber schläft, aber wollte es noch mal festhalten, falls sich irgendwann mal einer für diesen Thread interessiert! Auch wenn es mir nun das Problem bringt das ich überlegen muss, wie ich Daten lese kann ohne zu schreiben...
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.