Guten Tag,
ich bin ein relativer Neuling im Bereich STM32 und habe mir kurzerhand
das Discovery Board gekauft. Nach den anfänglichen Standardprojekten
habe ich mich nun dazu entschieden ein etwas größeren Sprung zu machen
und möchte nun den MPU9250 auslesen.
Dabei bieten sich zwei Protokolle an: I2C und SPI.
Mit I2C habe ich schonmal oberflächlich gearbeitet, SPI ist für mich
noch totales Neuland. Wenn man sich das Datenblatt und die Register Map
vom MPU9250 anschaut, scheit es mir, als würde die I2C Schnittstelle
viel besser erklärt werden?!
Woran liegt das? Ich würde gerne die SPI Schnittstelle benutzen, finde
dazu aber so wenig Informationen, dass ich mich kaum an das Thema traue.
Meint ihr, ich kann das per SPI schaffen oder soll ich lieber bei I2C
bleiben - wo es im Endeffekt sogar schon fertigen Code gibt?
Ich bin da noch sehr unsicher und würde mich über eure Meinung freuen.
Liebe Grüße.
Schon aber der Sensor ist ja auf dem board verbaut. Da müssen ja nicht
notwendigerweise beide Interfaces angeschlossen sein oder? Btw das
demoprogramm nutzt den Sensor.
Ah, jetzt verstehe ich was du meinst :)
Der MPU9250 ist nicht auf dem Discovery verbaut. Ich habe diesen auf
einer breadboardkonformen Platine!
Es geht tatsächlich nur um die Softwareseite. Es gibt ja auch genug
Beispiele wie man die SPI oder I2C Schnittstelle benutzt, mir ist aber
bei beiden Protokollen nicht klar, was für Daten ich senden muss um den
MPU korrekt anzusteuern.
Hey, kein Problem. Man kann nicht immer alles vor Augen haben :)
Um nochmal meine eigentlich Frage anzustoßen:
http://www.invensense.com/mems/gyro/documents/RM-MPU-9250A-00.pdf
In der PDF steht viel über I2C und wenig über SPI.
Ist der einzige Unterschied (natürlich nur im Groben), dass ich über I2C
eine Adresse habe und über SPI ein CS? Also ist die eigentliche
Kommunikation die selbe, nur kann ich bei SPI die Register wie "Register
36 – I2C Master Control" ignorieren?
ThomasL schrieb:> Ist der einzige Unterschied (natürlich nur im Groben), dass ich über I2C> eine Adresse habe und über SPI ein CS?
Nein, das sind schon zwei verschiedene Systeme - allein schon
hardwaretechnisch unterscheiden Sie sich deutlich voneinander. Gemeinsam
ist ihnen aber, dass sie synchron arbeiten, d.h. es gibt ein dediziertes
Taktsignal, nämlich SCL im Fall von I2C und SCK im Fall von SPI.
Ansonsten solltest du vielleicht damit beginnen deinen Horizont etwas zu
erweitern und dich nicht nur auf den o.g. Chip zu konzentrieren. I2C und
SPI sind viel allgemeingültigere Konzepte, die man zunächst einmal
verstehen sollte, bevor man sich konkret mit einem spezielllen Chip
auseinander setzt. Schau dir doch einfach mal passende Tutorials and und
sieh dir dann Beispielprojekte an, welche entsprechende Treiber
implementieren.
Mit freundlichen Grüßen,
Karol Babioch
Danke für deine Antwort.
Mir ist klar, dass beides zwei verschiedene Systeme sind.
Ich habe mir auch schon einiges dazu durchgelesen.
> Ist der einzige Unterschied (natürlich nur im Groben), dass ich über I2C> eine Adresse habe und über SPI ein CS?
Schon beim schreiben des Satzes hatte ich ein mulmiges Gefühl.
Mein Einschub "(natürlich nur im Groben)" hat ihn auch nicht entschärft
;)
Ich bezog mich dabei nur auf die softwaretechnische Seite.
Wie die Protokolle funktionieren meine ich schon verstanden zu haben.
Die Hardwareseite ist mir auch klar.
Ich wollte eigentlich nur das offensichtliche aufführen:
Bei I2C erfolgt die Kommunikation durch senden der Adresse des
Schaltungsteiles.
Bei SPI erfolgt das ansprechen über ein CS, welchen ich auf "Low" ziehe.
So, mir ist klar, dass Hardwaremäßig schon Unterschiede bestehen.
Auch das verschiedene Peripherien benötigt werden weiß ich.
Ich frage mich eher WAS für Daten ich an den Slave senden muss und nicht
das WIE.
Wenn ich dem MPU9250 z.B. über I2C das Register "0x3B" schicke, so
liefert er mir die Werte vom Accelerometer zurück.
Wie aber funktioniert das bei SPI?
Wenn man das Dokument mal überfliegt, fällt einem auf, dass überall nur
von I2C die Rede ist:
http://www.invensense.com/mems/gyro/documents/RM-MPU-9250A-00.pdf
Kann es das es noch eine SPI-Version davon gibt?
PS: Tut mir Leid, dass ich mich so schwer ausdrücke. Es fällt mir schwer
auf den Punkt zu kommen. Ich hoffe, jemand versteht meine Schwierigkeit
:)
ThomasL schrieb:> Wie aber funktioniert das bei SPI?
Du sendest die gleichen Daten an den Slave, wie beim i²c-Bus, nur mit
dem Unterschied, dass die Adressierung nicht über ein Adressbyte
(welches den Slave auf dem Bus adressiert) durchgeführt wird, sondern
über die CS-Leitung. Wenn du also ein bestimmtes Register konfigurieren
willst, dann ziehst du die CS-Leitung des entsprechenden Slaves auf LOW
und versendest dann die Adresse des Registers als ein vollständiges
Byte. Anschließend sendest du den Inhalt als zweites Byte, welches der
Slave dann in das Register übernimmt.
Hmmm... das Datenblatt sagt ganz klar - bei SPI und I2C sendest du die
selben Kommandos. Nur die elektrische Verbindung unterscheidet sich.
Wenn Invensense I2C bevorzugt, dein STM I2C kann, und du damit
Erfahrungen hast - warum denkst du dann über SPI nach? Einfach
ignorieren.
> Du sendest die gleichen Daten an den Slave, wie beim i²c-Bus, nur mit> dem Unterschied, dass die Adressierung nicht über ein Adressbyte> (welches den Slave auf dem Bus adressiert) durchgeführt wird, sondern> über die CS-Leitung. Wenn du also ein bestimmtes Register konfigurieren> willst, dann ziehst du die CS-Leitung des entsprechenden Slaves auf LOW> und versendest dann die Adresse des Registers als ein vollständiges> Byte. Anschließend sendest du den Inhalt als zweites Byte, welches der> Slave dann in das Register übernimmt.
Du bist der Beste! Danke!
Also sind die Registeradressen bei I2C und SPI die gleichen?
Und die Register, die sich nur mit der I2C Schnittstelle beschäftigt
(wie z.B. die Registers 37 bis 39 auf Seite 20), kann ich ignorieren?
( http://www.invensense.com/mems/gyro/documents/RM-MPU-9250A-00.pdf )
Danke euch :)
> Wenn Invensense I2C bevorzugt, dein STM I2C kann, und du damit> Erfahrungen hast - warum denkst du dann über SPI nach?
Ich habe I2C nur so gestreift. Ob ich jetzt SPI oder I2C benutze macht
für mich kein Unterschied. SPI soll ja zudem schneller sein.
Auch habe ich mir mehrere "SPI versus I2C" Beiträge durchgelesen, konnte
aber nie ein klaren "Gewinner" identifizieren.
Dieser Sensor unterstützt einen schnelleren Bustakt für den SPI Bus
(1MHz), als für i²c. i²c kann mit maximal 400kHz betrieben werden und
ist somit langsamer als der SPI Bus. Du solltest bei der Wahl bedenken,
dass die Sensoren selber nur mit einer bestimmten Rate Messwerte
abtasten. Ich habe nur mal kurz ins Datenblatt geschaut, aber wie ich
das gesehen habe, liefert das Gyro mit max. 8kHz neue Messwerte und das
Accelerometer mit max. 4kHz. Das ist ja der begrenzende Faktor.