2017-01-28 8 views
0

私はATmega168がDS1307とのTWI通信からデータを読み取るためのいくつかの設定関数を書いています。しかし、私は読むことができない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

詳細が必要な場合、私はそれを投稿します。

あなたがアドレスを選択した後、「STOP」信号をアサートする必要が DS1307_Read()

答えて

1

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; 
} 

これはというし、一般的なI2Cの読み取りDS1307特定のインターフェイスであるので、シーケンシャルリードを実行するために、より効率的です/時間/日付データ全体の書き込みはthis example

関連する問題