Forum: Mikrocontroller und Digitale Elektronik ADXL345 Device ID auslesen


von 123 G. (123guy)



Lesenswert?

Hallo liebe Community,

ich bin neu im Mikrocontroller programmieren.

Ich versuche mit dem stm32nucleo per SPI den Beschleunigungssensor 
ADXL345 auszulesen.

Die Initialisierung des SPI habe ich wie im Datenblatt vorgenommen und 
Daten die im DataRegister stehen, werden nun auch über die MOSI Leitung 
verschickt.

Leider verstehe ich nicht genau, wie ich denn jetzt auf Register bzw 
Device ID zugreifen möchte. Die Device ID möchte ich nur, da es mir das 
sinvollste Register zum lesen und prüfen scheint.

Erste Frage, muss ich immer 16 oder 8 Bit schicken? Werden die 
restlichen 8 Bits aufgefüllt, wenn ich nur 8 schicke weil sie nicht 
gebraucht werden?

Daher dachte ich um die Device ID auszulesen:
Ich schreibe 0b10000000 ins DataRegister.
Erstes Bit 1 für lesen, zweites Bit 0 für MB da nur 1 Register,
dann 6 Nullen für das Register der Device ID.

Ich bekomme nun auf der MOSI Leitung die 10000000, leider bleibt meine 
MISO Leitung still obwohl doch 11100101 kommen soll.

Wo ist mein Problem, wo liegt mein Denkfehler?

Viele Grüße und Danke im Vorraus ;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

123 G. schrieb:
> Ich bekomme nun auf der MOSI Leitung die 10000000,
Ignorieren. Das sind die X auf der MISO-Leitung im Timingdiagramm.
> leider bleibt meine MISO Leitung still obwohl doch 11100101 kommen soll.
Du musst nach deinem Kommandobyte noch ein Dummybyte hinterhersenden, 
denn der Slave braucht den SCLK, dass er seine Daten auf die 
MISO-Leitung legen kann.
Also: SS#=low, 8 Bit Kommando senden, 8 Bit Dummy senden, SS#=high

EDIT:
Wenn ich das WhatsApp_Image_2021-11-20_at_17.51.41.jpeg mit dem 
Timingdiagramm aus dem DB vergleiche, dann beschleicht mich der Gdanke, 
dass du den falschen SPI-Mode verwendest...

: Bearbeitet durch Moderator
von 123 G. (123guy)


Lesenswert?

Lothar M. schrieb:
> Wenn ich das WhatsApp_Image_2021-11-20_at_17.51.41.jpeg mit dem
> Timingdiagramm aus dem DB vergleiche, dann beschleicht mich der Gdanke,
> dass du den falschen SPI-Mode verwendest...

Was heißt falscher SPI-Mode, ich sehe nur ein Byte um SPI / I2C zu 
verwenden.

Lothar M. schrieb:
> Also: SS#=low, 8 Bit Kommando senden, 8 Bit Dummy senden, SS#=high

Okay, jetzt ist wechselt mein SCLK Signal schonmal 16 mal und 16 Bit 
werden von der MOSI Leitung gesendet.



Nachdem ich 2x 8 Bit gesendet hab und den CS wieder auf 1 setze, müsste 
dann die Übertragung auf der MISO Leitung "von alleine" starten?

von Wolfgang (Gast)


Lesenswert?

123 G. schrieb:
> Was heißt falscher SPI-Mode, ich sehe nur ein Byte um SPI / I2C zu
> verwenden.

Dein Clock ist invertiert

von omg (Gast)


Lesenswert?

123 G. schrieb:
> Was heißt falscher SPI-Mode, ich sehe nur ein Byte um SPI / I2C zu
> verwenden.

SPI-Mode ist der Modus den du in deiner Software beim
Initialisieren des SPI Controllers (im Mikrocontroller)
gewählt hast.

von 123 G. (123guy)


Lesenswert?

omg schrieb:
> SPI-Mode ist der Modus den du in deiner Software beim
> Initialisieren des SPI Controllers (im Mikrocontroller)
> gewählt hast.



Ja, aber gibt es mehrere SPI-Modi? Ich denke ich kann halt entweder auf 
SPI-Mode oder auf I2C-Mode stellen...

von 123 G. (123guy)


Lesenswert?

Wolfgang schrieb:
> Dein Clock ist invertiert

Oh danke für den Hinweis, das check ich mal ;)

von Wolfgang (Gast)


Lesenswert?

123 G. schrieb:
> Ja, aber gibt es mehrere SPI-Modi?

Ja, gibt es - vier Stück, um genau zu sein.
https://www.allaboutcircuits.com/technical-articles/spi-serial-peripheral-interface/

von 123 G. (123guy)


Lesenswert?

Danke Leute, die Device ID bekomme ich nun über den MISO zurück.
Aber wo genau wird der MISO-Wert gespeichert, bzw wie kann ich ihn 
auslesen/in einer Variable speichern?

Steht der dann einfach im DATA_REGISTER?

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

123 G. schrieb:
> Steht der dann einfach im DATA_REGISTER
Würde ich jetzt erwarten, steht zu Not auch detailliert im Datenblatt...

> die Device ID bekomme ich nun über den MISO zurück.
Und jetzt kommts: wenn du den richtigen Wert auf dem Bus siehst, aber im 
Empfangsregister ist er irgendwie um 1 Bit versetzt, dann hast du noch 
immer den falschen SPI Mode.
Hier noch eine etwas andere Darstellung der Modes:
http://www.lothar-miller.de/s9y/categories/17-SPI

Wichtig ist, dass man die Flanke erkennt, mit der Pegel der MISO 
übernommen wird.

: Bearbeitet durch Moderator
von omg (Gast)


Lesenswert?

Lothar M. schrieb:
> Wichtig ist, dass man die Flanke erkennt, mit der Pegel der MISO
> übernommen wird.

Ich denke da hilft erst mal gar nichts da man das Gefühl hat
gegen Wände zu reden:

123 G. schrieb:
> Ja, aber gibt es mehrere SPI-Modi? Ich denke ich kann halt entweder auf
> SPI-Mode oder auf I2C-Mode stellen...

Was hast du guter Mann denn bisher gemacht?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

123 G. schrieb:
> Nachdem ich 2x 8 Bit gesendet hab und den CS wieder auf 1 setze, müsste
> dann die Übertragung auf der MISO Leitung "von alleine" starten?
Steht auch im Datenblatt des µC.

Aber normalerweise startest du die Übertagung mit dem Schreiben ins 
Senderegister. Dann musst du das Ende der Übertragung abwarten und das 
entsprechende Flag dafür abfragen. Und wenn das Senderegister wieder 
frei ist, kannst du das nächste Byte reinschreiben und damit die nächste 
Übertragung starten.
Und jetzt kommt der Witz, den man zur Verwendung des SPI kapieren muss: 
mit jedem einzelnen gesendeten Bit schickt dir der Slave eines zurück. 
Er kann gar nicht anders, weil das in Master und im Slave ja einfach nur 
hintereinander geschaltete Schieberegister sind, die immmer mit jedem 
SCLK-Takt ihre Bits um 1 weiterschieben.

> den CS wieder auf 1 setze
Der CS (besser SS#, weil das Signal beim SPI Slave Select heißt) ist nur 
ein beliebiger Portpin, der selektiert nur vor der Übertragung den 
passenden Teilnehmer, er hat während der eigentlichen Übertragung nichts 
zu tun. Und die Übertragung ist auch schon zu Ende, wenn er wieder 
inaktiv gesetzt wird.

von omg (Gast)


Lesenswert?

123 G. schrieb:
> Die Initialisierung des SPI habe ich wie im Datenblatt vorgenommen

123 G. schrieb:
> Was heißt falscher SPI-Mode, ich sehe nur ein Byte um SPI / I2C zu
> verwenden.

Muss man diesen Widerspruch verstehen, oder was soll man sonst
davon halten?

Ich höre da so etwa: "Ich habe die Anleitung gelesen, kann
mir jetzt jemand den Inhalt erklären?"

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.