Hallo, hab einen MSP430 als SPI-Master. Die Daten vom SPI-Slave werden ja so gelesen: - Slave stellt ein Zeichen in seinem Schieberegister bereit und wartet auf Takt - Master zieht SS auf low ( wenn 4-Wire-Mode ) - In Tx-Buffer des Masters wird ein Dummy-Byte geschrieben - Master erzeugt Takt und liest das Zeichen vom Slave - Wenn Zeichen vollständig gelesen, Master liest das nächste Zeichen oder zieht SS auf high Nun meine Frage: Wie erfährt der MSP430, wann er das Zeichen vollständig empfangen hat? Mit dem Auswerten des TxFlags klappt es leider nicht, weil es nur signalisiert, wann der Tx-Buffer zur Annahme des nächsten zu sendende Zeichens bereit ist und nicht wann das aktuell zu sendende Zeichen vollständig aus dem ensprechenden Shift-Register rausgeschoben wurde.
Hallo noips, du musst das TXEPT-Flag (Tx-Register empty) in UxTCTL abfragen. Damit wird angezeigt, das eine Byte fertig übertragen wurde. Gruß Rainer
Hallo Rainer, danke für die Antwort! Mit dem Abfragen des Tx-Register-empty-Flags (heißt beim MSP430 einfach TXIFG - Tx-Interrupt Flag) geht es eben nicht, wie ich oben geschrieben habe. Das Problem ist, dass das SPI-Sendemodul des MSP430 zum Senden zwei Register hat, einen Buffer-Register und einen Shift-Register. Zum Senden müssen Zeichen in den Buffer-Register geschrieben werden. Wenn Schieberegister leer ist, wird das Zeichen aus dem Buffer in Shift-Reg. geschrieben und dann im Takt rausgeschiftet. Das TXIFG-Bit signalisiert, wann das Buffer-Reg. leer ist, damit man das nächste Zeichen dort hineinschreiben kann. Shift-Reg. ist aber noch eine ganze Weile nicht leer, auch wenn Buffer schon leer ist und TXIFG-Bit gesetzt wurde. Wenn man also SS sofort deaktiviert, gleich nach dem TXIFG gesetzt wurde, wird das letzte Zeichen vom Slave nicht empfangen.
Abhilfe böte hier ein mit dem Bittakt betriebener abwärtslaufender Timer, der mit dem Hineinschreiben in das TX-Register mit dem Wert 8 aufgezogen wird und bei Ablauf einen Interrupt auslöst - nicht schön, aber eine Möglichkeit.
Danke für die Antworten! Ich glaube, ich habe eine Lösung. Das SPI-Modul des Controllers hat im SPI-Statusregister ein BUSY-Bit. Es zeigt, wann eine Übertragung aktiv ist. Ich habe es vorher nie benutzt und kannte es nicht, aber es scheint genau für einen Fall wie meinen da zu sein.
Das mit dem Buffer ist mir schon klar. Deswegen meinte ich auch das du das TXEPT (im UXCTL-Register) nehmen sollst und nicht das TXIFG-Flag(im IFx-Register). Der MSP430 (zumindest der MSP430F16xx) hat ja genau für diese beiden Fälle zwei verschieden Flags. Gruß Rainer
Aha, OK! Bei dem Typ, den ich verwende ist der ober erwähnte BUSY-Flag wohl dazu vorgesehen.
>Wie erfährt der MSP430, wann er das Zeichen vollständig empfangen hat? >Mit dem Auswerten des TxFlags klappt es leider nicht Ja wie wohl er empfängt ja das Byte.. Desshalb würd ich wohl die Rx-Flags auswerten.. Beim MSP430F169 währen dies wohl URXIFGO oder URXIFG1 Im MSP430xF1xx User Guide (SLAU049F.pdf) steht: URXIFG0 Bit 6 USART0 receive interrupt flag. URXIFG0 is set when U0RXBUF has received a complete character. 0 No interrupt pending 1 Interrupt pending Also wenn das Bit URXIFG0 gesetzt ist wurde das Byte empfangen. cheers
Das Problem mit dem Empfangen von Zeichen ist jetzt dank euch gelöst! Jetzt habe ich noch folgende Frage: Wenn der SPI-Master Zeichen lesen will, muss er ja ein Dummy-Zeichen schicken um Takt zu erzeugen. Wenn jetzt aber das SPI im Slave so funktioniert, dass beim Emfangen dieses Dummy-Zeichens im Slave ein Interrupt ausgelöst wird, so führt dieses Dummy ja möglicherweise zu Timing-Problemen im Slave. Wie kann ich auf der Seite des Masters dafür sorgen, dass so etwas vermieden wird? Was mir da einfällt, ist die Möglichkeit, den MOSI-Pin des Masters für die Dauer des Lesevorganges per Software zu deaktivieren. Im MSP430 müsste man dazu den Pin wieder als I/O-Pin konfigurieren. Ich weiß aber nicht, wie gut diese Lösung ist. Da vergeht ja auch Zeit beim Umkonfigurieren. Gibt es da übliche gute Lösungen dazu?? Danke schon mal!!!
Dann funktioniert dein Slave nicht richtig. Jeder SPI Slave funktioniert so, dass bei jedem Schreiben gleichzeitig vom Master gelesen wird. Um zu lesen, muss ein Dummay Byte gesschrieben werden. Wo soll da jetzt was kollidieren?
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.