Суть проблемы. DS1621 не отзывается на команды по i2c. Есть схема, где на шине i2c висит два устройства (адреса разные). DS3231 и DS1621. С часами вопросов нет, время пишется/читается корректно. Т.е. i2c реализован корректно. С DS1621 совершенные непонятки. В Протеусе сканер i2c показывает, что на любую команду (типа посылки адреса и т.п.) устройство отвечает NACK.
в Протеусе вроде как все правильно подключено:
код работы с DS1621 выглядит следующим образом:
Код: Выделить всё
// Адрес устройства
#define DS1621_ADR 0x48
// Адреса регистров
#define DS1621_READ_TEMPR 0xAA // Адрес регистра чтения температуры
#define DS1621_READ_COUNTER 0xA8 // Адрес регистра reads the value Count_Remain
#define DS1621_RAED_SLOPE 0xA9 // Адрес регистра reads the value Count_Per_C
#define DS1621_START_CONVERT 0xEE // Адрес регистра begins a temperature conversion
#define DS1621_STOP_CONVERT 0x22 // Адрес регистра stops temperature conversion
#define DS1621_ACCES_TH 0xA1 // Адрес регистра high temperature limit value into TH register
#define DS1621_ACCES_TL 0xA2 // Адрес регистра low temperature limit value into TH register
#define DS1621_ACCES_CONFIG 0xAC // Адрес регистра configuration data to configuration register
// Funcion to init DS1621
//******************************************************************
void ds1621_init(void)
{
//BYTE temp = 0;
i2c_init();
i2c_start();
i2c_send_byte(DS1621_ADR);
i2c_send_byte(DS1621_ACCES_CONFIG);
i2c_send_byte(0x01); //в LSB конфигурационного байта пишем 1 — преобр. по запросу.
i2c_restart();
i2c_send_byte(DS1621_ADR);
i2c_send_byte(DS1621_START_CONVERT);
i2c_stop();
}
// get temperature ----------------------------------------------
char getTemperatura(void)
{
//uint8_t actualtemperatura;
i2c_start();
i2c_send_byte(DS1621_ADR);
i2c_send_byte(DS1621_READ_TEMPR);
temperatura = i2c_read_byte(NACK);
i2c_restart();
i2c_send_byte(DS1621_ADR);
i2c_send_byte(DS1621_START_CONVERT);
i2c_stop();
}

