Arduino.ru
Время стояло и выводило все по нулям. Я перепробывал множетсво скетчей, все они заливались, но время остется неизменным. I2C сканер так же не выдает результатов, хотя скетчи с дисплеем на ssd1306 все работают и отлично. Помогите разобратся в чем может быть дело?
Так же скетч для просмотра времени работает и без модуля RTC.
- Войдите на сайт для отправки комментариев
При сканировании i2c устроств пишет
I2C Scanner
Scanning.
И больше ничего, ждал очень долго.
С подключением не может быть никаких проблем, если кто сталкивался помогите пожалуйста. Уже не знаю что делать, убил два дня в поисках, решил проблему только с изменившимися командами и названиями библиотек, т.к. очень большая часть материала и скетчей 2012-13 гг и библиотеки поменялись.
- Войдите на сайт для отправки комментариев
I2C сканер не может не работать. Модули обычно идут с мелкосхемой памяти на борту, должно родить два адреса 0х68 и 0хХЗ. Проверяйте питание, подключение, дорожки на модуле. Если светодиод на модуле горит, для начала предложил бы поменять местами SDA-SCL.
- Войдите на сайт для отправки комментариев
Попробовал, но ничего не изменилось, сначала так же и дисплеи не определял, затем начал показывать фигню всякую при перетыкании, затем стал выдавать стабильно адрес у одного и второго дисплея, а ds1307 так и не видит. Ну хоть теперь дисплееи видит. При совместном подключении и RTC модуля и дислпея так же ничего не видит, может быть так что модуль косяченый? Хотя отзывы на али хорошие, и пишут что все работает, диод выпаял с резистором, R6 замкнут, кварц заменил из радиоприемника на rda5807 тоже 32кГц, заказывал сразу 2 модуля, второй точно так же не работает.
Нестабильная работа с I2C под STM32
Волею судеб мне пришлось разрабатывать прошивку для одного устройства на основе микроконтроллера STM32F103. Функций у устройства много, в том числе и общение с EEPROM подключенным посредством протокола I 2 C. Кто не знает, микроконтроллеры STM32 во многих своих версиях поддерживают работу по данному протоколу на аппаратном уровне. Это значит, что у микросхемы микроконтроллера присутствуют специальные выводы, которые можно использовать в том числе и для работы по протоколу I 2 C, а все издержки по этому протоколу выполняются «железом» микроконтроллера.
Вообще, I 2 C — штука популярная. Реализуется не так сложно, для его работы требуется всего два сигнальных провода. По одному подаются тактовые импульсы, по второму происходит передача данных, привязанная к тактам первого провода. К шире или выводам I 2 C можно подключить несколько устройств, они не будут мешать друг-другу, т.к. при обращении к конкретному устройству указывается его уникальный адрес.
Шина I 2 C не высокоскоростная и предназначена в первую очередь для обмена данными с различными датчиками, модулями и внешними системами. Через шину прокачать много информации не выйдет, но этого и не требуется. Главное, что она проста, дешева и универсальна. Ну много ли данных передает в секунду датчик температуры или давления? Сущие байты. Этого вполне достаточно.
Как правило в шине I 2 C применяется система с одним ведущим устройством и подключаемыми к нему ведомыми. В качестве ведущего устройства, разумеется, используется микроконтроллер. И он опрашивает подключенные устройства, в надежде получить с них данные. Каким же образом передаются данные по-фактически одному проводу? Конечно, передача данных по одному проводу в I 2 C не является полнодуплексной. Нет возможности в стандарте по одному проводу передавать и принимать данные одновременно. Поэтому, команды на передачу дает ведущее устройство, а все остальные слушают и отвечают, когда это им позволяется.
Простота протокола I 2 C иногда оборачивается и обратной стороной. Отлаживать проблемы, возникающие в коммуникации с внешними устройствами зачастую очень не просто. Ведь в цифровом мире либо устройство работает, либо нет. А еще больше усложняет проблему случай, когда вроде бы работает, а потом, по какой-то причине не совсем работает. Вот именно такая петрушка и произошла в моем случае.
Для реализации микропрограммы был выбран фреймворк STM32Arduino, так как требовалось использовать некоторые библиотеки, которые легче взять готовые, нежели разрабатывать их заново. К чипу же STM32 подключена обычная микросхема EEPROM на несколько килобит. EEPROM используется для частых записей, для чего не предназначена Flash-память на чипе STM32. Все аппаратные подключения проведены в строгом соответствии с документацией как производителя микроконтроллера, так и микросхемы EEPROM. И именно проверка того, как сделаны аппаратные подключения, надежно ли питание, есть ли все необходимые подтяжки и прочее, должна происходить в самую первую очередь, если возникла проблема. Иначе можно потратить годы на то, чтобы найти программную причину ошибки, особенно там, где ее нет.
В моем случае проблема заключалась в выдаче недостоверных результатов с EEPROM и невозможность записи. Точнее запись проходила, но на конечный осмысленный результат они никак не влияла. Причем неполадка появлялась только после аппаратного перезапуска устройства и примерно один раз из десяти. Присутствие какой-либо адекватной реакции от всех программах слоев, на которые опирается STM32Duino ожидать не стоит. I 2 C протокол простой и он либо работает, либо нет. И он работал, выдавал данные, причем даже если данные с EEPROM приходили откровенно левые, то никакие ошибки обращения с библиотекой Wire не возникало. Пришлось начать копать интернет в поисках похожих ошибок и методов их решения.
Как оказалось, проблема при работе с I 2 C на чипах STM32, особенно семейства F103, возникает чуть ли не у каждого второго пользователя чипов. Причем независимо от того, на чем он пишет свой код: HAL, Arduino, Mbed или еще чего. Проблем возникает много, у кого-то ничего не работает сразу, что несколько легче, так как искать ошибку проще, а у других все работает из коробки, но не постоянно. Основные проблемы, на которые натыкаются пользователи кроются в некоторых, назовем их так, особенностях структуры чипов STM32F10x, да ошибках, которые присутствуют в HAL.
Приведу основные причины возникновения неполадок с I 2 C, полученные после изучения «всего интернета»:
- Ненадежное аппаратное подключение, ненадежное неверное питание, несоблюдение рекомендаций по подключению.
- Блокировка шины на стороне микроконтроллера со статусом Busy.
- Перепутанные выходы, перепутанная инициализация при добавлении второго канала I 2 C на многоканальных чипах. Ошибка из серии «Я скопировал оттуда, где работало, а тут не работает».
Кстати, последняя ошибка встречается не столько при простом копировании кода, завязанного на работу через I 2 C, а сколько на его инициализацию. STM32 штука сложная и если невнимательно работать с Cube или писать инициализацию своими руками, то наверняка куда-то может затесаться мизерная ошибочка, которую замыленный глаз уже не в состоянии разглядеть. Вторая же ошибка по большей части связана с неверной (а зачастую с бездумной) инициализацией микроконтроллера, но присутствуют и особенности реализации (читай ошибки) в самом чипе. С ними (обнаруженными и признанными) и объясняется что делать в замечательном документе Errata sheet (ссылка внизу статьи).
В общем наилучшее, что мог создать коллективный разум, это код принудительной переинициализации функции I 2 C через HAL с дополнительными задержками:
/* USER CODE BEGIN SysInit */
HAL_RCC_I2C1_CLK_ENABLE();
HAL_Delay(100); HAL_RCC_I2C1_FORCE_RESET();
HAL_Delay(100);
__HAL_RCC_I2C1_RELEASE_RESET();
HAL_Delay(100);
/* USER CODE END SysInit */
В Arduino на STM32 данный блок так же можно применить, но он не помогает, по крайней мере, в моем случае. Пришлось еще немного пораскинуть мозгами и попытаться докопаться до причины проблемы, а потом попытаться ее решить. В моем случае обмен данными с EEPROM по I 2 C идет без каких-либо проблем. Данные читаются, записываются, никаких ошибок не возникает. Только вот в одном разе из 10 после аппаратной перезагрузки всей системы, EEPROM начинает выдавать совершенно левые данные, при этом никаких ошибок не возникает. С записью тоже в такие моменты не все гладко, проверить-то никак.
Как известно, чипы STM32 многофункциональны и многие из выводов микросхем могут быть использованы под различные функции. У многих микроконтроллеров, не только у STM32, после перезагрузки, некоторые выводы могут переключиться в так называемые неинициализированные состояния. Обычный софтверный разработчик, как правило не задумывается над тем, какой у него уровень на выводах микроконтроллера после его перезагрузки. Высокий? Низкий? Серединный? При использовании фирменного конфигуратора STM32Cube есть возможность настроить инициализацию выводов и некоторых других функций микроконтроллера путем относительно простого конфигурирования. Но данная процедура может быть опущена, а инициализацию можно провести позже, например, при процедуре вызова той или иной функции. Именно последним путем и пошли разработчики STM32Duino. При загрузке микроконтроллера происходит так называемая базовая инициализация функций микроконтроллера, ножки выводов принимают значения по умолчанию. А вот если с данной конкретной ножки требуется другая функция, то ее инициализация происходит при первом вызове соответствующей функции.
В чипах STM32 инициализация происходит очень быстро, ну сами чипы скоростные, это, во-первых, а во-вторых, загрузчик не тормозит загрузку пользовательского кода, так как вызывается при соответствующей аппаратной комбинации. Значит, проблема неинициализированных «ног», когда на них болтается неизвестно что, встает не в полный рост. А вот на других чипах микроконтроллеров, где загрузчик некоторое время ожидает подачу ему сигнала и только потом переходит на пользовательский код, проблема может существенно попортить жизнь. Представьте, что на такой «ноге», которая еще не определилась с уровнем своего сигнала, «висит» управляющий контакт реле. И вот на реле идет жуткая последовательность непонятных сигналов. Что ему делать? Дергаться туда-сюда, пока микроконтроллер не определиться со своим выводом?
Опытный читатель или электронщик, уже догадался, в чем изюминка порылась. Микросхема EEPROM возвращает неверные данные, а библиотека, работающая с I 2 C, говорит, что все нормально, ошибок нет. Суть нестабильного поведения кроется в следующем. На универсальных чипах STM32F103 многие из выводов многофункциональны. При неверной инициализации или отсутствии инициализации, на «ногах», подключенных к микросхеме EEPROM, может появиться произвольный сигнал, который «сведет с ума» саму микросхему EEPROM (команды на обмен данными с EEPROM та еще китайская азбука, куча условностей, задержек и прочего). Да, она будет как-то реагировать на команды, но вот выдавать данные может совсем не те, что должна. Повторная инициализация I 2 C в микроконтроллере ничего не даст, так как ведомое устройство уже не в себе и вывести его из себя можно только аппаратной перезагрузкой микросхемы EEPROM (перезагрузка микроконтроллера тут не помогает, по той же причине, что и переинициализация через HAL).
Именно такая ситуация возникла в моем случае. Проблема возникала случайным образом, но статистически она присутствовала. Если код инициализации Wire поместить ближе к началу программного кода, то вероятность возникновения ошибки уменьшается, если отодвинуть его куда-то подальше, то ошибка будет возникать чаще. И спастись от проблемы можно только аппаратным сбросом всего оборудования (передергиванием питания).
Так как же можно избавиться от проблемы «сумасшествия» ведомой микросхемы EEPROM? Очевидно, что нужно максимально быстро проинициализировать соответствующие терминалы ввода-вывода, дабы успеть в тот момент времени, пока EEPROM не начнет жить по своим собственным законам, повинуясь непонятным сигналам с микроконтроллера. Другими словами, подвинуть код инициализации Wire в самое начало программы. Но… Данный трюк не решает полностью описанное поведение EEPROM. Все еще остается вероятность отказа EEPROM (и опыты это подтверждают). Почему? Потому, что выполнение кода инициализации Wire занимает какое-то время, бесценные микросекунды, которых хватает на то, чтоб EEPROM удалились в мир грез и фантазий. Что в этом случае можно сделать?
pinMode(I2C_SCL, OUTPUT);
pinMode(I2C_SDA, OUTPUT);
Оказалось, что достаточно только проинициализировать порты микроконтроллера, ответственные за I 2 C как выходные цифровые выводы, как можно быстрее. В этом случае цифровое, а скорее аналоговое, шатание отменяется и невменяемость EEPROM тоже. В STM32Duino при инициализации пина как выходящего, он автоматически включается на низкий уровень. Если этого не происходит, например, поменялась идеология разработчиков фреймворка или вышла новая плата, на которой все не так, то дополнительно можно принудительно установить низкий уровень, что должно обеспечить нормальную работоспособность всей связки.
А что же до любителей HAL и особенно STM32Cube? Если работать только на HAL и не прибегать к Cube, как к средству конфигурирования, то проблема будет ровно такой же. Если не применить четкую инициализацию «ног» I 2 C как можно быстрее, то нормально с EEPROM не поработаешь. Впрочем, с Cube тоже не все так гладко как хотелось бы. Да, утилита помогает провести инициализацию микроконтроллера, которая сама по себе не отличается простотой. Но и тут могут быть нюансы. Во-первых, код инициализации I 2 C из Cube может быть выполнен в самую последнюю очередь, когда уже поздно, во-вторых, могут наступить и прочие конфликты, связанные с неверной инициализацией (Cube только выглядит просто, на самом деле без понимания туда лезть не стоит). Более подробно о потенциальных проблемах можно почитать в ссылках ниже.
Устройство HID на шине I2C что это такое?

Запуск устройства HID на шине I2C невозможен. Код 10. Что делать?

Intel RST VMD Controller Driver для процессоров 12-13 поколений

Asus TUF Gaming не работает тачпад

Ошибка Access Denied на сайте Lenovo. Что делать?
Устройство HID на шине I2C в диспетчере устройств
Просматривая устройства в диспетчере, некоторые пользователи могут отметить в нем некое устройство HID на шине I2C, помеченное восклицательным знаком. А это может говорить лишь об одном: с этим устройством есть проблемы. Причем они могут быть как программного характера, так и аппаратного.
В данной статье мы расскажем какое устройство обычно скрывается под данным названием и что можно попробовать сделать самостоятельно для устранения этой проблемы.
Запуск устройства HID на шине I2C невозможен (Код 10)
Для начала разберемся что это за устройство. В 80% случаев им является тачпад. В оставшихся 20% – клавиатура, подключенная по USB мышка или тачскрин (Сенсор экрана, если экран в вашем ноутбуке сенсорный).

Ошибка запуска устройства с кодом 10
Первым делом нужно проверить работоспособность всех этих устройств: ввести что-либо с клавиатуры, поводить пальцем по тачпаду и т.д.
То, что окажется нерабочим, и будет являться тем самым устройством HID на шине I2C.
Что делать, чтобы устройство заработало?
Самый верный путь – определить модель ноутбука, перейти на официальный сайт, скачать драйвера на все устройства ввода (тачпад, тачскрин, клавиатура) и установить их.
Второй вариант заключается в поиске драйвера для устройства по его идентификатору. Для этого в диспетчере устройств нужно дважды кликнуть мышкой по устройству HID на шине I2C.

Определение ИД оборудования
В открывшемся окне перейти на вкладку “Сведения” и выбрать свойство “ИД оборудования”.
Далее скопировать самое верхнее значение и вставить его в поиск гугла или яндекса.

Поиск драйвера к устройству по его ИД
В полученных результатах выдачи останется отыскать драйвер под ваше устройство.
Если ничего из вышеописанного не помогло и устройство HID на шине I2C все равно отображается в диспетчере устройств с восклицательным знаком и статусом “Запуск этого устройства невозможен. Код 10”, то это означает, что с этим устройством имеются проблемы на аппаратном уровне.
Например, поврежден или отсоединился шлейф или само устройство повреждено, например падением ноутбука или его залитием жидкостью. В этом случае лучше обратиться в сервис. А если все нормально работает, то и вовсе не обращать на него внимание.
Почему не определяются устройства на шине i2c
Почему i2c сканер не видит ЖК дисплей с модулем i2c?
Всем привет! Заказал с Китая ЖК дисплей 1602A с модулем для подключения по i2c. Загрузил скетч(ошибок не было), но ничего не выходит. Регулировал контрастность, но ничего. Запустил i2c сканер, но пишет «No I2C devices found». Почему он не видит дисплей? Разъемы подключил правильно.
+ при регулировании контрастности горит только верхняя строчка, нижняя ели ели виден. Это получается неисправен дисплей или что?
P.S Модуль к дисплею припаял сам, замыкании нет.

Обнаружение неисправности шины i2c
Поиск неисправностей в системной шине I2С Напряжение питания как к линии SDA, так и к линии SCL подводится через нагрузочные резисторы. Значение этого напряжения обычно составляет от 4,5 В до 5,5 В и должно точно соответствовать приведенному в сервисной документации уровню. Поиск неисправностей поэтому следует начинать с измерения питающего шину напряжения. К прекращению обмена информацией в шине могут привести также колебания питающего напряжения. Поэтому особое внимание следует обратить на наличие пульсаций напряжения питания, особенно в тех случаях, когда
Рис. 14.2. Осциллограмма сигналов в линии данных (SDA) шины 12C
Рис. 14.3. Осциллограмма тактового сигнала в линии синхронизации (SCL) шины 12C появляется какая-нибудь нерегулярная неисправность.
Пульсации могут составлять всего лишь несколько милливольт, поэтому в сомнительных случаях проверку питающего системную шину напряжения надо проводить с помощью осциллографа. Обычно на входах блоков, подключаемых к системной шине, или перед микросхемами в этих блоках располагают еще и развязывающие резисторы. С помощью измерения напряжения на этих резисторах можно установить наличие короткого замыкания в соответствующем блоке. Если такая неисправность присутствует, то измеренное напряжение на выводе резистора, со стороны подключенного блока или микросхемы, имеет существенно более низкое значение, чем на другом выводе резистора. Если же в проверяемых узлах короткое замыкание отсутствует, то падение амплитуды сигнала на соответствующих развязывающих резисторах незначительное из-за достаточно низкого их номинала (от 100 Ом до 1 кОм). Поиск неисправностей усложняется, когда отдельные узлы и схемы подключены к системной шине без развязывающих резисторов, так как в этом случае любой неисправный узел может полностью заблокировать обмен информацией по системной шине. В этом случае придется последовательно отсоединять подключенные к шине отдельные узлы и схемы. Уже измерение напряжения до и после нагрузочных резисторов может дать указание на вероятную неисправность в одном из устройств, подключенных к системной шине, если падение напряжения на этих резисторах слишком велико. Необходима также проверка наличия сигналов в линиях SCL и SDA шины. Отсутствие сигнала синхронизации в линии SCL указывает на необходимость проверки работоспособности центрального управляющего устройства, а также внешнего кварцевого резонатора тактового генератора ЦУУ. Неисправности частотозадающих элементов тактового генератора могут быть причиной отличия тактовой частоты от номинальной, что также может привести к нарушению обмена информацией в шине. Тактовая частота может представлять собой синусоидальный сигнал, либо сигнал прямоугольной или трапециевидной формы. На рис. 14.3 представлен сигнал тактовой частоты. Наличие импульсных сигналов номинальной амплитуды в линии SDA-шины (рис. 14.2)само по себе не дает достоверной информации о правильности обмена данными между узлами ВМ, подключенными к системной шине, но при их наличии можно условно считать, что обмен данными в системе происходит правильно.
Не определяется адрес дисплея по шине i2c
Время стояло и выводило все по нулям. Я перепробывал множетсво скетчей, все они заливались, но время остется неизменным. I2C сканер так же не выдает результатов, хотя скетчи с дисплеем на ssd1306 все работают и отлично. Помогите разобратся в чем может быть дело?
Так же скетч для просмотра времени работает и без модуля RTC.
При сканировании i2c устроств пишет
И больше ничего, ждал очень долго.
С подключением не может быть никаких проблем, если кто сталкивался помогите пожалуйста. Уже не знаю что делать, убил два дня в поисках, решил проблему только с изменившимися командами и названиями библиотек, т.к. очень большая часть материала и скетчей 2012-13 гг и библиотеки поменялись.
I2C сканер не может не работать. Модули обычно идут с мелкосхемой памяти на борту, должно родить два адреса 0х68 и 0хХЗ. Проверяйте питание, подключение, дорожки на модуле. Если светодиод на модуле горит, для начала предложил бы поменять местами SDA-SCL.
Попробовал, но ничего не изменилось, сначала так же и дисплеи не определял, затем начал показывать фигню всякую при перетыкании, затем стал выдавать стабильно адрес у одного и второго дисплея, а ds1307 так и не видит. Ну хоть теперь дисплееи видит. При совместном подключении и RTC модуля и дислпея так же ничего не видит, может быть так что модуль косяченый? Хотя отзывы на али хорошие, и пишут что все работает, диод выпаял с резистором, R6 замкнут, кварц заменил из радиоприемника на rda5807 тоже 32кГц, заказывал сразу 2 модуля, второй точно так же не работает.
Arduino.ru
LCD I2C arduino не могу подключить
попробовать опредилить адрес заливаю его а мне только показывает Scanning. и дальше ничего. Что подскажете сделать?



а почему дисплей подключен сразу к 3,3 В и к 5 В?
там просто плохо видно он подключен к 5 и к земле
Все вы правильно делаете. Ищите контакт со стороны UNO, попробуйте разъемы SCL и SDA на UNO рядом с кварцем.
Можете рассмотреть чип на переходнике. Маркировка PCF8574T даст I2C адрес по умолчанию 0x27, PCF8574AT — адрес 0x3F.
Я это все уже пробовал к сожалению ничего не помогло, а маркировка ida8574p n2k0h5

сканер I2C какой адрес выдает?
в том и дело что сканер ничего не выдает пишет что началось сканирование и все ничего более не происходит
Код сканера корректно обрабатывает ситуации, когда вообще никакое устройство не подключено к I2C. Был неправ, дело не в контакте. Что-то у вас с программной средой.
Маркировкой чипа адаптера сильно озадачили. Но дело все равно не в этом.
и что посоветуете сделать? уже куча всего перепробовал
прописать ноги Ардуины как входы, дальше сделать пустой бесконеный цикл и посмотреть тестером наряжение на ногах, т.е. проверка на наличие подтягивающих резисторов к +5В
Ну подсказал же уже. Железо тут вообще ни при чем, этот код работает на пустой плате. Далек от среды ардуино, но специально запустил приведенный вами код на такой же плате, что и на фотографии. Библиотека Wire работает хорошо и не зависает, мне не удалось найти в ее коде возможные причины зависания при неподключенном устройстве.
Если правильно вас понял, вы видите в окне терминала слово Scanning. и на этом все заканчивается. Но чудес не бывает (только если очень редко). Из цикла for вы не выходите, зависнуть там можно только при входе в Wire (ну или в twi.h, которая под ней), никто из них не зависает (у меня, специально мучил).
Какой вывод? Разбирайтесь со средой, с ее установками или что там. Вообще что-нибудь, не требующее перефирии, запускается?
И вам спасибо. Благодаря вам посмотрел библиотеки, twi.h забавно написана, хорошо.
I2C-адрес устройства и как его узнать
Для подключения различных модулей к Arduino, например, датчиков, дисплеев и АЦП удобно пользоваться шиной I2C (Inter-Integrated Circuit).
Каждое подключенное устройство имеет свой адрес, к одной шине может быть подключено до 119 устройств (всего адресов 127, 8 из них –зарезервированные служебные).
Самая распространённая проблема при использовании I2C – незнание адреса подключаемого устройства (хотя обычно производитель указывает их). Особенно это заметно при использовании дешёвых китайских устройств разных производителей, например, символьного LCD дисплея с I2C адаптером (их адреса обычно 0x27 или 0x3F). Решение этой проблемы мы и разберём в статье.
Для начала подключаем проверяемое устройство к плате Arduino:
- VCC к 5v;
- GND к GND, земле;
- SDA к SDA или A4 (UNO/Nano) либо к 20 (Mega) и подтягивающий резистор на 10 кОм к плюсу питания (опционально);
- SCL к SCL или A5 либо к 21 и подтягивающий резистор на 10 кОм к плюсу питания.

Для того, чтобы проверить наличие подключенных к Arduino I2C-устройств, нужно просто просканировать каждый доступный адрес с 8 до 127. Успешно прошедшая отправка данных – верный признак наличия ведомого устройства на шине. Итак, подключаем плату Arduino к компьютеру и загружаем следующий скетч:
Подключить несколько устройств i2c на Arduino
IIC Arduino (I2C – Inter-Integrated Circuits, межмикросхемное соединение) — это последовательный протокол обмена данными по двум двунаправленным линиям связи. Эти линии называют также: SDA (Serial Data) — шина последовательных данных и SCL (Serial Clock) — шина тактирования. Шины SDA и SCL Arduino подтягиваются к шине питания через резисторы. Рассмотрим подробнее, что это такое шина i2c arduino.
Шина I2C Ардуино описание
Микроконтроллеры Arduino используют два пина для работы по интерфейсу I2C. В Arduino Uno и Nano линии SDA соответствует аналоговый порт A4, а SCL соответствует аналоговый порт A5. На Ardunio Mega SDA — 20 пин, SCL — 21 пин. Для облегчения работы с шиной I2C и обмена данными между устройствами для Arduino IDE написана стандартная библиотека Wire (скачивать и устанавливать ее не надо).
Для каждого устройства, при подключении к микроконтроллеру, присваивается уникальный адрес (максимум можно подключить 127 устройств). Поменять адрес устройства на шине нельзя, так как он вшит в микросхему. Часто производители предоставляют возможность поменять адрес устройства в небольшом диапазоне, что дает возможность подключить к шине IIC Ардуино несколько одинаковых устройств.
Сканер I2C интерфейса (шины) Ардуино
Для этого занятия нам потребуется:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- макетная плата;
- два текстовых дисплея 1602 I2C;
- любое устройство с I2C интерфейсом;
- провода «папа-папа», «папа-мама».
Перед тем, как управлять несколькими объектами, подключенных к IIC шине, необходимо узнать их адреса. Для этого используется программа — сканер I2C Arduino, которая позволяет узнать адреса всех устройств, подключенных в данный момент к шине. Соберите схему из двух текстовых экранов с IIC модулем (можно подключить только одно устройство), подключенных к Ардуино Уно, и загрузите следующий скетч.
Скетч. Сканер шины i2c для Arduino
Пояснения к коду:
- данный код позволяет узнать все адреса устройств, подключенных к шине IIC. Если устройство не было подключено или подключено неправильно — на мониторе порта будет выходить сообщение, что устройства не найдены;
- ниже, на скриншоте монитора порта Arduino IDE, выводится адрес LCD 1602.
Сканер шины i2c для Arduino с LCD дисплеем
Как подключить нескольких устройств по I2C Arduino
В следующем примере к шине IIC Arduino будет подключено сразу три устройства — текстовый дисплей 1602, датчик давления bmp180 и RTC модуль часов. После сборки схемы можно сделать предварительное сканирование шины, но адреса у всех устройств разные и изменить адрес можно только у дисплея. У других устройств адреса «вшиты» производителем и используются в библиотеках по умолчанию.
Скетч. Подключение нескольких устройств к шине i2c
После сборки схемы, убедитесь, что у вас установлены необходимые библиотеки для работы с устройствами по IIC протоколу, и загрузите следующий пример кода в микроконтроллер. Данная программа будет выводить на текстовый экран текущую дату и время суток (устанавливаются в процедуре void setup и время можно поменять), а также данные о температуре воздуха и атмосферном давлении.
Пояснения к коду:
- обновление информации на текстовом экране происходит каждую секунду, данный интервал можно увеличить по своему желанию;
- время выводится с секундами, формат вывода времени и даты также можно изменить в строчке LCD.print(time.gettime(«H:i:s — d.m»));
Заключение. Мы рассмотрели возможность подключения нескольких устройств по протоколу IIC к плате Arduino, что будет полезно знать при проектировании различных DIY поделок своими руками, например метеостанции на Ардуино с датчиком давления. Если у вас остались вопросы по сканеру IIC интерфейсной шины или подключении устройств по данному протоколу — смело оставляйте их в комментариях к этой записи.
Урок 24. Узнаём адреса устройств на шине I2C

В этом уроке мы научимся определять адреса устройств на шине I2C, аппаратно устанавливая состояния Start/Stop на шине I2C и передавая байт данных с адресом устройства и битом RW.
Нам понадобится:
- Arduino х 1шт.
- LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
- Trema Shield х 1шт.
- Trema-модуль i2C Hub х 1шт.
- Trema-модуль кнопка c проводом х 1шт.
- Шлейф «мама-мама»для шины I2С х 2шт.
- Устройства и модули с шиной I2C, адреса которых Вы хотите узнать, до 126 шт.
Для реализации проекта нам необходимо установить одну библиотеку:
- Библиотека LiquidCrystal_I2C_V112 (для работы с дисплеем LCD1602 по шине I2C)
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE, а о том, как работать с LCD дисплеями, на странице Wiki — Работа с символьными ЖК дисплеями.
Видео:
Схема подключения:

Алгоритм работы:
- При однократном нажатии на кнопку — выводится очередной адрес.
- При удержании кнопки — производится чтение адресов, всех подключенных к шине I2C устройств.
Код программы:
Алгоритм работы программы:
Код в функции loop() начинает выполняться только при условии, если нажата кнопка. Если таковое событие произошло, то начинает исполняться цикл while() выход из которого осуществляется при отпускании кнопки. В самом цикле происходит подсчёт времени удержания кнопки.
После отпускания кнопки, программа выполняет одно из двух действий:
- Если кнопка удерживалась меньше 1 секунды, то происходит увеличение порядкового номера выводимого адреса.
- Если кнопка удерживалась дольше 1 секунды, то происходит чтение всех доступных адресов на шине I2C.
Чтение адресов на шине I2C происходит в цикле for() от 1 до 127, где индекс цикла соответствует проверяемому адресу. Проверка на существование адреса осуществляется следующим образом:
- Вызывается функция func_START, которая устанавливает состояние СТАРТ на шине I2C и возвращает результат установки данного состояния.
- Если состояние СТАРТ установлено, то вызывается функция func_SEND, которая передает свой аргумент как байт адреса с битом RW=0 и если на шине зафиксирован ответ ACK, то возвращает результат true, иначе false.
- Если на шине зафиксирован результат ACK, то переданный адрес сохраняется в массив найденных адресов, за исключением адреса 0x27 который является адресом LCD дисплея.
- Вызывается функция func_STOP, которая устанавливает состояние СТОП на шине I2C.
И последнее действие программы — вывод данных на дисплей, не зависимо от того, как долго удерживалась кнопка.
Так как передача данных осуществляется только после отпускания кнопки, то допускается «горячее» подключение проверяемых устройств к шине I2C, если кнопка не нажата.
I2C сканер на Arduino
Автор: Сергей · Опубликовано 26.10.2017 · Обновлено 27.09.2019
В этой статье расскажу как с помощью Arduino сделать I2C сканер, в качестве примера определю адрес LCD1602 дисплей, работающего по интерфейсу I2C.

I2C сканер на Arduino
Немного теории, I2C — это протокол, который позволяет различным устройствам взаимодействовать друг с другом используя одну шину данных SDA и SCL (всего два проводника), так же, для каждого устройства присваивается свой уникальный адрес (максим 127 устройств). Поменять адрес устройства нельзя, он намертво вшит в микросхему, но некоторые производитель предоставил возможность изменять адрес в небольшом диапазоне, это дает возможность подключить несколько одинаковых устройств (с одинаковым чипом) к одной шине.
Иногда, нет возможности найти документацию на микросхему или микросхема не имеет адрес схожий от документации (такое то же бывало), тогда поможет данный скетч. В примере используется Arduino UNO и LCD модуль I2C (который имеет брак и другой адрес, не 0x27), так-же, интерфейс I2C работает только на определенные выводах (в arduino UNO это A4 и A5), приведу таблицу подключения для различных платформ Arduino.

Собираем принципиальную схему

Открываем среду разработки IDE Arduino, копируем скетч и загружаем его в платформу Arduino.
Устройство HID на шине I2C что это такое?

Запуск устройства HID на шине I2C невозможен. Код 10. Что делать?

Asus TUF Gaming не работает тачпад

Ошибка Access Denied на сайте Lenovo. Что делать?

Не регулируется яркость экрана на Lenovo Z500/Z400
Устройство HID на шине I2C в диспетчере устройств
Просматривая устройства в диспетчере, некоторые пользователи могут отметить в нем некое устройство HID на шине I2C, помеченное восклицательным знаком. А это может говорить лишь об одном: с этим устройством есть проблемы. Причем они могут быть как программного характера, так и аппаратного.
В данной статье мы расскажем какое устройство обычно скрывается под данным названием и что можно попробовать сделать самостоятельно для устранения этой проблемы.
Запуск устройства HID на шине I2C невозможен (Код 10)
Для начала разберемся что это за устройство. В 80% случаев им является тачпад. В оставшихся 20% – клавиатура, подключенная по USB мышка или тачскрин (Сенсор экрана, если экран в вашем ноутбуке сенсорный).

Ошибка запуска устройства с кодом 10
Первым делом нужно проверить работоспособность всех этих устройств: ввести что-либо с клавиатуры, поводить пальцем по тачпаду и т.д.
То, что окажется нерабочим, и будет являться тем самым устройством HID на шине I2C.
Что делать, чтобы устройство заработало?
Самый верный путь – определить модель ноутбука, перейти на официальный сайт, скачать драйвера на все устройства ввода (тачпад, тачскрин, клавиатура) и установить их.
Второй вариант заключается в поиске драйвера для устройства по его идентификатору. Для этого в диспетчере устройств нужно дважды кликнуть мышкой по устройству HID на шине I2C.

Определение ИД оборудования
В открывшемся окне перейти на вкладку “Сведения” и выбрать свойство “ИД оборудования”.
Далее скопировать самое верхнее значение и вставить его в поиск гугла или яндекса.

Поиск драйвера к устройству по его ИД
В полученных результатах выдачи останется отыскать драйвер под ваше устройство.
Если ничего из вышеописанного не помогло и устройство HID на шине I2C все равно отображается в диспетчере устройств с восклицательным знаком и статусом “Запуск этого устройства невозможен. Код 10”, то это означает, что с этим устройством имеются проблемы на аппаратном уровне.
Например, поврежден или отсоединился шлейф или само устройство повреждено, например падением ноутбука или его залитием жидкостью. В этом случае лучше обратиться в сервис. А если все нормально работает, то и вовсе не обращать на него внимание.
