Я пытаюсь добавить дисплей I2C к своему дрону с дистанционным управлением. Не могу заставить работать дисплей. Я взял тот же код и скопировал его на ядро stm32f303k8, и дисплей заработал. Я перенес код обратно на дрон и протестировал его на процессоре STM32F303cc. Это не работает. Приведенные ниже сигналы формируют одну и ту же строку кода, проходящую через I2c на обоих чипах. Ну и конечно перекомпилировал в фреймворке cubemx для разных чипов. Желтая линия — scl. Синяя линия часы. Желтая линия с закорючками — это неработающий дрон. Остальные 2 из рабочего ядра. Что не так с сигналом на дроне, чип stm32f303cc? Почему он действительно волнистый. Оба имеют тяговые резисторы 2,2к и 4,7к. В частности, почему желтая линия внизу, на верхнем изображении, разделить 50/50 между высоким и низким на то, что выглядит как бит подтверждения? Спасибо
разделить 50/50 между высоким и низким на то, что выглядит как бит подтверждения
[...]
Это похоже на перетягивание каната между высоким и низким на подтверждении
Верно, и это означает, что ведущий I 2 C на самом деле не освободил линию SDA, чтобы ведомый I 2 C мог выполнить Ack.
В свою очередь, это означает, что контакты GPIO, используемые для шины I 2 C на I 2 C Master (вероятно, оба контакта, но определенно SDA), были неправильно сконфигурированы и оставлены по умолчанию «двухтактными», а не переключены на "открытый сток", как требуется для работы I 2 C.
Вот что вызывает «перетягивание каната», как вы его описали, или, как сказал glen_geek : «почему линия SDA не тянется до земли?» Ответ заключается в том, что SDA (и, возможно, SCL тоже, но большинство ведомых устройств не пытаются управлять им) все еще управляется ( выводом GPIO, все еще сконфигурированным как «двухтактный»), а не освобождается (только с пассивным подтягиванием). ) как контакт с открытым стоком.
Если вы полагаетесь на STM32CubeMX для написания кода инициализации, то вы либо только что обнаружили ошибку в используемой вами версии (ищите обновления и опечатки), либо неправильно настроили ее (я не использую ее, поэтому могу' не скажу вам, какая настройка может быть неправильной).
На Nucleo I2C находится на I2C1. На дроне он на I2C2.
Таким образом, порты I 2 C различаются в рабочей и нерабочей конфигурациях. Это может легко объяснить, почему ваша проблема проявляется только в одной конфигурации, если инфраструктура STM32CubeMX неправильно инициализирует I2C2 (и были ошибки инициализации портов, которые затрагивают только некоторые порты).
glen_geek
Джеффри Эдвард Мессикян
Сэм Гибсон
Джеффри Эдвард Мессикян