atmega2560 i2c problemas

0

Estoy intentando usar un atmega2560 pero no puedo hacer funcionar el I2C. Cuando envío el byte de dirección, nunca recibo una respuesta automática. ¿Alguien ve lo que estoy haciendo mal? ¿Usé el código de la hoja de datos? Lo probé con un analizador lógico y funciona, así que sé que el IC no está defectuoso.

void i2csend(uint8_t addr, uint8_t reg, uint8_t data){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
   while(!(TWCR & (1<<TWINT)));
   if ((TWSR & 0xF8) != 0x08)//A  START  condition  has  been transmitted
   {
    stopi2c();
    return;
   }
   TWDR = addr;
   TWCR = (1<<TWINT) | (1<<TWEN);
   while(!(TWCR & (1<<TWINT)));
   if ((TWSR & 0xF8) != 0x18)//SLA+W has been transmitted; 
                               ACK has been received
   {
    stopi2c();
    return;
   }    
   TWDR = reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
   while (!(TWCR & (1<<TWINT)));
   if ((TWSR & 0xF8) != 0x28)//Data  byte  has  been  transmitted; 
                               ACK has been received
   {
    stopi2c();
    return;
   }    
   TWDR = data;
   TWCR = (1<<TWINT) | (1<<TWEN);
   while (!(TWCR & (1<<TWINT)));
   if ((TWSR & 0xF8) != 0x28)//Data  byte  has  been  transmitted; 
                               ACK has been received
   {
    stopi2c();
    return;
   }    
   stopi2c();
   return;
}
    
pregunta Dylan

1 respuesta

1

Un problema común cuando se utiliza I2C es olvidarse de cambiar la dirección del esclavo un bit a la izquierda antes de usarla.

Una dirección I2C solo tiene 7 bits justificados a la izquierda con el bit R / W en la parte inferior.

¿No dices cuál es el dispositivo esclavo? ¿Estás seguro de que la dirección del esclavo es correcta?

No he escrito el código i2c para el atmega2560 pero sí lo he hecho para otros miembros de la familia AVR. El último que hice para un atmega328 usé la biblioteca de la biblioteca Fleury I2C .

Me resultó útil escribir un escáner I2C que intentaría leer todas las direcciones i2c e imprimir las que recibieron un ACK.

    
respondido por el Kevin White

Lea otras preguntas en las etiquetas