Написал вот такой класс для работы с модулем I2C на STM32:
https://github.com/KivApple/ControllerFramework/blob/a07c28b93f160b2f1fddaf07...
https://github.com/KivApple/ControllerFramework/blob/a07c28b93f160b2f1fddaf07...
Используются примитивы BinarySemaphore и Mutex от FreeRTOS (простейшие C++ обёртки), поэтому вряд ли проблема в них.
Для теста общаюсь с MPU6050. Делаю следующие операции:
Прочитать регистр 0x75 (по факту отправка 1 байта, а потом приём 1 байта)
Записать 0 регистр в регистр 0x6B (по факту отправка 2 байт)
Прочитать 16-битный регистр 0x3B (по факту отправка 1 байта и приём 2 байт)
Подождать полсекунды и повторить
В настоящий момент код вроде как отлично работает, однако для этого мне пришлось добавить отключение тактирования модуля I2C после каждой операции и включение его лишь непосредственно перед ней. Без этого при компиляции с -O2 через какое-то время работы происходила ошибка чтения 16-битного регистра и после этого ни одной успешной операции.
Мне такой подход не нравится, потому что я не смогу добавить поддержку режима slave (модуль же отключен всё время, пока не передаёт с режиме master). Что я делаю не так?