GY-521 Register PWR_MGMT_1 kann nicht eingestellt werden - SLEEP-Modus kann nicht deaktiviert werden

Ich versuche, über den I2C-Bus eine Schnittstelle zwischen einer benutzerdefinierten 8051-basierten MCU und einem neuen (ebay) GY-521-Modul (Gyro/Accel-Chip) herzustellen. Ich habe die I2C-Bit-Bang-Funktionen selbst geschrieben und sie scheinen gut zu funktionieren. Ich kann Busoperationen (Lesen/Schreiben) auf dem Oszilloskop anzeigen, und ich sehe ACKs vom GY-521, wenn sie gesehen werden sollten.

Um jedoch die Kreisel-/Beschleunigungsdaten zu lesen, muss ich das „SLEEP“-Bit aus dem PWR_MGMT_1-Register löschen.

Vorgehensweise: 1. START-Sequenz senden 2. 7-Bit-Adresse + WRITE-Bit (0) senden 3. ACK vom Slave lesen 4. 8-Bit-Registeradresse schreiben (0x6b) 5. ACK lesen 6. 8-Bit-Datenwert schreiben ( 0x01 = X Gyro als Taktquelle verwenden) 7. ACK lesen 8. STOP-Sequenz senden.

Ich kann beobachten, wie die MCU den neuen Wert (0x01) in das Register schreibt, aber wenn ich dann das Register zurücklese, ist der Wert wieder auf 0x40 (Standard).

Alle Lesevorgänge der Kreisel- oder Beschleunigungswerte geben Nullen zurück, da sich das Modul im Schlafmodus befindet.

Hier ist das Datenblatt für den Kreisel MPU-6050, der in diesem Board verwendet wird. https://www.cubby.com/pli/Spec+Sheet.pdf/_506bd71d53d3454282f06fa698666f04

Hier ist die Registerliste: https://www.cubby.com/pli/Register+Map.pdf/_17685da9808c42099c5ebdc1058c63b3

Wenn Sie möchten, kann ich die Scope-Ausgabe posten, in der Sie sehen können, wie der Wert gesetzt wird, die ACK empfangen wird und dann den Wert zurückliest, der den Standardwert ergibt.

Irgendwelche Vorschläge geschätzt.

Danke

Etwas, das einen Versuch wert sein könnte, ist, das WHO_AM_IRegister zu lesen und zu sehen, ob Sie 0x68 zurückbekommen, um zu überprüfen, ob Ihr I2C-Code in Ordnung ist.
Toller Vorschlag, ich habe es ausprobiert: Ich bekomme die richtige Adresse (0x68) für das Gerät.

Antworten (1)

Das Register PWR_MGMT_1 sollte nach allen Registerkonfigurationen immer als letztes gesetzt werden:


void MPU9150_Init_awake_SensorRegister (unsigned int MasterI2C_BaseAddress)

{

WriteByte_to_SlaveRegister (MasterI2C_BaseAddress, RA_GYRO_CONFIG, 0x08); WriteByte_to_SlaveRegister (MasterI2C_BaseAddress, RA_ACCEL_CONFIG, 0x10); WriteByte_to_SlaveRegister(MasterI2C_BaseAddress,RA_USER_CTRL,0x00); WriteByte_to_SlaveRegister(MasterI2C_BaseAddress,RA_PWR_MGMT_1,0x09);

}


  • Ich habe 0x09 anstelle von 0x01 verwendet, um den Temperatursensor zu deaktivieren, da ich ihn nicht brauche.

  • Übrigens habe ich das gerade ausprobiert und es funktioniert soweit; Damit muss ich aber noch experimentieren.