Перейти к содержанию
    

Подскажите по HAL stm32 и I2C

7 минут назад, makc сказал:

Задержки подачи питания при использовании LDO быть не должно, поэтому мне версия с прилётом на вход недопустимо высокого напряжения (больше 4 В) при включении питания кажется крайне маловероятной.

Мы не знаем - какая ёмкость стоит после LDO 3.3V? Также не знаем - с какого уровня входного напряжения он заведётся? Какое ему необходимо превышение входного напряжения над +3.3V чтобы включиться? LDO - это всё-таки "low drop", а не "zero drop". Даже какой именно LDO применён - не знаем. Задействован ли у него например вход "enable"? Схему вообще не видели.

Кроме того - не обязательно "при включении". Условия нарушения "Absolute maximum ratings" при такой схеме включения, могут сложиться и при выключении. Если часть схемы, питаемая от +3.3V потребляет намного больше потребителей +5V, LDO рано выключится, а напряжение +5V где-то ещё останется.

14 минут назад, makc сказал:

покажите осциллограммы на линиях I2C (хотя бы одной из них) и на линии питания STM32 при включении питания вашей системы.

Осциллограммы нужны не только по включению, но и по выключению.

PS: Без схемы и осциллограмм можно только гадать.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, jcxz сказал:

Мы не знаем - какая ёмкость стоит после LDO 3.3V? Также не знаем - с какого уровня входного напряжения он заведётся? Какое ему необходимо превышение входного напряжения над +3.3V чтобы включиться? LDO - это всё-таки "low drop", а не "zero drop". Даже какой именно LDO применён - не знаем. Задействован ли у него например вход "enable"? Схему вообще не видели.

Я немного про другое: если питание 3.3 В и шина имеет уровни 3.3 В, то откуда может взяться превышение +4В на входе I2C у STM32?

2 минуты назад, jcxz сказал:

PS: Без схемы и осциллограмм можно только гадать.  :unknw:

Ждём и надеемся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, makc сказал:

Я немного про другое: если питание 3.3 В и шина имеет уровни 3.3 В, то откуда может взяться превышение +4В на входе I2C у STM32?

Потому как Xenia ранее написала:

18 часов назад, Xenia сказал:

Тем не менее, подтяжку на шине создаю не я (т.к. мой STM32 этого не умеет), а Save-устройство, питаемое от 5V, а его схема мне неизвестна. Но перемычку с 5V на 3V3 на Slave я перепаяла сразу (это фото из его описания еще до перепайки):

18 часов назад, Xenia сказал:

Однако все равно боюсь того, что Slave может на короткое время установить на шине напряжение 5V и лишь позднее снизить его до 3.3V.

Как работает та перепаянная перемычка - без схемы не угадать. Но есть вероятность, что на резистрах подтяжки при каких-то обстоятельствах может появляться напряжение >+3.3V. Она боится не беспочвенно.

Да и даташит на чип I2C-слэйва (с силовой платы) тоже было бы полезно почитать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, jcxz сказал:

Как работает та перепаянная перемычка - без схемы не угадать. Но есть вероятность, что на резистрах подтяжки при каких-то обстоятельствах может появляться напряжение >+3.3V.

@Xenia также писала про напряжение на холостом ходу на данных линиях:

В 15.04.2023 в 23:08, Xenia сказал:

А тогда еще один вопрос про I2C: бывало ли у кого, чтобы I2C "сгорела"? В смысле того, что напряжения на линиях на холостом ходу нормальное (3.23 V), но STM32 (всё тот же STM32F103C8T6) в режиме мастера никаких сигналов не выдает (логический анализатор на линиях ничего не видит). А то у меня уже вторая плата "подыхает" по этой же причине - I2C "отваливается", хотя в остальном всё вроде бы в порядке.

В моём понимании это однозначно указывает на то, что данные перемычки работают согласно описанию и нашим ожиданиям. 🙂

2 минуты назад, jcxz сказал:

Да и даташит на чип I2C-слэйва (с силовой платы) тоже было бы полезно почитать.

Что там такого может быть опасного? Или вы полагаете, что он может выдать на линию 5 В, т.к. он не соответствует спецификации I2C?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, jcxz сказал:

Как работает та перепаянная перемычка - без схемы не угадать. Но есть вероятность, что на резистрах подтяжки при каких-то обстоятельствах может появляться напряжение >+3.3V. Она боится не беспочвенно.

Да и даташит на чип I2C-слэйва (с силовой платы) тоже было бы полезно почитать.

Я бы не хотела, чтобы кто-то вместо меня стал заниматься разборкой даташита и руководства к блоку, который я купила, однако ссылки на них дам, если любопытные все-таки найдутся:

https://wiki.iarduino.ru/page/power-key-4p-i2c-datasheet/

https://wiki.iarduino.ru/page/power-key-4p-i2c/

Однако сведений об электрической схеме в них нет, а программирование заточено под Arduino - придают готовую библиотеку и объясняют, как ее функциями пользоваться. Тогда как я в системе Arduino не работаю (и хотя Arduino-платы иногда покупаю, но использую их не по назначению - прошиваю их своей прошивкой, затирая Arduino-загрузчик).

Тем не менее, мне удалось кое-какую полезную информацию извлечь путем осмотра этого изделия снаружи. Во-первых, примечательно, что на нем тоже установлен контроллер из семейства STM32 - на этот раз STM32F030F4P6. Очевидно, что именно он поддерживает I2C со стороны этого устройства. Тем не менее, мне непонятно, как он работает, когда пользователь выбирает вариант с 5-вольтовой подтяжкой шины (этот вариант установлен по умолчанию в заводской поставке, а для перехода на 3.3-вольтовую подтяжкку приходится перепаивать перемычку, которая для такого перехода там предусмотрена). Конечно, эту перемычку я сразу же перепаяла и убедилась вольтметром, что напряжение на линиях I2C снизилось до 3.23V. Именно поэтому мне было странно, как как может "сгорать" I2C-интервейс у моей платы. Во-вторых, на этом изделии тоже стоит LDO, понижающий 5-вольтовое напряжение питания до 3.3V, необходимого для питания микросхемы контроллера. Таким образом ситуация симметричная - оба устройства, соединяемые шиной I2C, питаются от одного и того же источника питания в 5V (по существу это линия питания USB-кабеля), оба имеют в своем составе понижающий напряжение LDO, и оба используют контролеры STM32 (разные, но 5-вольтовая толерантность у них одинаковая). Подтяжка осуществляется со стороны Slave-устройства неизвестным мне образом, хотя среди команд Arduino-библиотеки есть и такая, чтобы отключить эту подтяжку. Т.е. встроенный в это устройство контроллер (STM32F030F4P6) как-то ухитряется не только работать на 5-вольтовой подтяжке, то и включать и выключать эту подтяжку, несмотря на то, что он сам 3.3-вольтовый. Тем не менее, сгорает у меня моя плата, а этому устройству ничего не делается.

Пока же я склоняюсь к банальному объяснению моей проблемы - плохая земля, т.е. ненадежное соединение обоих устройств по общему проводу. При этом внешнее устройство, лишенное общего провода (земли), оказывается подвешенным к потенциалу 5V, который "натекает" практически на все его контакты, в том числе и на шину I2C. Причем не только через резистор подтяжки, но и "снизу", т.к. земляная шина устройства, лишенная связи с землей источника питания, тоже получит потенциал 5V. А затем этот потенциал и пережигает мою плату, у которой земля всегда есть. Т.е. суть в том, что моя плата всегда надёжно получает питание и землю, поскольку USB-разъем втыкается прямо в нее, тогда как внешнее устройство было присоединено к ней на "ардуиновых" проводках, которые могли оказаться не столь надежными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, makc сказал:

Что там такого может быть опасного? Или вы полагаете, что он может выдать на линию 5 В, т.к. он не соответствует спецификации I2C?

Я не вижу схемы той чудесной платы. Но подобные платы (особенно с надписями "Ардуино" и "Всё для радиолюбителей") у меня вызывают опасения.

И не без оснований: Не так давно, для одного проекта, мы тоже купили отладочную платку для SIM868 (стороннего производителя, не SIMCOM). И у неё тоже (какое совпадение! :bye: ) была заявлена возможность выбора напряжения сигналов IO с внешним миром. Решалось это с помощью установленного там "интеллектуального" транслятора уровней TXB0106. Который типа - настолько умный :bb: , что сам умеет направление передачи определять. Пущен через него был тривиальный UART.

Так этот самый TXB0106 периодически, ни с того ни с сего, иногда переключал сигналы UART навстречу сигналам МК! И возникали коллизии. Хотя со стороны МК там были вполне себе нормальные TTL-уровни, без всяких "open drain". Возможно, что причина была в некорректном подключении TXB0106 авторами платы. Но факт остаётся фактом.

Так что - от чужой неизвестной схемы, неизвестно кем и как сделанной, я ожидаю чего угодно.

А на плате Xenia может быть нечто ещё более "интеллектуальное", чем TXB0106.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, jcxz сказал:

А на плате Xenia может быть нечто ещё более "интеллектуальное", чем TXB0106.

Всё возможно, но оно тем не менее недолжно выводить из строя устройства на шине, в т.ч. и STM32 исходя из вышеприведённых фактов (напряжение на шине в пассивном состоянии).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Xenia сказал:

примечательно, что на нем тоже установлен контроллер из семейства STM32 - на этот раз STM32F030F4P6.

Ну вот - чего я и опасался!

1 час назад, Xenia сказал:

Т.е. встроенный в это устройство контроллер (STM32F030F4P6) как-то ухитряется не только работать на 5-вольтовой подтяжке, то и включать и выключать эту подтяжку, несмотря на то, что он сам 3.3-вольтовый.

Ну переключает видимо - внешними ключами. И в прошивке этого могут быть баги, в результате которых иногда на шине оказывается +5V подтяжка.

PS: Непонятно - почему вы до сих пор не перепаяли подтяжки на свой 3.3V LDO? Чтобы не опасаться глюков в прошивке чужого STM.

4 минуты назад, makc сказал:

Всё возможно, но оно тем не менее недолжно выводить из строя устройства на шине, в т.ч. и STM32 исходя из вышеприведённых фактов (напряжение на шине в пассивном состоянии).

Кто-ж знает какой ногой написана прошивка того контроллера?  :sarcastic:  Может там, при старте прошивки, пока МК не проинитил ноги, ключи управляющие подтяжками переключаются на 5V? А когда прошивка запустится, она считывает перемычку и только тогда ставит нужный уровень. Программно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, jcxz сказал:

Ну вот - чего я и опасался!

1 час назад, Xenia сказал:

Т.е. встроенный в это устройство контроллер (STM32F030F4P6) как-то ухитряется не только работать на 5-вольтовой подтяжке, то и включать и выключать эту подтяжку, несмотря на то, что он сам 3.3-вольтовый.

Ну переключает видимо - внешними ключами. И в прошивке этого могут быть баги, в результате которых иногда на шине оказывается +5V подтяжка.

Нет там ничего такого даже близко. Есть запаиваемая перемычка, выбирающая потенциал, подаваемый на два подтягивающих резистора. Убедитесь сами:

image.thumb.png.41a380fb3a373169d3e7a1c36a81b12f.png

18 минут назад, jcxz сказал:

Кто-ж знает какой ногой написана прошивка того контроллера?  :sarcastic:  Может там, при старте прошивки, пока МК не проинитил ноги, ключи управляющие подтяжками переключаются на 5V? А когда прошивка запустится, она считывает перемычку и только тогда ставит нужный уровень. Программно.

Ваша гипотеза не находит пока никаких подтверждений. См. выше. Поэтому вопрос остаётся открытым: как потенциал 3.3 В может убить контроллер, который допускает до 4.0 В на входе даже в выключенном состоянии?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 hours ago, Xenia said:

Пока же я склоняюсь к банальному объяснению моей проблемы - плохая земля, т.е. ненадежное соединение обоих устройств по общему проводу

Тогда, кроме диодов шотки на питание, полезно поставить еще и диоды на землю.

 

Но может проще бросить нормальный провод земли и забыть о проблемах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошла весна, настало лето, близится осень, но мои злоключения с шиной I2C на контроллере STM32F103C8T6 не только продолжились, но и приняли парадоксальный оборот.

Начну с того, что моя "горелая" плата с контроллером снова заработала нормально с шиной I2C после того, как ... полежала 10 дней в ящике моего стола. После этого она нормально трудилась (с использованием I2C) где-то 3 месяца, а потом I2C у нее снова сдох. Никаких импульсов по линиям SDA и SCL не выдает (логическим анализатором смотрела), а драйвер STM32CubeMX после 10 миллисекундного ожидания выдает ошибку "BUSY", считая шину занятой (что обычно бывает, когда хотя бы на одной из этих линий нет подтяжки к питанию). Однако с потенциалом на линиях был полный порядок - на обеих стоял высокий уровень.

Тогда из опасений, что порт сгорел, я взялась проверять у контроллера пины SDA и SCL, переключив их из режима I2C в режим обычного вывода (GPIO_MODE_OUTPUT_PP). Выставила высокий уровень, затем низкий - вольтметр показал, что пины правильно слушаются команд. Затем переключила в режим Open-Drain (GPIO_MODE_OUTPUT_OD), предварительно подтянув их к питанию парой резисторов , которые мне здесь посоветовали (4.7К). Проверила снова - напряжения на выходе снова послушались команд. После всего этого вернула режим I2C, и о чудо - I2C заработала! Но не долго - до первого же ресета или отключения питания.

Стала разбираться тем, в какой момент шина I2C оживает. Выяснила, что для того, чтобы I2C-шина ожила необходимой войти в режим Open-Drain и на 100 микросекунд закоротить обе линии на землю (командой установки на линиях низкого уровня), чтобы пропустить по ним ток через резисторы подтяжки. Сразу же после этого I2C-шина начинала работать нормально, более не выдавая состояния BUSY. При этом повторную инициализацию I2C мне делать не пришлось - дело ограничилось манипуляцией с этими двумя линиями порта. Конечно это не навсегда, а только до первого обесточивания, но я поставила эту процедуру оживления в начало программы, после чего плата стала работать нормально.

Прошу прокомментировать мой рассказ, а если можно, то предложить разгадку случившегося.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверить качество пайки выводов микроконтроллера или окружающих компонентов. Возможен непропай, и тогда при небольших изгибаниях платы контакт то теряется, то восстанавливается. Как раз пропускание некоторого тока через выводы может как бы пробивать контакт. Так же желательно проверить пайку всех ножек питания микроконтроллера. В общем, не помешает паяльничком с каплей припоя пройтись по выводам. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, Xenia сказал:

Прошу прокомментировать мой рассказ, а если можно, то предложить разгадку случившегося.

Может быть вот так: https://istarik.ru/blog/stm32/123.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, HardEgor said:

Может быть вот так: https://istarik.ru/blog/stm32/123.html

Это прорыв !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/21/2023 at 9:42 AM, whale said:

Вроде разобрался, подскажите функцией 

HAL_I2C_Master_Transmit_IT (&hi2c2, SSD1306_ADDRESS, &regData, 8);

можно отправить за один раз несколько команд с одним адресом или хотя бы с повстартом без танцев с бубном ?

Или только один вариант адрес+последовательно байты 

Те хотелось бы за один раз отправить 

адрес+байты...адрес+байты итд 

или адрес+байты+повстарт+байт ...+повстарт

и все это загнать в regData

Просто для управления дисплеем ssd1306 даже переход на нужную позицию занимает 3 разные  команды

а вывод сразу всей памяти дисплея слишком долго получается. 

 

Повоевал недавно с дисплеем на SH1106, который в общем мало отличается от SSD1306. И там и здесь организация графической памяти - 8 страниц по 128 байт. Соответственно, допускается обновлять данные по-странично, то есть отправлять по 128 байт через DMA. И таким образом перерисовать экран - стоит 8 прерываний. Так же в к буферу 128 байт добавляю команду с адресом страницы, таким образом данные гоняются в I2C только с DMA.

Графические библиотеки как правило обновляют экран в выбранной области, но я посчитал и это оправдалось - проще 30 раз в секунду перерисовывать весь экран. При этом контроллер абсолютно не загружен этой задачей - 240  прерываний в секунду.

I2C при этом должен работать в 400кгц режиме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...