Инициализация
Для того, чтобы начать работу с I2C, необходимо инициализировать сам модуль, а также те выводы микроконтроллера, по которым будет осуществляться передача данных.
typedef struct {
  uint32_t I2C_ClockSpeed;
  uint16_t I2C_Mode;
  uint16_t I2C_DutyCycle;
  uint16_t I2C_OwnAddress1;
  uint16_t I2C_Ack;
  uint16_t I2C_AcknowledgedAddress;
} I2C_InitTypeDef;
I2C_ClockSpeedчастота тактового сигнала, максимум – 400 КГц
I2C_Modeрежим работы
I2C_DutyCycleнастройки для работы в быстром режиме
I2C_OwnAddressсобственный адрес устройства
I2C_Ackвключено или нет использование бита подтверждения Ack
I2C_AcknowledgedAddressвыбор формата адреса, 7 бит или 10 бит
Предположим, что мы решили работать с первым модулем I2C. Ему соответствуют выводы PB6 (SCL) и PB7 (SDA) и нам необходимо настроить их вместе с самим модулем. Перво-наперво, запускаем тактирование соответствующих модулей:
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
Теперь настроим модуль I2C1:
    i2c.I2C_ClockSpeed = 100000; 
    i2c.I2C_Mode = I2C_Mode_I2C;
    i2c.I2C_DutyCycle = I2C_DutyCycle_2;
    // Адрес я тут взял первый пришедший в голову 
    i2c.I2C_OwnAddress1 = 0x15;
    i2c.I2C_Ack = I2C_Ack_Disable;
    i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_Init(I2C1, &i2c);
Покончив с настройкой модуля I2C1, выполняем настройку выводов, которые им используются для обеспечения передачи данных:
    gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    gpio.GPIO_Mode = GPIO_Mode_AF;			
    gpio.GPIO_Speed = GPIO_Speed_50MHz;
    gpio.GPIO_OType = GPIO_OType_OD;
    gpio.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB, &gpio);
 
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);
Наконец, включаем модуль I2C1:
    I2C_Cmd(I2C1, ENABLE);
Регистры
I2C_CR1Управляющий регистр 1
I2C_CR2Управляющий регистр 2
I2C_OAR1Адресный регистр 1
I2C_OAR2Адресный регистр 2
I2C_DRРегистр данных
I2C_SR1Статусный регистр 1
I2C_SR2Статусный регистр 2
I2C_CCRРегистр управления тактированием
I2C_TRISEРегистр TRISE