#define SCL PD0
#define SDA PD1
#define DDRD_SCL (1<<PD0)
#define DDRD_SDA (1<<PD1)
#define clock_adr 0b11010000
#include <avr/io.h>
#include <util/twi.h>
#include <util/delay.h>
void I2C_Start()
{
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1<<TWINT)));//пока не сработает прерывание по завершению работы, из функции не выходим
}
void I2C_ReStart()
{
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
}
void I2C_Wtite_adress(uint8_t adress)
{
TWDR = adress|0;
TWCR = (1 << TWINT) | (1 << TWEN);// делаем запись байта
while (!(TWCR & (1 << TWINT)));
}
void I2C_Wtite_data(uint8_t data)
{
TWDR = data;
TWCR = (1 << TWINT) | (1 << TWEN);// делаем запись байта
while (!(TWCR & (1 << TWINT)));
}
void I2C_Stop()
{
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
}
int main(void)
{
Serial.begin(115200);
//инициализация I2C
TWBR=0xff;//выбрали саму низкую скорость без предделителя
TWBR = 72; // TWBR = (F_CPU / SCL_FREQ - 16) / 2
TWSR = 0x00; // Режим работы: TWPS = 0 (делитель = 1)
TWAR=0xfa;// задаем адрес нашего устройства
TWCR=(1<<TWEN)|(1<<TWIE);// разрешили работу и прерывание I2C
// I2C_Start();
// I2C_Wtite_data(clock_adr);
I2C_Start();
I2C_Wtite_adress(clock_adr|0);//7 бит адреса и "0" бит write="0"
I2C_Stop();
while(1)
{
I2C_Start();
I2C_Wtite_adress(clock_adr|0);//7 бит адреса и "0" бит write="0"
I2C_Stop();
_delay_ms(100);
// I2C_Wtite_data(0x00);
// I2C_Start();
// I2C_Stop();
// I2C_Start();
//Serial.println(TW_WRITE);
}
}