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 ;)
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
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?
123 G. schrieb: > Was heißt falscher SPI-Mode, ich sehe nur ein Byte um SPI / I2C zu > verwenden. Dein Clock ist invertiert
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.
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...
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/
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
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.