EEPROM серии 24cXX
Добавлено: Чт сен 16, 2010 13:55:28
разбираюсь с работой eeprom 24сxx вот по этой статье
http://avrlab.com/node/84
проверяю в протеусе. пишу 1 байт, читаю 1 байт. писать получается, а читать не хочет. меga8 + 12МГц кварц запись тоже не работала пока не закоментировал последнее условие while(TWCR & (1<<TWSTO)); (насколько это корректно?) вот функция записи.
может кто чего подскажет?
да нет, вроде как работает, и всёже последнее условие закоментировано while(TWCR & (1<<TWSTO)); (насколько это корректно?)
http://avrlab.com/node/84
проверяю в протеусе. пишу 1 байт, читаю 1 байт. писать получается, а читать не хочет. меga8 + 12МГц кварц запись тоже не работала пока не закоментировал последнее условие while(TWCR & (1<<TWSTO)); (насколько это корректно?) вот функция записи.
Код: Выделить всё
uint8_t EEWriteByte(uint16_t address,uint8_t data)
{
do
{
//Put Start Condition on TWI Bus
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
//Poll Till Done
while(!(TWCR & (1<<TWINT)));
//Check status
if((TWSR & 0xF8) != 0x08)
return FALSE;
//Now write SLA+W
//EEPROM @ 00h
TWDR=TWI_SLA_24CXX;
//Initiate Transfer
TWCR=(1<<TWINT)|(1<<TWEN);
//Poll Till Done
while(!(TWCR & (1<<TWINT)));
}while((TWSR & 0xF8) != 0x18);
//Now write ADDRH
TWDR=(address>>8);
//Initiate Transfer
TWCR=(1<<TWINT)|(1<<TWEN);
//Poll Till Done
while(!(TWCR & (1<<TWINT)));
//Check status
if((TWSR & 0xF8) != 0x28)
return FALSE;
//Now write ADDRL
TWDR=(address);
//Initiate Transfer
TWCR=(1<<TWINT)|(1<<TWEN);
//Poll Till Done
while(!(TWCR & (1<<TWINT)));
//Check status
if((TWSR & 0xF8) != 0x28)
return FALSE;
//Now write DATA
TWDR=(data);
//Initiate Transfer
TWCR=(1<<TWINT)|(1<<TWEN);
//Poll Till Done
while(!(TWCR & (1<<TWINT)));
//Check status
if((TWSR & 0xF8) != 0x28)
return FALSE;
//Put Stop Condition on bus
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
_delay_ms(12);
//Wait for STOP to finish
// while(TWCR & (1<<TWSTO));
//_delay_ms(12);
// //Wait untill Writing is complete
return TRUE;
}
да нет, вроде как работает, и всёже последнее условие закоментировано while(TWCR & (1<<TWSTO)); (насколько это корректно?)