La interfaz I2C con ATmega32 y ArduinoMega2560 falló

0

Estoy probando I2C para conectar el ATmega32 con la placa Arduino Mega2560 sin éxito.

La placa Arduino está configurada para ser la Lectura maestra.
El Atmega32 está configurado para ser Slave Write.

He conectado los cables como en la imagen a continuación:

ElcódigoparaATmega32enAtmel6:

#include<avr/io.h>#include"I2C_slave.h"

void i2c_initSlave(unsigned char slaveAddress)
    {
        TWCR = 0x04;
        TWAR = slaveAddress;
        TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
    }

    //*************************************************

    void i2c_send(unsigned char data)
    {
        TWDR = data;
        TWCR = (1<<TWINT) | (1<<TWEN);
        while ((TWCR & (1<<TWINT))== 0);
    }

    //*************************************************

    void i2c_listen()
    {
        while ((TWCR & (1<<TWINT)) == 0);
    }


int main(void)
{
    int PIN = 0x02;
    DDRC &= ~PIN;  

    i2c_initSlave(0x90);

    i2c_listen();
    i2c_send("G");

    while(1)
    {
        return 0; 
    }
}

El Código para el Arduino Board:

#include <Wire.h>

#define TRANCEIVER_ADDRESS 0x90


void setup()
{
  Wire.begin(TRANCEIVER_ADDRESS);  // join i2c bus (address optional for master)
  Serial.begin(115200);  // start serial for output
}

void loop()
{
  Serial.println("HALLO");

  Wire.requestFrom(TRANCEIVER_ADDRESS, 2);

  while(Wire.available())    // slave may send less than requested
  { 
    char c = Wire.read(); // receive a byte as character
    Serial.print(c);         // print the character
  }

  delay(500);
}

Como se describe en el código, uso Dirección 0x90 para establecer la conexión y enviar el carácter "G" de ATmega32 a Arduino. La salida que obtuve en la ventana SerialCommand en Arduino IDE es como en la imagen a continuación:

Eso significa NO CONEXIÓN !!!

¿Alguien podría detectar el problema? Creo que el problema está en el código ATmega32.

¿El DDRC y el PORTC están configurados correctamente para el MASTER READ?

DDRC=0xFF;
PORTC=0x00;

No estoy seguro. O debería ser el PORTC

PORTC=0xFF;

¿Podría alguien explicarme?

    
pregunta AdiT

2 respuestas

1

En el código PIC como I2C esclavo, use:

i2c(Slave, sda=PIN_C4, scl=PIN_C3, address=0xa0, FORCE_HW, FAST);

En el código de Arduino como maestro I2C, use:

const int SLAVE_ADDRESS2 = 0xA0;  // esclavo PIC
Wire.beginTransmission(SLAVE_ADDRESS2 >> 1);
    
respondido por el Juanjo
0

Aquí hay algunos errores que noté en tu código:

1) La dirección del esclavo es solo de 7 bits (de 0x00 a 0x7F), por lo que 0x90 está fuera de rango, y también se colocó en forma de b1 ~ b7 en TWAR .

void i2c_initSlave(unsigned char slaveAddress)
{
    TWCR = 0x04;
    TWAR = (slaveAddress << 1); // It shoule be shifted by 1
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
}

2) En i2c_send("G") estás enviando un puntero mientras que la función void i2c_send(unsigned char data) está tomando el argumento unsigned char , corrige esto llamándolo como i2c_send('G');

3) Coloca i2c_send("G") fuera del bucle while por lo que solo se transmitirá una vez.

    
respondido por el Nasr

Lea otras preguntas en las etiquetas