Best regard
I'm making a circuit using ATMEGA32 that run in 11.0592 MHz crystal.
I want to add an at24c256 to the circuit
I have a code, But the data that I write to the eeprom didn't match the data I read from the eeporm.
Here is my code
=======
//#=============================================================================#
//#Nu revision September 9th 2008, Add init_eeprom, convert AT24C16 to AT24C256 #
//#=============================================================================#
#include <UTIL/DELAY.h>
#include <AVR/io.h>
#include <avr/interrupt.h>
#include "var_parameter.h"
#include "eeprom.h"
void init_eeprom(void)
{
SREG |= 0x80;//global interrupt enabled
EEPROM_DDR |= ((1 << SDA) | (1 << SCL));//SDA &SCL become output line
TWSR &= 0xFC;//no bit rate prescaler
TWBR = 10;//
}
//=====================================================================
// EEPROM Device ATMEL AT24C256, 32 Kilo Byte EEPROM
//=====================================================================
//-- Writing single address only
unsigned char eeprom_write(unsigned char type, unsigned char dev_addr, unsigned short int addr, unsigned char length)
{
unsigned char i;
unsigned char err = 1;
unsigned char hi_addr = addr >> 8;
unsigned char lo_addr = (unsigned char)addr;
unsigned char sla_w = dev_addr & 0xFE;
if (addr > MAX_ADDR)//exit if address invalid
return 1;
//----------Initiate Start Bit
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));//wait until TWI interrupt occured
if ((TWSR & STATUS_CHECK) == START) {//start have transmitted?
//-----------Send SLA_W
TWDR = sla_w;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == SLA_W_ACK) {//sla+w have transmitted?
//-------------Send High Address
TWDR = hi_addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == MT_DATA_ACK) {//High address have transmitted?
//---------------Send Lo Address
TWDR = lo_addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == MT_DATA_ACK) {//Low address have transmitted?
//------------------Send Data
err = 0;
for (i = 0; i < length; i++) {
TWDR = eeprom_buffer;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != MT_DATA_ACK) {//data transmitted?
err = 1;
break;
}
}
}
}
}
}
//---------Initiate Communication Stop
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
TWCR &= ~(1 << TWEN);//disable TWI function
PORTA = err;
return err;
}
unsigned char eeprom_read(unsigned char type, unsigned char dev_addr, unsigned short int addr, unsigned char length)
{
unsigned char sla_w = dev_addr & 0xFE;
unsigned char sla_r = dev_addr | 0x01;
unsigned char err = 1;
unsigned char i;
unsigned char mode = START;
unsigned char hi_addr = addr >> 8;
unsigned char lo_addr = (unsigned char)addr;
if (type == random) {//dummy write to make the pointer point the selected address
PORTA = 0x01;
mode = REPEATED_START;
TWCR = TWI_START;
while (!(TWCR & (1 << TWINT)));
PORTA = 0x02;
if ((TWSR & STATUS_CHECK) == mode) {//start transmitted?
PORTA = 0x03;
TWDR = sla_w;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == SLA_W_ACK) {//sla+w transmitted?
TWDR = hi_addr;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == SLA_W_ACK) {//High Address transmitted?
TWDR = lo_addr;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) != MT_DATA_ACK) //Low Address transmitted?
return err;
}
}
}
}
TWCR = TWI_START;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == mode) {//start transmitted?
TWDR = sla_r;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == SLA_R_ACK) {//sla+r transmitted?
err = 0;
i = 0;
for (i = 0; i < length; i++) {
if (i == length - 1)//read last byte
TWCR = TWI_DATA_NACK;
else //read byte then continue read again
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == MR_DATA_ACK || (TWSR & STATUS_CHECK) == MR_DATA_NACK)
eeprom_buffer = TWDR;
else {//break operation if error comm occured
err = 1;
break;
}
}
}
}
TWCR = TWI_STOP;//stop communication
TWCR &= ~(1 << TWEN);//disable TWI function
return err;
}
========
Is there anything wrong???
How to make it work correctly?
Is there someone who have make the circuit work???
Please help ASAP
I'm making a circuit using ATMEGA32 that run in 11.0592 MHz crystal.
I want to add an at24c256 to the circuit
I have a code, But the data that I write to the eeprom didn't match the data I read from the eeporm.
Here is my code
=======
//#=============================================================================#
//#Nu revision September 9th 2008, Add init_eeprom, convert AT24C16 to AT24C256 #
//#=============================================================================#
#include <UTIL/DELAY.h>
#include <AVR/io.h>
#include <avr/interrupt.h>
#include "var_parameter.h"
#include "eeprom.h"
void init_eeprom(void)
{
SREG |= 0x80;//global interrupt enabled
EEPROM_DDR |= ((1 << SDA) | (1 << SCL));//SDA &SCL become output line
TWSR &= 0xFC;//no bit rate prescaler
TWBR = 10;//
}
//=====================================================================
// EEPROM Device ATMEL AT24C256, 32 Kilo Byte EEPROM
//=====================================================================
//-- Writing single address only
unsigned char eeprom_write(unsigned char type, unsigned char dev_addr, unsigned short int addr, unsigned char length)
{
unsigned char i;
unsigned char err = 1;
unsigned char hi_addr = addr >> 8;
unsigned char lo_addr = (unsigned char)addr;
unsigned char sla_w = dev_addr & 0xFE;
if (addr > MAX_ADDR)//exit if address invalid
return 1;
//----------Initiate Start Bit
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));//wait until TWI interrupt occured
if ((TWSR & STATUS_CHECK) == START) {//start have transmitted?
//-----------Send SLA_W
TWDR = sla_w;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == SLA_W_ACK) {//sla+w have transmitted?
//-------------Send High Address
TWDR = hi_addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == MT_DATA_ACK) {//High address have transmitted?
//---------------Send Lo Address
TWDR = lo_addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == MT_DATA_ACK) {//Low address have transmitted?
//------------------Send Data
err = 0;
for (i = 0; i < length; i++) {
TWDR = eeprom_buffer;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != MT_DATA_ACK) {//data transmitted?
err = 1;
break;
}
}
}
}
}
}
//---------Initiate Communication Stop
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
TWCR &= ~(1 << TWEN);//disable TWI function
PORTA = err;
return err;
}
unsigned char eeprom_read(unsigned char type, unsigned char dev_addr, unsigned short int addr, unsigned char length)
{
unsigned char sla_w = dev_addr & 0xFE;
unsigned char sla_r = dev_addr | 0x01;
unsigned char err = 1;
unsigned char i;
unsigned char mode = START;
unsigned char hi_addr = addr >> 8;
unsigned char lo_addr = (unsigned char)addr;
if (type == random) {//dummy write to make the pointer point the selected address
PORTA = 0x01;
mode = REPEATED_START;
TWCR = TWI_START;
while (!(TWCR & (1 << TWINT)));
PORTA = 0x02;
if ((TWSR & STATUS_CHECK) == mode) {//start transmitted?
PORTA = 0x03;
TWDR = sla_w;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == SLA_W_ACK) {//sla+w transmitted?
TWDR = hi_addr;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == SLA_W_ACK) {//High Address transmitted?
TWDR = lo_addr;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) != MT_DATA_ACK) //Low Address transmitted?
return err;
}
}
}
}
TWCR = TWI_START;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == mode) {//start transmitted?
TWDR = sla_r;
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == SLA_R_ACK) {//sla+r transmitted?
err = 0;
i = 0;
for (i = 0; i < length; i++) {
if (i == length - 1)//read last byte
TWCR = TWI_DATA_NACK;
else //read byte then continue read again
TWCR = TWI_DATA;
while (!(TWCR & (1 << TWINT)));
if ((TWSR & STATUS_CHECK) == MR_DATA_ACK || (TWSR & STATUS_CHECK) == MR_DATA_NACK)
eeprom_buffer = TWDR;
else {//break operation if error comm occured
err = 1;
break;
}
}
}
}
TWCR = TWI_STOP;//stop communication
TWCR &= ~(1 << TWEN);//disable TWI function
return err;
}
========
Is there anything wrong???
How to make it work correctly?
Is there someone who have make the circuit work???
Please help ASAP