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でテストしています。時計が設定されていることがわかります。
詳細が必要な場合、私はそれを投稿します。
あなたがアドレスを選択した後、「STOP」信号をアサートする必要がDS1307_Read()
で