El TWI en mega2560 parece estar funcionando mal. El siguiente código, que se considera correcto según la hoja de datos, proporciona una secuencia de inicio adecuada, una dirección correcta y un ACK correcto. Pero al escribir y enviar datos a TWDR y luego configurar todos los bits en TWCR incluido TVINT, no sucede nada. Al intentar la misma puesta en marcha con lectura, funciona bien hasta el punto de la lectura y, de nuevo, no pasa nada. Pero la condición de parada después de la lectura se realiza correctamente. Entonces, ¿qué le impide emitir la secuencia de lectura / escritura adecuada? Incluyendo una imagen de osciloscopio de SCL (arriba) y SDA (abajo) durante la lectura. Código:
------------- write to PCF8574N extension port -------------
I2CFLAG=false;
/*start*/
TWCR= (1<<TWINT) | (1<<TWSTA) | (1<<TWEN) | (1<<TWIE);
while(!I2CFLAG);
ta=TWSR;
/*adress+W*/
I2CFLAG=false;
TWDR=0x40;
TWCR= (1<<TWINT) | (1<<TWEA) | (1<<TWEN) | (1<<TWIE);
while(!I2CFLAG);
tb=TWSR;
/* data out*/
I2CFLAG=false;
TWDR=0x5A;
TWCR= (1<<TWINT) | (1<<TWEA) | (1<<TWEN) | (1<<TWIE);
while(!I2CFLAG);
tc=TWSR;
------------- read from extension port --------------------
I2CFLAG=false;
/*start*/
TWCR= (1<<TWINT) | (1<<TWSTA) | (1<<TWEN) | (1<<TWIE);
while(!I2CFLAG);
ta=TWSR;
/* set address+R*/
I2CFLAG=false;
TWDR=0x41;
TWCR= (1<<TWINT) | (1<<TWEA) | (1<<TWEN) | (1<<TWIE);
while(!I2CFLAG);
tb=TWSR;
/* get data*/
I2CFLAG=false;
TWCR= (1<<TWINT) | (1<<TWEA) | (1<<TWEN) | (1<<TWIE);
while(!I2CFLAG);
tc=TWSR;
twdata=TWDR;
/*stop*/
I2CFLAG=false;
TWCR= (1<<TWINT) | (1<<TWSTO) | (1<<TWEN) | (1<<TWIE);
while(!I2CFLAG);
te=TWSR;
tdata1=TWDR;
/* end of process */