Forum: Mikrocontroller und Digitale Elektronik Register nicht korrekt gelesen? (STM32, SPI, KEIL µVision)


von ff (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Habe ein Problem mit dem SPI-Interface von einem STM32f4.
Wenn ich das Data-Register (DR) auslese wird ein falscher Wert in der 
Variable gespeichert. Dass im DR ein andere Wert steht sieht man im 
Peripheral-Viewer und auch die Messung mit einem Oszi zeigt diesen 
anderen Wert.

Anbei der Screenshot an dem man dies alles erkennen kann. Die 
SPI-Control Register sind auch zu sehen.

Was ist hier los?

von (prx) A. K. (prx)


Lesenswert?

Register wie DR lesen zerstörend, d.h. mit dem Lesevorgang verschwindet 
der alte Wert aus DR und es erscheint u.U. ein neuer aus einem Puffer 
oder Schieberegister.

Hier könnte es bedeuten, dass der nächste Wert 0x07 ist und du das 
Resultat des Transfer des ersten spi_put(0x00) erhältst, aber das 
Resultat des zweiten spi_put(0x00) erwartet hattest. Daumenregel bei SPI 
ist, dass zu jedem put auch ein get gehört, ob man den Inhalt braucht 
oder nicht.

Dazu kommt, dass solche Register doppelt existieren, pro Richtung eines, 
mt völlig unterschiedlichem Inhalt. Ein Debugger wird das u.U. nicht 
passend wiedergeben.

: Bearbeitet durch User
von ... (Gast)


Lesenswert?

> Ein Debugger wird das u.U. nicht
> passend wiedergeben.

Ein Debugger wird u.U. sogar das korrekte Auslesen verhindern,
wenn das Progamm im Single-Step durchlaufen wird.

Wie schon geschrieben: Manche Register lassen sich nur
1x auslesen. Wenn der Debugger das Register "weggelesen" hat,
bleibt fuer das Programm nur ein u.U. falscher Wert uebrig.

Wenn man beim Debuggen wissen will, was im Register steht,
in den Speicher kopieren und im Programm mit diesem gespeichertem
Wert arbeiten.

von Jim M. (turboj)


Lesenswert?

A. K. schrieb:
> Dazu kommt, dass solche Register doppelt existieren, pro Richtung eines,
> mt völlig unterschiedlichem Inhalt. Ein Debugger wird das u.U. nicht
> passend wiedergeben.

Schlimmer: Der Debugger liest das über den normalen Bus aus und setzt 
damit auch die entsprechenden Zustands Bits (z.B. Receiver not empty) 
um.

Merke: Hardware Register mit Nebenwirkungungen beim Lesen lieber nicht 
im Debugger anzeigen lassen.

von Ff (Gast)


Lesenswert?

A. K. schrieb:
> Daumenregel bei SPI
> ist, dass zu jedem put auch ein get gehört, ob man den Inhalt braucht
> oder nicht.

Das war mein Problem, danke euch für eure Hilfe!

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.