Tengo problemas para leer los 6 registros de datos del campo magnético del LSM303DLHC en mi tarjeta de descubrimiento STM32F3. (OUT_X_H_M, OUT_X_L_M, etc.)
Utilicé la demostración STM32F3Discovery como un ejemplo de cómo leer desde el sensor de brújula. Copié las funciones Demo_CompassConfig () y Demo_CompassReadMag () provistas en main.c de la demo. También configuré un puerto de comunicaciones virtual para poder descargar datos de texto a un programa de terminal en mi PC y ver los valores que estaba leyendo.
Puedo leer bien los datos de aceleración del mismo sensor, pero no los datos del campo magnético.
Al igual que el código en la demostración, estoy inicializando el sensor de esta manera:
LSM303DLHCMag_InitTypeDef LSM303DLHC_InitStructure;
LSM303DLHC_InitStructure.Temperature_Sensor = LSM303DLHC_TEMPSENSOR_DISABLE;
LSM303DLHC_InitStructure.MagOutput_DataRate = LSM303DLHC_ODR_7_5_HZ ;
LSM303DLHC_InitStructure.MagFull_Scale = LSM303DLHC_FS_8_1_GA;
LSM303DLHC_InitStructure.Working_Mode = LSM303DLHC_CONTINUOS_CONVERSION;
LSM303DLHC_MagInit(&LSM303DLHC_InitStructure);
Cuando trato de leer los valores X Y Z de los datos del campo magnético utilizando la función de lectura de la demostración, muestran la primera lectura medida, pero luego nunca se actualizan y permanecen siempre iguales.
uint8_t buffer[3];
while (1) {
// ...
Demo_CompassReadMag(buffer);
// ...
}
Si llamo a LSM303DLHC_MagGetDataStatus () antes y después de la lectura, siempre es 0x03. El bit 0 indica que hay un nuevo conjunto de mediciones disponible, y el bit 1 indica que los registros de salida están bloqueados.
En mi búsqueda, leí que los 6 registros de salida están bloqueados hasta que todos se han leído, y luego se cargan los siguientes datos medidos para otra lectura. Los datos parecen ser correctos si enciendo y apago el dispositivo en diferentes orientaciones y lo leo, pero parece estar bloqueando el primer valor y luego nunca más cargarlo. Así que intenté leer los 6 valores a la vez para desbloquear los registros de salida.
uint8_t buffer[6];
while (1) {
// ...
LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_H_M, buffer, 6);
// ...
}
Lo mismo, los datos XYZ nunca cambian. Incluso intenté leer los 13 bytes (0x00 a 0x0C) del sensor magnético. Todavía no se actualiza.
Si reconfiguro el dispositivo después de cada lectura, puedo obtener datos en tiempo real del sensor. Obviamente, esto no es lo que se supone que debes hacer.
uint8_t buffer[3];
while (1) {
// ...
Demo_CompassReadMag(buffer);
Demo_CompassConfig();
// ...
}
Supongo que estoy haciendo algo mal o me falta algo simple, y el bloqueo nunca se libera, y el siguiente conjunto de valores nunca se carga.
¿Puede alguien decirme cómo se supone que debe leer los 6 valores de datos del campo magnético y restablecer el bloqueo del registro de salida? He intentado muchas cosas y no puedo hacer que funcione.