Интерфейс I2C на процессоре STM32. Создание библиотеки расширителя портов ввода-вывода TCA9535

Поділитися
Вставка
  • Опубліковано 17 бер 2019
  • Рассказывается об одном из самых популярных интерфейсов подключения периферийных устройств к процессорам. Интерфейс I2C на процессоре STM32 на примере создания библиотеки для расширителя портов ввода-вывода TCA9535.
    ------------------------------------------
    Поддержать автора канала можно перейдя по ссылке:
    yoomoney.ru/to/4100116547550395
    Или просто отправив перевод на Yandex.кошелек:
    4100116547550395
    А также переводом по номеру карты Сбер:
    4279-3000-1033-0561
    ------------------------------------------
  • Наука та технологія

КОМЕНТАРІ • 88

  • @user-rz3cl1qx8q
    @user-rz3cl1qx8q 2 роки тому

    Огромное спасибо. Искал уроки по I2C что бы разобраться с расширителем портов и тут как раз кстати пришёлся ваш урок

  • @user-gb6ok4vn4k
    @user-gb6ok4vn4k Рік тому +1

    Спасибо огромное за труды и потраченное время!!!

  • @ArthurIslamRU
    @ArthurIslamRU 5 років тому

    Дай Бог вам Здоровья и Понимания! Очень нравятся Ваши ролики!

  • @SibMan54
    @SibMan54 5 років тому +2

    Огромное вам спасибо за вашу работу!

  • @user-rq9ji8kb4w
    @user-rq9ji8kb4w 3 роки тому

    Полезный материал, спасибо!

  • @MrMultiwas
    @MrMultiwas 2 роки тому

    Спасибо за Ваши видео! Очень приятная подача, все предельно ясно. Жалко не преподаете, к такому мастеру бы да в подмастерье) 👍

  • @user-pc9wg4jt8l
    @user-pc9wg4jt8l 5 років тому

    Спасибо, что на адресации заострили внимание. Я тоже на это нарвался. Пришлось даже применять сканер I2C для определения адреса. К сожалению, о комментарии разработчиков я не догадался.

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Их желательно читать т.к. очень часто встречается расхождение со здравым смыслом и официальной документацией.
      Есть примеры когда от версии к версии HAL изменения настолько глобальные, что хоть заново пиши.

  • @serjkp
    @serjkp 5 років тому +1

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

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

    • @CoBaldr
      @CoBaldr 5 років тому

      Если вы про 103й камень то прочитайте errata

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Нет, я не только про 103й (эту серию я в принципе не использую).
      Просто пару лет назад мы ради интереса устраивали тест I2C на помехи и подвисания. И вот самое критичное для шины были именно помехи, а во вторую очередь емкость линии и как ее следствие заваливание фронтов, что часто служит причиной подвисания.

    • @alexandrsemenkoff6935
      @alexandrsemenkoff6935 5 років тому

      На физическом уровне по совету от Владимира, по программной части в критических решениях - либо watchdog, либо отказаться от i2c и перейти на обмен данных по дифференциальной паре

    • @xbevice
      @xbevice 5 років тому +1

      @@alexandrsemenkoff6935 зачем watchdog, когда можно не использовать блокирующие вызовы?

  • @solderman5878
    @solderman5878 5 років тому

    Спасибо.

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Очень долго рассказывать все функции. В двух словах контролирует состояние входов и умеет реагировать на изменение состояния замыкая и размыкая реле. При этом отправляет СМС на заданные телефоны.
      Может быть использован в умных домах а также в любых устройствах автоматизации.
      Полная документация по ссылке - yadi.sk/i/988poqgMQoTWHw

  • @user-zi1hf6xn2w
    @user-zi1hf6xn2w 5 років тому

    Спасибо!
    Классный у вас анализатор. Я пользуюсь Saleae Logic, там интерфейс не такой нарядный, приходится всматриваться в серые буквы, цифры, меандры.

  • @zatee8232
    @zatee8232 5 років тому +1

    Спасибо огромное за ваш труд, материал фантастический! Учусь работать с STM32, перевариваю кучу информации из сети, но ваши ролики оказываются максимально полезными. Продолжайте это дело!
    С интерфейсом I2C ковыряюсь уже неделю, никак не получается адекватно считать данные из регистров датчика приближения apds9930: запрашиваю Mem_Read-ом данные из регистра 0х18, в переменную записывается тоже 0х18, при том, что должно быть значение приближённости, не подскажете куда копать? Заранее спасибо.
    Ещё, хотелось бы урок по функциям I2C_Master_Receive/Transmit, подробнее разобрать способ формирования буфера для данных и алгоритм работ самих функций, ибо чс этим возникают трудности...

  • @gordonfreeman1894
    @gordonfreeman1894 3 роки тому

    Скажите пожалуйста, а HAL обрабатывает все эвенты как в "Transfer sequence diagram" таблицах из RM0008 (стр. 756, 757, 760 и 761)?
    Я лично пробовал на LL в своё время, так там приличная функция получалась...

  • @isorport32
    @isorport32 3 роки тому +1

    Все операции с константами выполняет препроцессор, что мешает в обращении к функции записать правильный_адрес

  • @user-wd6fj8xd1q
    @user-wd6fj8xd1q 3 роки тому

    Добрый вечер! Подскажите Владимир, с чего начать разбираться, если есть интерес к программированию микроконтройлеров и радиотехники. Но не знаю с чего начать изучение? Это для меня как большой снежный ком.

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому

      На самом деле на канале есть целый ряд роликов рассказывающих о том, с чего начинать. Вот один - ua-cam.com/video/_YfayPCMLMQ/v-deo.html
      Вот другой - ua-cam.com/video/vZVwv-EeHkI/v-deo.html в них все детально расписано.

  • @petrsidorov3489
    @petrsidorov3489 5 років тому

    Спасибо! Я пока только учусь - за сим простите за может быть глупые или не по теме вопросы. Скажите при помощи чего Вы смотрите тайминг шины?

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Это просто замечательно что учитесь.
      То устройство, что вас заинтересовало это самый примитивный и дешевый логический анализатор от www.dreamsourcelab.com

    • @petrsidorov3489
      @petrsidorov3489 5 років тому

      Владимир, спасибо!

  • @namename2031
    @namename2031 10 місяців тому

    9:31
    Это величина p Data буфера в байтах.
    Величина Mem Add r e s s в байтах (Mem Add Size) была указана ранее.
    Зачем эти параметры совмещать.
    А так как вы описали делается в функции HAL_I2C_Master_Transmit

  • @alexanderurezchenko6446
    @alexanderurezchenko6446 5 років тому

    Владимир, а что заставило Вас использовать в проекте расширитель портов? На сколько я понимаю, в 303м контроллере, который Вы применяете достаточно входов/выходов? Или же Вы количество проводов между платами минимизировали?

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Да, это сделано только для оптимизации соединений между платами. Это позволило сэкономить 10 проводников, которые надо изготовить припаять, уложить. Кроме того мы стараемся делать модули универсальными. Т.е. при желании эту плату можно заменить.

    • @alexanderurezchenko6446
      @alexanderurezchenko6446 5 років тому

      Владимир, спасибо за ответ. Еще вопрос: В одном из комментариев Вы согласились, что у I2c есть неустранимые проблемы с надежностью (наводки, зависания и т.д.). Наблюдались ли какие либо сбои в работе данного устройства? Или я не правильно Вас понял пол надежность?

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Нет, вы поняли абсолютно не правильно.
      Шина i2c очень хорошо работает в пределах устройства. Но если попытаться использовать эту шину (как предлагал кто-то из комментаторов) для умного дома т.е. на большие дистанции, то возникает проблема. В данном устройстве шина работает идеально и проблем не наблюдается.

    • @alexanderurezchenko6446
      @alexanderurezchenko6446 5 років тому

      Ага... Теперь все стало ясно. Еще вопрос....В одном из видео (не помню точно, где) Вы упоминали некий "любимый" магазин на Али, где покупаете разные детали. Если не ошибаюсь, в этом видео речь шла о кнопках. Не поделитесь ссылкой на магазин?

    • @MrLedball
      @MrLedball 3 роки тому +1

      Вот только цена этого расширителя великовата. есть же решения из логических микросхем. 74165 - для входов, например. Дешево и сердито.

  • @Dmitrne
    @Dmitrne 5 років тому

    интересное видео, а платку вы сами разводили под это дело?

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Разумеется.

    • @Dmitrne
      @Dmitrne 5 років тому

      @@VladimirMedintsev хорошо получилось

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Все платы и электронные устройства показываемые на этом канале изготовлены самостоятельно.

  • @ukrfoil
    @ukrfoil 3 роки тому

    Как данный расширитель портов на i2c показал себя в работе по прошествии столько времени, были зависания и т.п. от щелкающих рядом реле или контакторов в распред.щитке?
    Мои исследования с mcp23017 показали что иногда он способен подвесить i2c линию. приходилось его сбрасывать ..что не есть хорошо для ответственных устройств, а мог неделями работать без зависания... опторазвязки ,кондеры по питанию, короткие i2c линии и т.п присутствуют и не использование портов A7,B7 на ввод согласно errata..

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому

      К данному расширителю есть только два вопроса: его странная доступность и цена. По мне он чудовищно дорогой. Линия i2c не длиннее 13 см и не влияет. Питание стабильное. Сам прибор стоит обособленно от больших пускателей. Но при партии и 2.5 года жалоб пока не было.
      Но что-то видимо я параноить сейчас начну после вашего сообщения... Проверку сделаю.

  • @CoBaldr
    @CoBaldr 5 років тому

    За это нужно не i2c не любить а hal ;)

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Ох, если бы все проблемы заканчивались только на HAL, то уже свой написал бы давно.

    • @CoBaldr
      @CoBaldr 5 років тому

      @@VladimirMedintsev ну не все конечно, куда же без этого, но с адресами более прозрачно

  • @zhmenyaBSD
    @zhmenyaBSD 4 роки тому

    Владимир, добрый день. Подскажите был ли у Вас опыт работы с ds2482?

    • @VladimirMedintsev
      @VladimirMedintsev  4 роки тому

      А вы с какой целью интересуетесь?

    • @zhmenyaBSD
      @zhmenyaBSD 4 роки тому

      @@VladimirMedintsev Ни как не выходит "заставит" её работать, из документации не понятно как правильно обращаться с её регистрами. Вдруг у Вас будет интерес с её "освоением".

    • @VladimirMedintsev
      @VladimirMedintsev  4 роки тому +1

      @@zhmenyaBSD Да посмотрел я ее. Нет там ничего сложного. Вроде все в документации описано. Она единственное это перебирает регистры друг за другом. А так ничего необычного. Видео по этой микросхеме точно не будет. Она старая, кроме вас уж точно никому не интересная. Ее можно заменить одним транзистором и 3-мя резисторами и прекрасно в схеме обойтись без нее.

    • @zhmenyaBSD
      @zhmenyaBSD 4 роки тому

      @@VladimirMedintsev Даже с сотней датчиков температуры? А хватит ли ресурсов МК (103c8t6) для обработки такого количества датчиков?

    • @VladimirMedintsev
      @VladimirMedintsev  4 роки тому +1

      Т.е. вот с микросхемой этой у вас ресурсов микроконтроллера хватит, а без нее вы сомневаетесь? Ну а если серьезно, то простое гугление дает массу библиотек на эту микросхему, возьмите ардуиновскую, прочитайте и перепишите ее под stm. Есть и куча обсуждений касательно stm. Так что ничего необычного и сложного там нету.

  • @user-qm2gk8kn4f
    @user-qm2gk8kn4f 2 роки тому

    Спасибо за урок - хорошо объясняете !!))По вашему уроку надеюсь сделать библиатеку на INA3221 (нет в наличии). К стате в while запускал функции (прочитать байт) и в дебаге считываю переменную как инвертировано(принял 16 бит переменую ид устройство- должно по даташиту hex5449 а мне считывается dec18772 в hex 4954) как нормальную переменную получить ? Может кто то подскажет -а может это не важно.. логический анализатором прочел как нужно. спасибо)

  • @namename2031
    @namename2031 10 місяців тому

    >Рассказывается об одном из самых популярных интерфейсов подключения периферийных устройств к процессорам.
    2:36 Я димаю что вы знакомы с адрессацией I2C.
    Как же мне "нравятся" такие "уроки".

    • @VladimirMedintsev
      @VladimirMedintsev  10 місяців тому

      Рад что вам понравилось. А где сказано что это урок?

  • @Insideus2786
    @Insideus2786 5 років тому +3

    Хороший ролик! На мой взгляд I2C- один из самых неудачных интерфейсов. Особенно веселят I2C датчики с одним выводом для выбора адреса, в результате чего нужно городить огород, чтобы повесить на шину больше 3 штук.

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Категорически СОГЛАСЕН!

    • @user-rx4rp5yb5j
      @user-rx4rp5yb5j 5 років тому +2

      Отличный интерфейс - я на нем собрался домашнюю сигнализацию делать - сеть до 100 метров и датчиков 20 различных. CAN в топку хоть и микроконтроллеры купил для CAN.

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому +2

      Face palm...

    • @eugenevetrov5069
      @eugenevetrov5069 5 років тому

      Интересно, Вы конкретное ограничение датчика за копейки приравняли к убогости интерфейса? Владимиру - от Вас такого комментария не ожидал. Вот это действительно фейспалм!

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      @@eugenevetrov5069 Вы не ожидали что я соглашусь с фразой "На мой взгляд I2C- один из самых неудачных интерфейсов"? А почему с ней не согласится? Интерфейс 1992 года. Да у него были модификации и последняя датируется аж 2014-м годом, но основных косяков это не исправило. Интерфейс жутко боится помех ну и всего прочего. Я пару лет назад потратил кучу времени гоняя его в лаборатории на переносимость сбоев. Так вот ее просто нет.
      Более того, в словах Insideus2786 смысла достаточно много, дело не в кривизне реализации интерфейса в датчике. Зачем тратить драгоценное время передавая столько бит адреса если больше 3-х ну ладно 4-х устройств на шину не повесить из-за ограничений по максимальной подключаемой емкости? Т.е. скорость и так низкая, но нет мы 30-50% времени потратим на обмен ничего не значащими адресами. Потеря времени. А с датчиком
      Insideus2786 просто привел наболевший пример.

  • @alexanderurezchenko6446
    @alexanderurezchenko6446 5 років тому +1

    Подскажите, а зачем в контроллере (за иcключением серии Cortex-m0) более одного порта i2c. Зачем в реальной жизни может понадобиться, если не подключать более 255 устройств сразу? По SPI та же картина.

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Про i2c ваши вопросы отпадут когда вы захотите подключить несколько однотипных устройств. Ну к примеру датчики температуры. У вас возникнет проблема с адресацией. Кроме того есть проблема с емкостью имеется ввиду емкость электрическая и при 300 пф шина начинает сбоить...
      А вот ваша фраза - "по SPI та же картина" пугает. Там что адресная шина? Нет там адресации. Там выбор идет при помощи линии CS.
      Ну и надо понимать что и I2C и SPI это последовательные шины. Они бывают заняты.
      Например на дисплей вы одну шину SPI используете , а для памяти - другой. К интерфейсу I2C это тоже относится

    • @alexanderurezchenko6446
      @alexanderurezchenko6446 5 років тому

      В предложении "По SPI та же картина" я хотел сказать, что в том же 103м контроллере (а тем более в старших моделях) можно сделать два и более портов SPI. И я не смог представить ситуации, в которой мне будет недостаточно одного порта.

    • @alexanderurezchenko6446
      @alexanderurezchenko6446 5 років тому

      Правильно ли я понял Вашу мысль, что теоретически, может возникнуть потребность одновременно выводить информацию на дисплей и "общаться" с памятью

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Такая потребность возникает не теоретически а постоянно.

    • @alexanderurezchenko6446
      @alexanderurezchenko6446 5 років тому

      Владимир, спасибо за разъяснение. В этом случае, какое с Вашей точки зрения максимальное количество устройств целесообразно вешать на одну I2c- шину? Например, в своем проекте я хотел бы выстроить по цепочке на одной шине 5-6 внешних модулей: пара входных модулей, пара выходных + LCD. Есть ли вариант, что такая схема будет работать? Все модули спроектированы на PCF 8574 либо аналогах

  • @user-bw4fs8zp3p
    @user-bw4fs8zp3p 2 роки тому

    TCA9535 имеет стоимость как у МК с Cortex-M0 и даже дороже

  • @user-hg9dd4gb9i
    @user-hg9dd4gb9i 4 роки тому

    Посоветуйте пожалуйста на многих устройствах где необходимо i2c соединить кабелем и где рядом мощные коммутационные помехи временами зависает микроконтроллер точно Иза i2c. сталкивались вы с зависанием i2c ? аналоговый фильтр на максимум ,пользуюсь watch dog ,но это временно решение думал раз в секунду делать переинициализацию i2c ,в моем проекте опасно зависание микроконтроллера связанно с транспортом

    • @VladimirMedintsev
      @VladimirMedintsev  4 роки тому

      Интерфейс I2C не предназначен для соединения нескольких устройств. А уж тем более в транспорте. Если вы используете феритовое колечко на линии, то это немного улучшит ситуацию. А вообще правильнее использовать более подходящие интерфейсы. Например, CAN.

    • @user-hg9dd4gb9i
      @user-hg9dd4gb9i 4 роки тому

      Vladimir Medintsev там линия 40 см, с can и madbas сложнее и дороже схема ,я всё-таки грешу на hal,на avr линии по 20 метров были и ничего ну потерялись данные следующие пришли контроллер не зацыклился, в hal_i2c.c в функции hal_i2c_mem_read есть цыкл do while может там зацыкливание ?

    • @user-hg9dd4gb9i
      @user-hg9dd4gb9i 4 роки тому

      В общем решил эти проблемы ,добавил в мейне переинициализацию постоянно i2c и в функциях hal где есть цыклы do while добавил выход по количеству проходов , теперь. Как бы не замыкал наводил помехи i2c востанавливатся , по хорошему надо делать обработчик ошибок ,но это для меня ещё темный лес , может будет у вас ролик про обработки ошибок это не только i2c но также другие интерфейсы?

    • @dazzershell
      @dazzershell 3 роки тому

      @@user-hg9dd4gb9i может зависнуть не только контроллер и2с, бывает что какое-то слейв устройство на шине после обрыва приема держит линию. От этого помогает передача 9 старт-команд, тогда все кто держал шину занятой ее освободят. Для этого ногами МК управлять приходится напрямую, а потом опять вернуть их под контроль модуля. У F103 модуль I2C сам по себе очень сырой, чтобы нормально работал, обработчик прерываний должен быть с максимальным приоритетом, с кучей неочевидных условий. Такой же модуль стоит на более мощном F407. У более новых моделей все нормально сделано, но тоже приходится разбираться.

    • @user-hg9dd4gb9i
      @user-hg9dd4gb9i 3 роки тому

      @@dazzershell спасибо за информацию ,я сейчас использую расширитель портов i2c 6 микросхем, развёл питание уже с ключем по питанию, а оказывается что можно было не так извращаться я правда smsis драйвер не hal ,на работе секта smsis ,но по опыту hal нормально работает если не скоростные задачи и нет времени на возню с тем как написать свой драйвер переферии,

  • @sergeyvlasov207
    @sergeyvlasov207 3 роки тому +1

    почему постоянно нужно помнить? можно например так:
    #define Addr (0x20

  • @romaVeber
    @romaVeber 5 років тому

    есть протокол чуть интереснее i2c, есть интерфейс 1-wire (даже некоторые устройства заточены так что-бы брать питание от шины данных)

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      А чем он интереснее? Мне уже несколько лет кажется что 1wire относится к вымирающим интерфейсам которые никто не использует. Домофоны не в счет.

    • @romaVeber
      @romaVeber 5 років тому

      @@VladimirMedintsev , единственный годный пример это ds18b20

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Стоп, вы же говорили что он интереснее...

    • @romaVeber
      @romaVeber 5 років тому +1

      @@VladimirMedintsev, интересный что некоторые расширители портов запитываются шины, тоесть нужна только нога данных и земля (но увы из-за малой популярности очень дорогие)