Данная реализация функции осуществляется на основе данных из rm0008 и es096.
Тайминги заданные в примере рассчитаны для режима стандартной скорости (100кГц) при частоте тактирования шины 8МГц. void I2C1_Init (void) {
//1 - Отключите периферийное устройство I2C, очистив бит PE в регистре I2Cx_CR1.
I2C1->CR1 &= ~I2C_CR1_PE; //Отключение модуля
//2 - Настройте входы/выходы SCL и SDA как выходы общего назначения с открытым стоком, высокий уровень (запишите 1 в GPIOx_ODR).
GPIOB->CRL |= GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0; //SCL and SDA - Open-Drain выходы общего назначения, макс.скорость 2МГц
GPIOB->BSRR = GPIO_BSRR_BS6 | GPIO_BSRR_BS7; //Высокий уровень на выходах SCL и SDA
//3 - Check SCL and SDA High level in GPIOx_IDR. Проверьте высокий уровень SCL и SDA в GPIOx_IDR.
while (!(GPIOB->IDR &(GPIO_IDR_IDR6 | GPIO_IDR_IDR7)));
//4 - Настройте ввод-вывод SDA как выход общего назначения с открытым стоком, низкий уровень (запишите 0 в GPIOx_O