I2C довольно трудный протокол:
Во-первых иногда адрес устройства неизвестен.
Во-вторых устройство на шине может быть не одно.
В-третьих выводы контроллера должны быть настроены на выход и одновременно на вход.
Лучше начинать с чего-то конкретного, например, с чтения/записи в микросхему 24c256.
Первый положительный опыт I2C на связке STM32F407 / TrueStudio / CubeMX

В проекте подключен FreeRtos автоматом из CubeMx (так на всякий случай).
Из основного потока :
по Кнопке Key2 посылаем данные в микросхему 24256.
по Кнопке Key1 читаем данные.
Даташит на микросхему 24c256 не проблема. Все A0,A1,A2 микросхемы 24с256 на земле. Поэтому адрес у нас будет:
Адрес : (0x50 <<1)
Ну и начинаем гонять данные туда сюда через прерывания :
HAL_I2C_Mem_Write_IT
HAL_I2C_Mem_Read_IT
Важно понимать , где исполняется код для выше перечисленных функций :
Обратите внимание на HAL_I2C_EV_IRQHandle в файле stm32f4xx_hal_i2c.c .
Именно здесь и происходит самое главное: HAL_I2C_Mem_Write_IT не подвешивает поток, по сути она просто инициализирует начало передачи и завершается , а дальше работает механизм прерываний.
Как только байт будет оправлен через i2c канал и приемник подтвердит передачу произойдет вызов HAL_I2C_EV_IRQHandle.
Которая в какой-то момент вызовет I2C_MasterTransmit_BTF. Эта в свою очередь уменьшает каждый раз счетчик
hi2c->XferCount--;
и когда все байты пройдут (XferCount=0) вызовет коллбек функцию HAL_I2C_MemTxCpltCallback , в которой вы и должны написать все что-то считаете нужным, чтобы просигнализировать своему потоку об окончание передачи.
Я для этого просто иcпользую переменную/флаг
masterWaitTransmit_OK=1;
Далее прием аналогичным образом.
Исходники для скачивания ниже:
Хочу добавить , что Atollic Trie Studio реально бесплатная , без ограничений.
Работает отладка, трассировка SWO - просто наслаждение! Рекомендую ...
Файлы для скачивания
*
STM32F407 TrueStudio CubeMX FreeRTOS I2C рабочий проект