unsigned char EEPROM_init
(
unsigned int adr
)
{
TWBR = 20;
TWSR = 0x00;
//transmit START
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
// отлавливаем правильность посылки START
if ((TWSR & 0xf8) != 0x08)
{
TWCR = 0;
return( 1 );
}
// set slave address for write
TWDR = 0xa0;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x18)
{
TWCR = 0;
return( 1 );
}
// set low byte address
TWDR = (unsigned char)(adr & 0x00ff);
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x28)
{
TWCR = 0;
return( 1 );
}
// set hi byte address
TWDR = (unsigned char)(adr>>8);
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x28)
{
TWCR = 0;
return( 1 );
}
return( 0 );
}
__monitor unsigned char EEPROM_write_byte
(
unsigned int adr,
unsigned char data
)
{
// PORTE &= ~0x08;
if (EEPROM_init( adr )) return( 1 );
// write byte
TWDR = data;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x28)
{
TWCR = 0;
return( 1 );
}
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
__delay_cycles( 80000 ); // задержка на 5.4 мс
// PORTE |= 0x08;
return( 0 );
}
__monitor unsigned char EEPROM_read_byte
(
unsigned int adr,
unsigned char * refdata
)
{
// PORTE &= ~0x08;
if (EEPROM_init( adr )) return( 1 );
//transmit repeate START
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf0) != 0x10)
{
TWCR = 0;
return( 1 );
}
// set slave address for read
TWDR = 0xa1;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x40)
{
TWCR = 0;
return( 1 );
}
//get data
TWCR = (1<<TWINT)|(1<<TWEN); // NO_ASK
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x58)
{
TWCR = 0;
return( 1 );
}
else *refdata = TWDR;
//transmit STOP
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
__delay_cycles( 147 ); // задержка на 10 мкс
// PORTE |= 0x08;
return( 0 );
}
__monitor unsigned char EEPROM_read_str
(
unsigned int adr,
unsigned char * refdata
)
{
// PORTE &= ~0x08;
if (EEPROM_init( adr )) return( 1 );
//transmit repeate START
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf0) != 0x10)
{
return( 1 );
}
// set slave address for read
TWDR = 0xa1;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x40)
{
return( 1 );
}
//get data
for( unsigned char i=0; i<8; i++ )
{
if (i != 7) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
else TWCR = (1<<TWINT)|(1<<TWEN); // NO_ASK
while (!(TWCR & (1<<TWINT)));
if (i != 7)
{
if ((TWSR & 0xf8) != 0x50) return( 1 );
else refdata[ i ] = TWDR;
}
else
{
if ((TWSR & 0xf8) != 0x58) return( 1 );
else refdata[ i ] = TWDR;
}
}
//transmit STOP
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
__delay_cycles( 147 ); // задержка на 10 мкс
// PORTE |= 0x08;
return( 0 );
}