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

1

Estoy intentando 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 > ??

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

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

En la hoja de datos se menciona:

  

Cuando se leen uno o más de los registros de salida, los nuevos datos no pueden ser   colocado en cualquiera de los registros de datos de salida hasta los seis datos de salida   Se leen los registros.

     

Para minimizar la comunicación entre el maestro y este dispositivo, el   Puntero de dirección actualizado automáticamente sin intervención maestra. los   el puntero de registro se incrementará en 1 automáticamente después de la   El registro actual se ha leído correctamente.

     

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

     

Para mover el puntero de dirección a una ubicación de registro aleatorio, primer problema   una "escritura" en esa ubicación de registro sin un byte de datos después de la   elogiar. Por ejemplo, para mover el puntero de dirección al registro 10, envíe   0x3C 0x0A.

Cualquier ayuda sería apreciada, gracias de antemano!

    
pregunta Gary Tan

2 respuestas

0
  

Para mover el puntero de dirección a una ubicación de registro aleatorio, primer problema   una "escritura" en esa ubicación de registro sin byte de datos después de la   elogiar. 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 W en el primer SLA+W .)

    
respondido por el JimmyB
0

Realmente resolví el problema, pero otro problema extraño es: cuando escribo en 0x03 (para establecer el puntero), no estoy exactamente seguro de dónde está el puntero, pero en cambio lee 0x04. Para solucionarlo, comencé desde 0x02, funcionaron perfectamente. Lo verifiqué leyendo el registro de identificación A, B, C. La lectura de la primera identificación en 0x0A me dio un '4' cuando se suponía que obtendría una 'H'. Así que para rectificar esto, comencé a leer desde 0x09, luego me dio una 'H', '4', '3'.

    
respondido por el Gary Tan

Lea otras preguntas en las etiquetas