Я написал некоторую функцию конфигурации для ATmega168 для чтения данных из TWI-связи с DS1307. Но я могу писать в DS1307, не прочитав. Кто-нибудь может мне помочь.как написать avr I2C функция чтения считывателя
это мои функции:
void TW_init(void)
{
TWBR = 2;
TWSR = (1 << TWPS1);
TWCR = (1 << TWEN);
}
void TW_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
}
void TW_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
void TW_write(uint8_t data)
{
TWDR = data;
TWCR = (1 << TWEN)|(1 << TWINT);
while(!(TWCR & (1 << TWINT)));
}
uint8_t TW_read(void)
{
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1 << TWINT)));
return TWDR;
}
uint8_t DS1307_Read(uint8_t address)
{
unsigned short r_data;
TW_start();
TW_write(DS1307);
TW_write(address);
TW_start();
TW_write(DS1307 + 1);
r_data = TW_read();
TW_stop();
return r_data;
}
uint8_t DS1307_Write(uint8_t address, uint8_t w_data)
{
TW_start();
TW_write(DS1307);
TW_write(address);
TW_write(w_data);
TW_stop();
}
Я пробовал много, чтобы исправить свои функции конфигурации, но я не могу найти ошибку или чего не хватает, так, может быть, кто-то эли может мне помочь с корректировкой его. Я тестирую его в Proteus, и он показывает мне, что часы установлены.
если больше деталей необходимы я выложу их.