Operación de escritura I2C en TCA9539

Estoy usando el TCA9539 de TI para algunas operaciones I2C de lectura y escritura para controlar algunas señales en mi placa de prueba (proyecto escolar). Según TI, la operación de escritura consta de lo siguiente,

"Para escribir en el bus I2C, el maestro envía una condición de INICIO en el bus con la dirección del esclavo, así como el último bit (el bit R/W) establecido en 0, lo que significa una escritura. Después de que el esclavo envía el bit de reconocimiento, el maestro luego envía la dirección de registro del registro en el que desea escribir. El esclavo reconoce de nuevo, haciéndole saber al maestro que está listo. Después de esto, el maestro comienza a enviar los datos de registro al esclavo hasta que el maestro ha enviado todos los datos necesarios (que a veces es solo un byte), y el maestro finaliza la transmisión con una condición de PARADA".

Sin embargo, siempre obtengo un Nack del esclavo cuando envío la información de la dirección de registro al esclavo.

Aquí está mi código de muestra (muy básico)

int Address = 0x74;
#define control_register 0x02 // command byte for Output Port 0
#define data_register_1 0xFF

void setup()
{
    byte ack;
    Wire.begin();
    Serial.begin(9600);
    while (!Serial);
    Wire.beginTransmission(Address);
    ack = Wire.endTransmission();
    if (ack == 0)
    {
        Wire.beginTransmission(control_register);
        Serial.print("Control Register is : ");
        byte bck = Wire.endTransmission();
        if (bck == 0) // since i dont get a nack, this portion of code doesnt execute
        {
            Wire.write(control_register);
            Wire.write(data_register_1);

        }

    }
}
¿Está utilizando la dirección correcta? 7 bits u 8 bits? AFAIK, la biblioteca arduino necesita la dirección de 7 bits, sin incluir el bit de lectura/escritura.
Un 0x74 de 7 bits requiere que A0 y A1 estén conectados a tierra. ¿Hiciste eso?
¿Qué valor devuelve la transmisión por cable? Un 1 significa error de transmisión. 2 es un error de dirección. 3 es un error de registro/datos. 4 es otro.
Estás confundiendo la dirección del esclavo y la dirección del registro. Al menos una de tus beginTransmissionllamadas es incorrecta.
Hola, ¿significa esto que solo necesito iniciar una transmisión y luego finalizarla después de haber enviado el ciclo de escritura completo según la hoja de datos?
Sí. Exactamente.

Respuestas (1)

Oh. Suficientemente simple. Comienzas la transmisión a 0x74. Entonces lo terminas.

Luego comienza la transmisión a 0x02. Eso significa que realmente envió una transmisión a la dirección del dispositivo 0x02. En lugar del dispositivo 0x74, registre 0x02.

Por eso harías

Begin transmission 0x74.  
Write 0x02. Register
Write value.  
End transmission. 
If back = 0, you successfully
wrote value to register 0x02 on device 0x74

Al finalizar la transmisión, envía una condición de parada de i2c, arruinando la escritura o la lectura desde el dispositivo al que comenzó la transmisión.

Hola transeúnte, sí, la dirección tiene una justificación correcta de 7 bits y puedo ejecutar un escaneo exitoso del dispositivo i2c y ver 0x74. Obtuve 2, lo que significa que la dirección del esclavo estaba fallando cuando estaba tratando de escribir en el registro de comando.
@jyasir sí. Me di cuenta de eso después de que CL publicó su comentario. Debe usar wire.write para escribir el registro de control.
@jyasir no olvides aceptar la respuesta si te ayudó