Продолжаем серию популярных видео по изучению и практике применения STM32. Сегодня закрепляем использование интерфейса I2C на примере переходника I2C для дисплея LCD1602 на плате BlackPill. Исходник видео: cloud.mail.ru/...
Спасибо за труды, но почему во всех уроках по I2C показывают работу только в режиме тупого ожидания? Почему не использовать прерывания? Это же намного эффективнее. И к тому же никто никогда не показывает работу в слэйве, только мастер ну а обработку ошибок вообще никто не затрагивает, а ведь эта шина крайне капризная. По сравнению с АВР здесь крайне глючный блок I2C. Столкнулся с проблемой как раз обработки ошибок при работе одновременно слэйв-мастер. Модуль часто зависает если ловит потерю приоритета или BUS FAIL Если интересно распишу подробнее
Пожалуйста. Но у меня нет цели делать прошивку с наименьшей нагруженностью на мк, показываю именно работу прошивки дисплея. Никто не спорит с эффективностью прерывания и дма. Это каждый сможет прикрутить. Контроллер мастер для дисплея, это норм. Интерфейс глюченный на F1. Тут лучше дело обстоит. Поделитесь опытом, только по подробнее.
@@NRelectronics Да, забыл написать что это про F051. Проблемы было две. Первое это когда мы ловим свой адрес во время передачи, и второе - когда вклинивается другой мастер во время преедачи, ну или просто плохой контакт в линии SDA или SCL. Вторая проблема хуже. МОдуль тупо зависал. Висел флаг BUSY и линия SCL сбрасывалась в 0. И все. никаких больше флагов. Первое решил запретом прерывания ADDR и отключением возможности отзываться на свой адрес I2C_OAR1_OA1EN = 0(то есть режим слэйва выкл) при предаче в режиме мастер. Со вторым сложнее. Если мы вываливаемся в I2C_ISR_BERR или I2C_ISR_ARLO, то смотрим флаг BUSY. Если он стоит (а его, как я понял быть не должно в нормальном случае) - это означает, что модуль завис. Пробуем перезапустить модуль битом PE = 0, PE = 1 и вкатить опять Start. Но бывает, что все равно это не помогает, модуль не висит, но флаги состояния не появляются, пооэтому есть вторая ступень защиты. В нормальном режиме после старта, у меня в очередь задач становится функция Supervisor с задержкой около 15 мс, чтоб с запасом на время передачи. Если мастер отработал успешно, то позавершению, мы удаляем Supervisor из очереди задач не дав ей сработать. То есть в норм ситуации она не работает никогда. А если модуль завис, она вызывается и тогда смотрим, если у нас висит BUSY или моя внутренняя переменная состояния I2C, то тогда ребутим модуль PE = 0, PE = 1. Да в тупом суперцикле этот костыль не проканает, нужен диспетчер задач. Топорно. Дубово, но работает безотказно. Да, это результат моих опытов и мои наблюдения. Может я ошибаюсь и делаю что-то не так, если у кого есть соображения на этот счет, поделитесь пожалуйста
Интересно получалось. Спасибо что поделились опытом, для себя его учту тоже. Побольше таких подписчиков, которые делились опытом реальным а не опытом лежания на диване!
@@NRelectronics Тоже решил реализовать обмен по I2C с помощью прерываний...и как понеслось. Реализовывал master-передатчик и master-приемник. Использовал контроллер F103. Столкнулся с тем что хочу принять 1 байт, вместо этого принимаю 2 байта (1 байт реальных данных, 2 байт 0xFF - т.е нет изменений на линии SDA, а есть просто тактирование на линии SCL). В RM пишут что есть некое событие EV6_1, которое ни с чем не ассоциируется и в нем надо отключить подтверждение и сгенерить СТОП-условие, но не тут то было - этот алгоритм не рабочий! Залез в ERRATA, нашел что реально за STM грешок, есть ошибки принятия лишнего байта) Что они предлагают: среди прочего вывод SCL вывести в режим GPIO и настроить на открытый сток с низким лог. уровнем, а затем вернуть в определенный момент в альтернативную функцию (если интересно почитайте, там 2 страницы, весь алгоритм расписывать лень). В итоге добился что принимаю 1 байт, НО нет СТОП-условия в результате чего, что логично микруха виснет)) и и линия SCL остается в лог. нуле (походу не возвращается в альтернативный режим работы), дальнейший обмен по шине невозможен. Итог: капался 2 недели))) модуль на F103 жудко сырой, с кучей глюков. Может я в чем-то ошибся, если у кого-то другой опыт, поделитесь, буду рад его перенять!
Не очень понял про нераспаянный reset на программаторе. В кейле же есть галочка "reset and run" на вкладке "download function". Тоже пользуюсь китайским стлинком и все запускается само.
@@NRelectronics Кстати, в кубе IDE нет кнопки прошивки (может сочетание клавиш есть?), есть только компилить, запустить или дебаг, а в Кейле есть. И еще с устройств кидать на "сд-карту" стлинка удобно. Почему-то на всех Demo Board F030 у меня ошибка верификации, если через куб запускать, а скорость SWD родного отладчика вроде нельзя понизить.
@@NRelectronics Ну у меня в конечном итоге все заработало по тому уроку на Narodstream. Но не помню сейчас точно, следовал ли буквально или просто брал за основу урок.
у меня два вопроса к вам как к спецу ф 1 глючит,Вообще у меня с I2C проблемма .Создал я своё меню по пинам оно переключается а вот во через приставку I2C не хочет. ?Как с этим бороться?Что я только не делал.Прошу меня не судить.Я чайник.На AVR EEPROM настроил в железе.В stm32 EEPROM и вообще I2C загадка.Как мне ресетировать шину и переустановить?