Problemas continuos con I2C en Atmega328p

0

Tengo el siguiente esquema:

elconectordelarnésvaa TCA9548A como se indica a continuación:

segúnlahojadedatosdelIC,ladirecciónes0x70ypuedefuncionarcon100kHzo400kHz.HeejecutadoestecódigoeneluC:

#defineF_CPU8000000UL#defineSCL_CLOCK400000//I'vetriedboth100khztoo#defineBAUD9600#defineMYUBRRF_CPU/8/BAUD-1#defineTWIMUX0x70#include<avr/io.h>#include<util/delay.h>#include<stdio.h>#include<util/twi.h>#include<avr/interrupt.h>voidinit_i2c(void){uint8_ttwst;charadd=0x70;shorti=0;TWSR=0;//noprescalerTWBR=((F_CPU/SCL_CLOCK)-16)/2;TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);printf("TWCR 0x%x \n",TWCR);
     while(!(TWCR & (1<< TWINT)));
     printf(" Start condition has been transmitted \n");
     if( (TWSR & 0xF8) != TW_START){
         printf(" TWSR start 0x%x\n",TWSR);
     }

        for  ( i  =0 ; i< 8 ; i++ ){  // After trying everything with 0x70 I tought the problem could be with the address 

     // Setting Address 
     TWDR = add; 
     // clearing TWCR 
     TWCR = (1<<TWINT) |(1<<TWEN);
     while (!(TWCR & (1<<TWINT)));
     twst = (TWSR&0xF8);
    if ((TWSR & 0xF8) != TW_MT_SLA_ACK){
         printf("Device address wrong  at TWSR   0x%x    SLA_ACK  0x%x  address 0x%x \n",twst, TW_MT_SLA_ACK,add);  // here is the problem !!!!!!!!!  TWSR value should be 0x18
         add++;
    }else {
        printf("device found at 0x%x   TWSR : 0x%x \n",add,TWSR);
    }
    }
 }


.............................................


int main(void)
{
    unsigned short i = 0 ; 
      DDRD |= (1 << PD5);       // damit ist dann PB0 ein Ausgang
        // UART init and printf 
    init_uart(MYUBRR);
    stdout = &mystdout;

    init_i2c(); 
    while(1){
    }
    }

Aquí está la salida que obtengo:

Entonces,comopuedesver,noobtengoelACKdelesclavo.

aquíesloquepuedoverenelalcance:

para100Khz:

para400kHz

Ambas medidas son para la dirección 0x70. mi pregunta es qué estoy haciendo mal aquí, y ¿por qué tanto SCL como SDA no están en una posición de alto despiste? ¿Es una configuración de software que me falta?

gracias por tu ayuda!

    
pregunta Engine

3 respuestas

1

No veo un bit de inicio. El bit de inicio es cuando SDA baja, mientras que SCL permanece alto. Creo que cada nueva transacción comienza con un bit de inicio. Ver P13 / 14 de la hoja de datos. ¿Quizás no se muestra (y está fuera de la pantalla de alcance)?

También. Tal vez parte de lo que dijo dannyf. Intente la dirección 0xE0. La dirección I2C de su chip es de hecho 0x70. Sin embargo esto solo tiene 7 bits de ancho. Dependiendo de la implementación del firmware, es posible que deba cambiar este valor a la izquierda en uno o en el bit de lectura / escritura.

Por sus trazas de alcance, me parece que está enviando y sin cambios 0x70, y el resultado está siendo nak'd (no hay chip en esa dirección).

Para descifrar los datos transmitidos en las trazas de alcance, observe dónde sube el scl y la condición de sda (es alta o baja).

Para leer desde este chip, envíe 0xE1, luego cualquier otro (si hay) datos. Para escribir desde este chip, envía 0xE0, y luego lo que sea para escribir.

Aquí es donde tener una sonda lógica realmente, realmente ayuda. Hay muchas herramientas baratas (y no baratas) disponibles.

    
respondido por el Chris Knudsen
0

Intente ejecutar un código de escáner i2c en su ATmega, para verificar si la dirección es correcta.

Esto mostrará una lista de todas las direcciones de dispositivos i2c conectados.

También hay una i2c master library aquí que podría facilitar las cosas.

    
respondido por el cyberponk
-2

no podría haber sido señalización I2c. Tal vez la sonda de su alcance está mal colocada?

¿O tal vez el módulo twi está en el modo incorrecto?

editar:

  

la dirección es 0x70

0xe0.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas