Вот код мастера для тинки
Код
i2c_start();
i2c_tx_addr( (0x26<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT) );
i2c_tx(0x41);
i2c_stop();
Вот для часиков
Код
i2c_start();
i2c_tx_addr( (0x68<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT) );
i2c_tx(0);
i2c_start();
i2c_tx_addr( (0x68<<TWI_ADR_BITS) | (TRUE<<TWI_READ_BIT) );
rtc_var->seconds = i2c_rx(ACK);
rtc_var->minutes = i2c_rx(ACK);
rtc_var->hours = i2c_rx(ACK);
i2c_rx(ACK);
rtc_var->day = i2c_rx(ACK);
rtc_var->month = i2c_rx(ACK);
rtc_var->year = i2c_rx(NOT_ACK);
i2c_stop();
Вот tx и rx
Код
void i2c_tx(unsigned char byte)
{
if(i2c_error)
return;
i2c_delay();
TWDR = byte;
TWCR = ((1<<TWINT)+(1<<TWEN));
i2c_delay();
if(TWSR != MTX_DATA_ACK)
i2c_error=1;
}
unsigned char i2c_rx(unsigned char last_byte)
{
if(i2c_error)
return 0;
i2c_delay();
if(last_byte)
TWCR = ((1<<TWINT)+(1<<TWEN)+(1<<TWEA));
else
TWCR=((1<<TWINT)|(1<<TWEN));
i2c_delay();
if(((TWSR != MRX_DATA_NACK)&&(last_byte == NOT_ACK))&&(TWSR != MRX_DATA_ACK))
i2c_error=1;
return TWDR;
}
В общем все, убрал по вашей наводке i2c_stop(); из обмена с тинкой.
В протеусе ерунда полная, в железе все работает вроде, почти все...
Без этого стопа, если тинку отключить, то часики перестают читаться тоже
Ну да все равно, Спасибо большое )))
Сообщение отредактировал AlexTech - Jan 31 2011, 21:48