Problema en la lectura / escritura de bytes con atmega16 y 24LC256 EEPROM

0

Soy un principiante en el mundo MCU. He aprendido muy pocas cosas y me he sentido bastante bien. Estoy tratando de experimentar con mi chip eeprom Atmega16 y 24LC256. Después de hacer todas las conexiones necesarias en el tablero, cargué mi programa en atmega16. Mi problema es que después de leer mis datos después de escribirlos en la memoria flash, siempre está devolviendo 0xFF. No puedo entender qué está mal aquí. Por favor, ayúdame a descubrir el problema. Aquí está mi código:

#ifndef F_CPU                    // if F_CPU was not defined in Project -> Properties
#define F_CPU 2000000UL            // define it now as 2 MHz unsigned long
#endif
#include <avr/io.h>
#include<avr/interrupt.h>
#include "util/delay.h"
#define EEPROM_WRITE 0xA0
#define EEPROM_READ 0xA1
void i2c_init()
{
    //set SCL to 100kHz
    // CPU freq = 2MHz
    TWSR = 0x00;
    TWBR = (1<<TWPS1);
    //enable TWI
    TWCR = (1<<TWEN);
}
void i2c_start()
{
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while ((TWCR & (1<<TWINT)) == 0);
}
void i2c_stop()
{
    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
    _delay_ms(100);
}
void i2c_write(uint8_t u8data)
{
    TWDR = u8data;
    TWCR = (1<<TWINT)|(1<<TWEN);
    while ((TWCR & (1<<TWINT)) == 0);
    _delay_ms(10);
}
//read byte with NACK
uint8_t i2c_read()
{
    //TWCR = (1<<TWINT)|(1<<TWEN);
    //while ((TWCR & (1<<TWINT)) == 0);
    //return TWDR;

    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
    while ((TWCR & (1<<TWINT)) == 0);
    return TWDR;
}
int main()
{
    i2c_init();
    uint8_t readByte=0;
    uint16_t address=0x0;
    uint8_t writeVal=0;
    while (1)
    {
        for (int a =0;a<128;a++)
        {
            i2c_start();
            i2c_write(EEPROM_WRITE);
            i2c_write(address>>8);
            i2c_write(address & 0xFF);
            i2c_write(writeVal);
            i2c_stop();
            writeVal++;
            address++;
        }

        address=0;
        for (int a =0;a<128;a++)
        {
            i2c_start();
            i2c_write(EEPROM_READ);
            i2c_write(address>>8);
            i2c_write(address & 0xFF);
            readByte =i2c_read();
            _delay_ms(10);
            i2c_stop();
            address++;
        }
    }
    return 0;
}
    
pregunta Embedd_Khurja

0 respuestas

Lea otras preguntas en las etiquetas