Al ejecutar una prueba en un PIC16F18877, encuentro un problema con i2cWrite.
Durante el envío de una dirección a un TCA9555 no puedo obtener un ACK adecuado. Después de iniciar I2c, se llama a la función con dirección de esclavo 0x40. De hecho, 0x20 primeros 7 bits para dirección esclavo complementados con 0 para escritura en el bit 0. A0; A1 y A2 son todos llevados a GND. Pruebas con un TCA9555 diferente da el mismo error.
Necesito que ACK se convierta en 0, pero el valor de retorno es 1.
La función i2cWrite se ha utilizado en muchos proyectos y se ha probado ahora con un DS3231. Desde este dispositivo obtengo un ACK adecuado.
Al pasar por la función se muestran las señales altas y bajas de SDA adecuadas. Incluso visible en la propia línea SDA.
Puede que esté haciendo algo mal con el TCA9555 pero no tengo idea de qué.
bit i2cWrite(const unsigned char Byte)
{
unsigned char i = 0;
for(i=0;i<8;i++) // Repeat for every bit
{
Set_SCL_Low;
Delay();
// when it is confirm that SCL is low
if((Byte<<i)&0x80) // Place data bit value on SDA pin
Set_SDA_High; // If bit is high, make SDA high
else // Data is transferred MSB first
Set_SDA_Low; // If bit is low, make SDA low
Delay();
Set_SCL_High; // So that slave can ackknowldege
Delay();
Delay();
}
// Get ACK from slave
Set_SCL_Low;
Set_SDA_High;
Delay();
Delay();
Set_SCL_High;
Delay();
Delay();
return SDA;
}