Это видео недоступно.
Сожалеем об этом.
Интерфейс I2C на процессоре STM32. Создание библиотеки расширителя портов ввода-вывода TCA9535
HTML-код
- Опубликовано: 17 мар 2019
- Рассказывается об одном из самых популярных интерфейсов подключения периферийных устройств к процессорам. Интерфейс I2C на процессоре STM32 на примере создания библиотеки для расширителя портов ввода-вывода TCA9535.
------------------------------------------
Поддержать автора канала можно перейдя по ссылке:
yoomoney.ru/to...
Или просто отправив перевод на Yandex.кошелек:
4100116547550395
А также переводом по номеру карты Сбер:
4279-3000-1033-0561
------------------------------------------
Огромное спасибо. Искал уроки по I2C что бы разобраться с расширителем портов и тут как раз кстати пришёлся ваш урок
Спасибо огромное за труды и потраченное время!!!
Спасибо за Ваши видео! Очень приятная подача, все предельно ясно. Жалко не преподаете, к такому мастеру бы да в подмастерье) 👍
Огромное вам спасибо за вашу работу!
Добро пожаловать.
Дай Бог вам Здоровья и Понимания! Очень нравятся Ваши ролики!
Большое спасибо.
Спасибо, что на адресации заострили внимание. Я тоже на это нарвался. Пришлось даже применять сканер I2C для определения адреса. К сожалению, о комментарии разработчиков я не догадался.
Их желательно читать т.к. очень часто встречается расхождение со здравым смыслом и официальной документацией.
Есть примеры когда от версии к версии HAL изменения настолько глобальные, что хоть заново пиши.
Все ждал рассказа как нужно бороться с зависаниями шины. Жаль, что не упомянули. Важный аспект.
Это как-нибудь на будущее. Кстати, как показывает практика, наиболее надежный способ избавиться от боев на шине - прокладывать ее подальше от помех и не превышать допустимую емкость шины.
Если вы про 103й камень то прочитайте errata
Нет, я не только про 103й (эту серию я в принципе не использую).
Просто пару лет назад мы ради интереса устраивали тест I2C на помехи и подвисания. И вот самое критичное для шины были именно помехи, а во вторую очередь емкость линии и как ее следствие заваливание фронтов, что часто служит причиной подвисания.
На физическом уровне по совету от Владимира, по программной части в критических решениях - либо watchdog, либо отказаться от i2c и перейти на обмен данных по дифференциальной паре
@@alexandrsemenkoff6935 зачем watchdog, когда можно не использовать блокирующие вызовы?
Полезный материал, спасибо!
Хороший ролик! На мой взгляд I2C- один из самых неудачных интерфейсов. Особенно веселят I2C датчики с одним выводом для выбора адреса, в результате чего нужно городить огород, чтобы повесить на шину больше 3 штук.
Категорически СОГЛАСЕН!
Отличный интерфейс - я на нем собрался домашнюю сигнализацию делать - сеть до 100 метров и датчиков 20 различных. CAN в топку хоть и микроконтроллеры купил для CAN.
Face palm...
Интересно, Вы конкретное ограничение датчика за копейки приравняли к убогости интерфейса? Владимиру - от Вас такого комментария не ожидал. Вот это действительно фейспалм!
@@eugenevetrov5069 Вы не ожидали что я соглашусь с фразой "На мой взгляд I2C- один из самых неудачных интерфейсов"? А почему с ней не согласится? Интерфейс 1992 года. Да у него были модификации и последняя датируется аж 2014-м годом, но основных косяков это не исправило. Интерфейс жутко боится помех ну и всего прочего. Я пару лет назад потратил кучу времени гоняя его в лаборатории на переносимость сбоев. Так вот ее просто нет.
Более того, в словах Insideus2786 смысла достаточно много, дело не в кривизне реализации интерфейса в датчике. Зачем тратить драгоценное время передавая столько бит адреса если больше 3-х ну ладно 4-х устройств на шину не повесить из-за ограничений по максимальной подключаемой емкости? Т.е. скорость и так низкая, но нет мы 30-50% времени потратим на обмен ничего не значащими адресами. Потеря времени. А с датчиком
Insideus2786 просто привел наболевший пример.
Спасибо огромное за ваш труд, материал фантастический! Учусь работать с STM32, перевариваю кучу информации из сети, но ваши ролики оказываются максимально полезными. Продолжайте это дело!
С интерфейсом I2C ковыряюсь уже неделю, никак не получается адекватно считать данные из регистров датчика приближения apds9930: запрашиваю Mem_Read-ом данные из регистра 0х18, в переменную записывается тоже 0х18, при том, что должно быть значение приближённости, не подскажете куда копать? Заранее спасибо.
Ещё, хотелось бы урок по функциям I2C_Master_Receive/Transmit, подробнее разобрать способ формирования буфера для данных и алгоритм работ самих функций, ибо чс этим возникают трудности...
Спасибо!
Классный у вас анализатор. Я пользуюсь Saleae Logic, там интерфейс не такой нарядный, приходится всматриваться в серые буквы, цифры, меандры.
Все операции с константами выполняет препроцессор, что мешает в обращении к функции записать правильный_адрес
9:31
Это величина p Data буфера в байтах.
Величина Mem Add r e s s в байтах (Mem Add Size) была указана ранее.
Зачем эти параметры совмещать.
А так как вы описали делается в функции HAL_I2C_Master_Transmit
Скажите пожалуйста, а HAL обрабатывает все эвенты как в "Transfer sequence diagram" таблицах из RM0008 (стр. 756, 757, 760 и 761)?
Я лично пробовал на LL в своё время, так там приличная функция получалась...
>Рассказывается об одном из самых популярных интерфейсов подключения периферийных устройств к процессорам.
2:36 Я димаю что вы знакомы с адрессацией I2C.
Как же мне "нравятся" такие "уроки".
Рад что вам понравилось. А где сказано что это урок?
Спасибо.
Очень долго рассказывать все функции. В двух словах контролирует состояние входов и умеет реагировать на изменение состояния замыкая и размыкая реле. При этом отправляет СМС на заданные телефоны.
Может быть использован в умных домах а также в любых устройствах автоматизации.
Полная документация по ссылке - yadi.sk/i/988poqgMQoTWHw
почему постоянно нужно помнить? можно например так:
#define Addr (0x20
ну или так
#define I2C_ADDR(x) (x
Как данный расширитель портов на i2c показал себя в работе по прошествии столько времени, были зависания и т.п. от щелкающих рядом реле или контакторов в распред.щитке?
Мои исследования с mcp23017 показали что иногда он способен подвесить i2c линию. приходилось его сбрасывать ..что не есть хорошо для ответственных устройств, а мог неделями работать без зависания... опторазвязки ,кондеры по питанию, короткие i2c линии и т.п присутствуют и не использование портов A7,B7 на ввод согласно errata..
К данному расширителю есть только два вопроса: его странная доступность и цена. По мне он чудовищно дорогой. Линия i2c не длиннее 13 см и не влияет. Питание стабильное. Сам прибор стоит обособленно от больших пускателей. Но при партии и 2.5 года жалоб пока не было.
Но что-то видимо я параноить сейчас начну после вашего сообщения... Проверку сделаю.
Добрый вечер! Подскажите Владимир, с чего начать разбираться, если есть интерес к программированию микроконтройлеров и радиотехники. Но не знаю с чего начать изучение? Это для меня как большой снежный ком.
На самом деле на канале есть целый ряд роликов рассказывающих о том, с чего начинать. Вот один - ruclips.net/video/_YfayPCMLMQ/видео.html
Вот другой - ruclips.net/video/vZVwv-EeHkI/видео.html в них все детально расписано.
Подскажите, а зачем в контроллере (за иcключением серии Cortex-m0) более одного порта i2c. Зачем в реальной жизни может понадобиться, если не подключать более 255 устройств сразу? По SPI та же картина.
Про i2c ваши вопросы отпадут когда вы захотите подключить несколько однотипных устройств. Ну к примеру датчики температуры. У вас возникнет проблема с адресацией. Кроме того есть проблема с емкостью имеется ввиду емкость электрическая и при 300 пф шина начинает сбоить...
А вот ваша фраза - "по SPI та же картина" пугает. Там что адресная шина? Нет там адресации. Там выбор идет при помощи линии CS.
Ну и надо понимать что и I2C и SPI это последовательные шины. Они бывают заняты.
Например на дисплей вы одну шину SPI используете , а для памяти - другой. К интерфейсу I2C это тоже относится
В предложении "По SPI та же картина" я хотел сказать, что в том же 103м контроллере (а тем более в старших моделях) можно сделать два и более портов SPI. И я не смог представить ситуации, в которой мне будет недостаточно одного порта.
Правильно ли я понял Вашу мысль, что теоретически, может возникнуть потребность одновременно выводить информацию на дисплей и "общаться" с памятью
Такая потребность возникает не теоретически а постоянно.
Владимир, спасибо за разъяснение. В этом случае, какое с Вашей точки зрения максимальное количество устройств целесообразно вешать на одну I2c- шину? Например, в своем проекте я хотел бы выстроить по цепочке на одной шине 5-6 внешних модулей: пара входных модулей, пара выходных + LCD. Есть ли вариант, что такая схема будет работать? Все модули спроектированы на PCF 8574 либо аналогах
За это нужно не i2c не любить а hal ;)
Ох, если бы все проблемы заканчивались только на HAL, то уже свой написал бы давно.
@@VladimirMedintsev ну не все конечно, куда же без этого, но с адресами более прозрачно
Спасибо! Я пока только учусь - за сим простите за может быть глупые или не по теме вопросы. Скажите при помощи чего Вы смотрите тайминг шины?
Это просто замечательно что учитесь.
То устройство, что вас заинтересовало это самый примитивный и дешевый логический анализатор от www.dreamsourcelab.com
Владимир, спасибо!
Владимир, а что заставило Вас использовать в проекте расширитель портов? На сколько я понимаю, в 303м контроллере, который Вы применяете достаточно входов/выходов? Или же Вы количество проводов между платами минимизировали?
Да, это сделано только для оптимизации соединений между платами. Это позволило сэкономить 10 проводников, которые надо изготовить припаять, уложить. Кроме того мы стараемся делать модули универсальными. Т.е. при желании эту плату можно заменить.
Владимир, спасибо за ответ. Еще вопрос: В одном из комментариев Вы согласились, что у I2c есть неустранимые проблемы с надежностью (наводки, зависания и т.д.). Наблюдались ли какие либо сбои в работе данного устройства? Или я не правильно Вас понял пол надежность?
Нет, вы поняли абсолютно не правильно.
Шина i2c очень хорошо работает в пределах устройства. Но если попытаться использовать эту шину (как предлагал кто-то из комментаторов) для умного дома т.е. на большие дистанции, то возникает проблема. В данном устройстве шина работает идеально и проблем не наблюдается.
Ага... Теперь все стало ясно. Еще вопрос....В одном из видео (не помню точно, где) Вы упоминали некий "любимый" магазин на Али, где покупаете разные детали. Если не ошибаюсь, в этом видео речь шла о кнопках. Не поделитесь ссылкой на магазин?
Вот только цена этого расширителя великовата. есть же решения из логических микросхем. 74165 - для входов, например. Дешево и сердито.
интересное видео, а платку вы сами разводили под это дело?
Разумеется.
@@VladimirMedintsev хорошо получилось
Все платы и электронные устройства показываемые на этом канале изготовлены самостоятельно.
Спасибо за урок - хорошо объясняете !!))По вашему уроку надеюсь сделать библиатеку на INA3221 (нет в наличии). К стате в while запускал функции (прочитать байт) и в дебаге считываю переменную как инвертировано(принял 16 бит переменую ид устройство- должно по даташиту hex5449 а мне считывается dec18772 в hex 4954) как нормальную переменную получить ? Может кто то подскажет -а может это не важно.. логический анализатором прочел как нужно. спасибо)
TCA9535 имеет стоимость как у МК с Cortex-M0 и даже дороже
Посоветуйте пожалуйста на многих устройствах где необходимо i2c соединить кабелем и где рядом мощные коммутационные помехи временами зависает микроконтроллер точно Иза i2c. сталкивались вы с зависанием i2c ? аналоговый фильтр на максимум ,пользуюсь watch dog ,но это временно решение думал раз в секунду делать переинициализацию i2c ,в моем проекте опасно зависание микроконтроллера связанно с транспортом
Интерфейс I2C не предназначен для соединения нескольких устройств. А уж тем более в транспорте. Если вы используете феритовое колечко на линии, то это немного улучшит ситуацию. А вообще правильнее использовать более подходящие интерфейсы. Например, CAN.
Vladimir Medintsev там линия 40 см, с can и madbas сложнее и дороже схема ,я всё-таки грешу на hal,на avr линии по 20 метров были и ничего ну потерялись данные следующие пришли контроллер не зацыклился, в hal_i2c.c в функции hal_i2c_mem_read есть цыкл do while может там зацыкливание ?
В общем решил эти проблемы ,добавил в мейне переинициализацию постоянно i2c и в функциях hal где есть цыклы do while добавил выход по количеству проходов , теперь. Как бы не замыкал наводил помехи i2c востанавливатся , по хорошему надо делать обработчик ошибок ,но это для меня ещё темный лес , может будет у вас ролик про обработки ошибок это не только i2c но также другие интерфейсы?
@@user-hg9dd4gb9i может зависнуть не только контроллер и2с, бывает что какое-то слейв устройство на шине после обрыва приема держит линию. От этого помогает передача 9 старт-команд, тогда все кто держал шину занятой ее освободят. Для этого ногами МК управлять приходится напрямую, а потом опять вернуть их под контроль модуля. У F103 модуль I2C сам по себе очень сырой, чтобы нормально работал, обработчик прерываний должен быть с максимальным приоритетом, с кучей неочевидных условий. Такой же модуль стоит на более мощном F407. У более новых моделей все нормально сделано, но тоже приходится разбираться.
@@dazzershell спасибо за информацию ,я сейчас использую расширитель портов i2c 6 микросхем, развёл питание уже с ключем по питанию, а оказывается что можно было не так извращаться я правда smsis драйвер не hal ,на работе секта smsis ,но по опыту hal нормально работает если не скоростные задачи и нет времени на возню с тем как написать свой драйвер переферии,
Владимир, добрый день. Подскажите был ли у Вас опыт работы с ds2482?
А вы с какой целью интересуетесь?
@@VladimirMedintsev Ни как не выходит "заставит" её работать, из документации не понятно как правильно обращаться с её регистрами. Вдруг у Вас будет интерес с её "освоением".
@@zhmenyaBSD Да посмотрел я ее. Нет там ничего сложного. Вроде все в документации описано. Она единственное это перебирает регистры друг за другом. А так ничего необычного. Видео по этой микросхеме точно не будет. Она старая, кроме вас уж точно никому не интересная. Ее можно заменить одним транзистором и 3-мя резисторами и прекрасно в схеме обойтись без нее.
@@VladimirMedintsev Даже с сотней датчиков температуры? А хватит ли ресурсов МК (103c8t6) для обработки такого количества датчиков?
Т.е. вот с микросхемой этой у вас ресурсов микроконтроллера хватит, а без нее вы сомневаетесь? Ну а если серьезно, то простое гугление дает массу библиотек на эту микросхему, возьмите ардуиновскую, прочитайте и перепишите ее под stm. Есть и куча обсуждений касательно stm. Так что ничего необычного и сложного там нету.
есть протокол чуть интереснее i2c, есть интерфейс 1-wire (даже некоторые устройства заточены так что-бы брать питание от шины данных)
А чем он интереснее? Мне уже несколько лет кажется что 1wire относится к вымирающим интерфейсам которые никто не использует. Домофоны не в счет.
@@VladimirMedintsev , единственный годный пример это ds18b20
Стоп, вы же говорили что он интереснее...
@@VladimirMedintsev, интересный что некоторые расширители портов запитываются шины, тоесть нужна только нога данных и земля (но увы из-за малой популярности очень дорогие)