Доброго времени суток, пытаюсь понять основы данного протокола.
Имеется простенькая библиотека I2C (см. код ниже) с двумя осн. функциями: установки значения по адресу и чтение
В данной библиотеке запись и чтение идёт с адресацией в пределах 1 байта, мне же нужно использовать её в соответствии со стандартом, используя двухбайтную адресацию данных (вначале старший байт, потом младший) для чтения и записи.
Буду благодарен, если подправите эту библиотеку исходя из этой задачи. Заранее спасибо!
Раздел: AVR
Имеется простенькая библиотека I2C (см. код ниже) с двумя осн. функциями: установки значения по адресу и чтение
В данной библиотеке запись и чтение идёт с адресацией в пределах 1 байта, мне же нужно использовать её в соответствии со стандартом, используя двухбайтную адресацию данных (вначале старший байт, потом младший) для чтения и записи.
Буду благодарен, если подправите эту библиотеку исходя из этой задачи. Заранее спасибо!
#define RTC_RESET_POINTER 0xff
#define ADDRESS 80 //адрес устройства
void RTC_SetValue(uint8_t adr, uint8_t data)
{
/*формируем состояние СТАРТ*/
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
/*выдаемна шину пакет SLA-W*/
TWDR = (ADDRESS <<1)|0;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
/*передаем адрес регистра ds1307*/
TWDR = adr; // запись 8-ми битной переменной адресации
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
/*передаем данные или пропускаем*/
if (data != RTC_RESET_POINTER){
/*это чтобы привести данные к BCD формату*/
data = ((data/10)<<4) + data%10;
TWDR = data;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
}
/*формируем состояние СТОП*/
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
uint8_t RTC_GetValue(void)
{
uint8_t data;
/*формируем состояние СТАРТ*/
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
/*выдаемна шину пакет SLA-R*/
TWDR = (ADDRESS<<1)|1;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
/*считываем данные*/
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
data = TWDR;
/*формируем состояние СТОП*/
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
return data;
}
Раздел: AVR