Protocolo TWI/I2C con magnetómetro HMC5883L con ATMEGA256RFR2 XPLAINED PRO (megaavr)

Estoy tratando de leer los registros de salida de datos de X,Y,Z

Hasta ahora he podido:

Send a START - flag 0x08 = START condition transmitted.
Send 0x3C - flag 0x18 = SLA+W transmitted, ACK received.
//For configuring HMC5883L Control Register A & B
Send 0x02 data byte - flag 0x28 = Data byte transmitted, ACK received.
Send 0x00 data byte - flag 0x28 = Data byte transmitted, Ack Received.
Send a Repeat Start - flag 0x10 = Repeat Start condition transmitted.
Send 0x3D - flag 0x40 = SLA+R transmitted, ACK received.

Start > SLA+W > Configure Control Register A & B > Repeat Start > SLA+R > ??

No sé qué hacer después de enviar un SLA+R, intenté enviar un 0x03 (registro MSB para Salida X). Sigo obteniendo un valor fijo repetido como (0,10,10,18 - repetir).

Mi pregunta principal sería ¿cómo leo correctamente la dirección de memoria del esclavo en 0x03 seguido de 0x04, 0x05, 0x06, 0x07, 0x08 con éxito?

En la ficha técnica se menciona:

Cuando se leen uno o más de los registros de salida, no se pueden colocar datos nuevos en ninguno de los registros de datos de salida hasta que se lean los seis registros de salida de datos.

Para minimizar la comunicación entre el maestro y este dispositivo, el puntero de dirección se actualiza automáticamente sin la intervención del maestro. El puntero de registro se incrementará en 1 automáticamente después de que el registro actual se haya leído con éxito.

El valor del puntero de dirección en sí no se puede leer a través del bus I2C. Cualquier intento de leer una ubicación de dirección no válida devuelve 0, y este dispositivo ignora cualquier escritura en una ubicación de dirección no válida o un bit indefinido dentro de una ubicación de dirección válida.

Para mover el puntero de dirección a una ubicación de registro aleatoria, primero emita una "escritura" en esa ubicación de registro sin byte de datos después del comando. Por ejemplo, para mover el puntero de dirección al registro 10, envíe 0x3C 0x0A.

Cualquier ayuda sería apreciada, gracias de antemano!

Respuestas (2)

Para mover el puntero de dirección a una ubicación de registro aleatoria, primero emita una "escritura" en esa ubicación de registro sin byte de datos después del comando. Por ejemplo, para mover el puntero de dirección al registro 10, envíe 0x3C 0x0A

Entonces, para leer desde el registro 0x03 en adelante, intente:

Start > SLA+W > 0x03 > Repeat Start > SLA+R > read 6x

(Observe el Wen el primero SLA+W.)

De hecho, resolví el problema, pero otro problema extraño es: cuando escribo en 0x03 (para configurar el puntero), no estoy exactamente seguro de dónde está el puntero, pero en su lugar dice 0x04. Para arreglarlo, comencé desde 0x02, funcionó perfectamente. Verifiqué esto leyendo el registro de identificación A,B,C. Leer la primera identificación en 0x0A me dio un '4' cuando se suponía que debía obtener una 'H'. Entonces, para rectificar esto, en realidad comencé a leer desde 0x09, luego me dio una 'H', '4', '3'.

Tenga en cuenta que en realidad no debe escribir ningún dato. Simplemente escriba un byte -el número de registro- y luego cambie a lectura.