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.
Wie meinst du das? Natürlich hat man bei dem Discovery mehrere SPI und I2C Schnittstellen zur Verfügung :)
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.
Ah ok. Mir ist auch Grad eingefallen dass der mpu nicht da sondern auf dem tiva Sensor booster verbaut ist. Sorry fürs verwirren...
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 :)
Besser währe da wohl das vollständige Datenbatt. http://www.invensense.com/mems/gyro/documents/PS-MPU-9250A-01.pdf Dort ist beschrieben, wie man zwischen I2C und SPI Modus umschalten kann.
Maaan, versteht man mich echt soo schlecht? Wir reden immernoch aneinander vorbei :)
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.
Alles klar. Ich glaube, es ist nicht weiter tragisch wenn der SPI Bus etwas unterfordert ist. Ich werde es erst damit versuchen. Danke euch nochmal :)
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.
