#define adress 0x7e
void i2c_init (void)
{
SET_BIT(RCC->AHBENR,RCC_AHBENR_GPIOAEN);
GPIOA->MODER |=GPIO_MODER_MODER9_1;
GPIOA->OSPEEDR|=GPIO_OSPEEDER_OSPEEDR9; //альтернативная функция AF4 для PA9
GPIOA->AFR[1]|=(4<<4);
GPIOA->MODER|=GPIO_MODER_MODER10_1;
GPIOA->OSPEEDR|=GPIO_OSPEEDER_OSPEEDR10; // //альтернативная функция AF4 для PA10
GPIOA->AFR[1]|=(4<<8);
RCC->APB1ENR |=RCC_APB1ENR_I2C1EN; // включаем тактирование
RCC->CFGR3|=RCC_CFGR3_I2C1SW; //источник тактирования
I2C1->TIMINGR=0X10420F13; // настройка таймингов при частоте 8 MHz
I2C1->CR1|=I2C_CR1_PE; // включаем модуль
}
void write_i2c (unsigned char adr,unsigned char data) //функция передачи
{
I2C1->CR2=I2C_CR2_AUTOEND|(2<<16)|I2C_CR2_START|(adress<<1); // передаем адрес ведомого , автостоп , условие старта.
while ((I2C1->ISR&I2C_ISR_TXE)!= I2C_ISR_TXE); //ждем передачи адреса
I2C1->TXDR=adr; //посылаем адрес ячейки в который хотим писать данные
while ((I2C1->ISR&I2C_ISR_TXIS)!= I2C_ISR_TXIS); //ждем окончания посылки
I2C1->TXDR=data; //отправляем данные
while ((I2C1->ISR&I2C_ISR_BUSY)==I2C_ISR_BUSY); //ждем освобождения шины
}


