скрытое меню
I2C

STM32F407-TrueStudio-CubeMX

I2C довольно трудный протокол:

Во-первых иногда адрес устройства неизвестен.

Во-вторых устройство на шине может быть не одно.

В-третьих выводы контроллера должны быть настроены на выход и одновременно на вход.

Лучше начинать с чего-то конкретного, например, с чтения/записи в микросхему 24c256.

Первый положительный опыт I2C на связке STM32F407 / TrueStudio / CubeMX

фотка 1

В проекте подключен 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 - просто наслаждение! Рекомендую ...

Файлы для скачивания

* TrueStudio I2C 24c256 STM32F407 FreeRtos [zip]
STM32F407 TrueStudio CubeMX FreeRTOS I2C рабочий проект