GY-521 No se puede configurar el registro PWR_MGMT_1; no se puede deshabilitar el modo SLEEP

Estoy intentando conectarme entre un MCU personalizado basado en 8051 y un nuevo módulo GY-521 (ebay) (chip Gyro/Accel) usando el bus I2C. Yo mismo he escrito las funciones bit-bang de I2C y parecen estar funcionando bien. Puedo ver las operaciones del bus (lectura/escritura) en el osciloscopio y veo los ACK del GY-521 cuando deberían verse.

Sin embargo, para leer los datos del giroscopio/aceleración, debo borrar el bit "SLEEP" del registro PWR_MGMT_1.

Procedimiento: 1. Enviar secuencia de INICIO 2. Enviar dirección de 7 bits + bit de ESCRITURA (0) 3. Leer ACK del esclavo 4. Escribir dirección de registro de 8 bits (0x6b) 5. Leer ACK 6. Escribir valor de datos de 8 bits ( 0x01 = usar X Gyro como fuente de reloj) 7. Leer ACK 8. Enviar secuencia STOP.

Puedo ver a la MCU escribir el nuevo valor (0x01) en el registro, pero luego, cuando vuelvo a leer el registro, el valor vuelve a ser 0x40 (predeterminado).

Cualquier lectura de los valores de giroscopio o aceleración devuelve ceros debido a que el módulo está en modo de suspensión.

Aquí está la hoja de especificaciones del giroscopio MPU-6050 que se usa en esta placa. https://www.cubby.com/pli/Spec+Sheet.pdf/_506bd71d53d3454282f06fa698666f04

Aquí está la lista de registros: https://www.cubby.com/pli/Register+Map.pdf/_17685da9808c42099c5ebdc1058c63b3

Si lo desea, puedo publicar el resultado del alcance donde puede ver el valor que se establece, el ACK recibido y luego leer el valor que arroja el valor predeterminado.

Cualquier sugerencia apreciada.

Gracias

Algo que podría valer la pena intentar es leer el WHO_AM_Iregistro y ver si obtiene 0x68 para verificar que su código I2C esté bien.
Gran sugerencia, lo probé: obtengo la dirección correcta (0x68) para el dispositivo.

Respuestas (1)

El registro PWR_MGMT_1 siempre debe establecerse como el último después de todas las configuraciones de registro como esa:


void MPU9150_Init_awake_SensorRegister (sin firmar 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);

}


  • Usé 0x09 en lugar de 0x01 para desactivar el sensor de temperatura porque no lo necesito.

  • Por cierto, acabo de probar eso y funciona hasta ahora; Todavía tengo que experimentar con él sin embargo.