El protocolo I2C requiere escribir la dirección del registro antes de leer su contenido desde el dispositivo esclavo. Leer un registro sin una escritura de dirección previa no cumple con el protocolo I2C.
Para leer el contenido de un registro específico del dispositivo esclavo, se debe realizar una escritura al esclavo con la dirección del registro deseado antes de la lectura.
Los pasos para leer el contenido de un registro en un dispositivo esclavo I2C son:
START -> Dirección de 7 bits del esclavo -> R/W=0 (Escritura) -> ACK -> Dirección del registro (1 byte) -> ACK -> Sr (Reinicio) -> Dirección de 7 bits del esclavo -> R/W=1 (Lectura) -> ACK -> Datos del registro -> NACK (del esclavo, ya que no hay más datos para enviar) -> STOP.
Consulta el documento «Understanding the I2C Bus» de Texas Instruments para una comprensión más profunda del protocolo I2C: Understanding the I2C Bus
La función readReg
está diseñada para leer 2 bytes del esclavo. Verifica si el tamaño se ha cambiado a 1 byte si solo se necesita leer 1 byte.
El registro Reg0 suele ser el registro EN/RESET. Verifica las operaciones realizadas antes de leer Reg0, como si se ha escrito en este registro.
Intenta acceder al contenido de otro registro, por ejemplo, Reg4, para verificar si se puede leer el contenido escrito en él.
Ejemplo de acceso al registro con dirección 0x05 para leer el byte de temperatura bruta del sensor de temperatura MCP9808 en RA6M4: Primero se realiza una escritura, escribiendo en el esclavo 0x05 que es la dirección del registro a leer, luego, después de unos 100ms (debido a algunos bucles while que comprueban el tiempo de espera) se realiza el proceso de lectura del contenido de este registro.