2017-01-28 3 views
0

Я написал некоторую функцию конфигурации для 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, и он показывает мне, что часы установлены.

enter image description here

если больше деталей необходимы я выложу их.

ответ

1

В DS1307_Read() вы должны утверждать «СТОП» сигнала после выбора адреса:

uint8_t DS1307_Read(uint8_t address) 
{  
    unsigned short r_data; 

    TW_start(); 
    TW_write(DS1307); 
    TW_write(address); 
    TW_stop();   // <-- STOP 

    TW_start(); 
    TW_write(DS1307 + 1); 
    r_data = TW_read(); 
    TW_stop(); 

    return r_data; 
} 

Поскольку это специальный интерфейс DS1307, а затем общий I2C чтения, было бы более эффективным для выполнения последовательного чтения/написать все данные о времени и дате, как в this example

Смежные вопросы