Все адреса шины i2c

Все адреса шины 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

Алгоритм работы:

  • При однократном нажатии на кнопку — выводится очередной адрес.
  • При удержании кнопки — производится чтение адресов, всех подключенных к шине 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, если кнопка не нажата.

Видео:Установщик адресов Flash-i2cСкачать

Установщик адресов Flash-i2c

Адреса модулей на шине I2C

Видео:Урок 9. Адреса модулей на шине I2C. Arduino (что такое I2C, адресация, как изменить адрес модуля)Скачать

Урок 9. Адреса модулей на шине I2C. Arduino (что такое I2C, адресация, как изменить адрес модуля)

В этом уроке

  • Что такое I2C и в чем её удобство
  • Адресация модулей
  • Как изменить адрес модуля и почему это важно

Видео:Урок 24. Узнаём адреса устройств на шине I2CСкачать

Урок 24. Узнаём адреса устройств на шине I2C

Видео версия урока

Видео:Подключение нескольких устройств по шине i2cСкачать

Подключение нескольких устройств по шине i2c

Назначение и принцип работы шины I2C

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

Все модули, которые управляются по шине I2C, на самом деле соединены одним шлейфом. Это позволяет, используя всего два вывода контроллера, подключить к нему более сотни устройств! (Поясним: мотор подключен шиной из 4-х проводов: два из них — питание: + и -, и еще два — именно провода шины I2C, поэтому, можно сказать, что для управления модулем требуется всего два провода).

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

Если адреса устройств разные, то всё работает, как задумано: нужное устройство по нужному адресу выполняет предназначенные для него команды. Однако, если адреса устройств совпадают, то контроллер не сможет отличить модули друг от друга. Для того, чтобы всё работало, как задумано, каждый модуль в пределах одной шины должен иметь свой уникальный адрес.

Все адреса шины i2c

Видео:Лекция 308. Шина I2CСкачать

Лекция 308.  Шина I2C

Изменение I2C-адресов модулей

Изначально все наши модули имеют адрес 0х09, но, как мы уже знаем, все модули должны иметь разные адреса. Давайте сразу поменяем адреса всех модулей, с которыми будем работать. Для того, чтобы его изменить, воспользуйтесь скетчем ниже.

Важно! При изменении адреса к контроллеру должен быть подключен только один модуль.

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

Для этого потребуется открутить 4 винта и снять модуль питания, после чего достать контроллер.

*Шлейфы на картинке не показаны, их можно не отключать

Все адреса шины i2c

После этого подключаем к контроллеру модуль правый мотор, как показано на рисунке (модуль с платы снимать не нужно):

Все адреса шины i2c

Выводы модуляВыводы контроллера
GNDGND
5V5V
SDAA4
SCLA5

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

После того, как Вы подключили правый мотор к контроллеру, загрузите следующий скетч. После загрузки адрес модуля будет изменён на тот, который Вы указали в начале скетча (3 строка).

Адреса для модулей:

МодульАдрес
Правый мотор0х0А
Левый мотор0х0В
Бампер-датчик линии0х0С
Матрица 8х80х0D

Больше устройств I2C на машинке не предвидится. Остальные модули работают не по шине I2C (они просто подключаются к выводам контроллера).

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

Измените таким же образом адреса всех модулей на указанные в таблице.

Теперь можно снова собрать машинку и двигаться дальше. Наши модули готовы к работе.

Видео:Логический анализатор шины i2cСкачать

Логический анализатор шины i2c

Проверка моторов

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

Видео:STM32. CMSIS. Урок#06: I2C. Теория. Сканер I2C адресов. Отправка и прием данных. MemWrite, MemRead.Скачать

STM32. CMSIS. Урок#06: I2C. Теория. Сканер I2C адресов. Отправка и прием данных. MemWrite, MemRead.

Программная установка адресов модулей FLASH-I2C

Видео:Введение в шину I2CСкачать

Введение в шину I2C

Общие сведения:

Все модули серии «Flash» позволяют назначать себе адрес для шины I2C, который сохраняется в энергонезависимую память и действует даже после отключения питания. По умолчанию все модули серии «Flash» поставляются с адресом 0x09. Допускается указывать адреса в диапазоне: 7 newAddress , но и обнаружение, и вывод текущего адреса модуля на шине I2C.

Смена адресов нескольких модулей:

Пример меняет адреса нескольких модулей сразу. Модулям с адресами 0xAB и 0xCD назначаются адреса 0x10 и 0x11 соответственно. На шине могут присутствовать и иные модули, адреса которых отличаются от указанных.

Для работы данного примера, на шине I2C должны присутствовать модули с адресами указанными при определении массива объектов j .

Читайте также: Шины гудрич для внедорожников всесезонные

В примере не используются циклы работы с массивом, для простоты его понимания.

Если объявить массив объектов без указания адресов, например, iarduino_I2C_Address j[2]; то адреса будут определены автоматически. Нулевой элемент массива объектов будет работать с модулем имеющем наименьший адрес и далее по возрастанию. Если количество устройств на шине меньше чем количество элементов массива объектов, то «лишние» элементы массива не пройдут инициализацию и не пройдут проверку if( j[n] ) .

Видео:25 Шина I2CСкачать

25 Шина I2C

Описание функций библиотеки:

В данном разделе описаны функции библиотеки iarduino_I2C_Address для работы с модулями серии Flash-I2C.

Данная библиотека может использовать как аппаратную, так и программную реализацию шины I2C. О том как выбрать тип шины I2C рассказано в статье Wiki — расширенные возможности библиотек iarduino для шины I2C.

Подключение библиотеки:

  • Если адрес модуля известен (в примере используется адрес 0x09):
  • Если адрес модуля неизвестен (адрес будет найден автоматически):
  • Если адреса модулей известны (в примере используются адреса 0x0A, 0x0B, 0x0C):
  • Если адреса модулей неизвестны (адреса будут найдены автоматически):

При создании объекта без указания адреса, на шине должен находиться только один модуль.

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

Функция begin();

  • Назначение: Инициализация работы с модулем серии flash-I2C.
  • Синтаксис: begin();
  • Параметры: Нет.
  • Возвращаемое значение: bool — результат инициализации (true или false).
  • Примечание:
    • По результату инициализации можно определить наличие модуля на шине.
    • Функцию достаточно вызвать однократно, но обязательно до обращения к любым другим функциям объекта библиотеки.

    Оператор присвоения адреса

    • Назначение: Смена адреса модуля на шине I2C.
    • Синтаксис: ОБЪЕКТ = АДРЕС.
    • Параметры: Нет.
    • Возвращаемое значение: bool — результат сохранения нового адреса (true или false).
    • Примечание: Вместо оператора «=» можно использовать функцию changeAddress().
    • Пример:

    Оператор получения адреса

    • Назначение: Запрос текущего адреса модуля на шине I2C.
    • Синтаксис: ПЕРЕМЕННАЯ = ОБЪЕКТ.
    • Параметры: Нет.
    • Возвращаемое значение: uint8_t — текущий адрес модуля.
    • Примечание: Вместо оператора «=» можно использовать функцию getAddress().
    • Пример:

    Операторы получения и присвоения адреса работают как операторы получения и присвоения значений переменным.

    Видео:Сканер I2C шиныСкачать

    Сканер I2C шины

    Дополнительные функции библиотеки:

    Дополнительные функции позволяют работать с любыми модулями серии Flash-I2C.

    Видео:Подключение нескольких устройств, датчиков по I2C (АйТуСи) шинеСкачать

    Подключение нескольких устройств, датчиков по I2C (АйТуСи) шине

    Как узнать I2C адрес устройства?

    I2C — это такая шина данных, широко используемая в микроэлектронике. С помощью I2C можно подключить к Ардуино много разных полезных модулей, включая датчики, дисплеи, АЦП и даже другие платы Ардуино.

    Шина является адресной, так что каждое подключаемое устройство имеет свой адрес в диапазоне от 8 до 127. На одной шине не может быть два устройства с одинаковыми адресами.

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

    Видео:Шина I2C.Скачать

    Шина I2C.

    Программа для сканирования I2C шины

    Чтобы понять, какой всё-таки адрес у модуля, подключаемого к плате Ардуино, нужно просто «постучаться» по каждому из 119 возможных адресов. Если кто-то ответит, значит адрес рабочий!

    Загружаем программу на Ардуино Уно, подключаем тестируемое устройство к I2C шине и открываем монитор последовательного порта. Если все подключено правильно, то появится примерно такой отчет:

    Все адреса шины i2c

    Это значит, что мой дисплей имеет адрес 0x27 в шестнадцатеричной системе счисления. Теперь можно смело подключить библиотеку для работы с такими дисплеями и указать в ней данный адрес.

    Видео:Как узнать адрес устройства подключенного к шине I2CСкачать

    Как узнать адрес устройства подключенного к шине I2C

    Как узнать I2C адрес устройства? : 19 комментариев

    Очень интересно, но думаю не помешала бы принципиальная схемка подключения I2C устройства к Ардуино. Ну или ссылка на такую процедуру.

    Видео:Декодер протоколов | Часть первая I2C снифферСкачать

    Декодер протоколов | Часть первая I2C сниффер

    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 кОм к плюсу питания.

    Все адреса шины i2c

    Для того, чтобы проверить наличие подключенных к Arduino I2C-устройств, нужно просто просканировать каждый доступный адрес с 8 до 127. Успешно прошедшая отправка данных – верный признак наличия ведомого устройства на шине. Итак, подключаем плату Arduino к компьютеру и загружаем следующий скетч:

    Видео:Урок №49. Пишем программу для поиска адреса I2C датчиков в среде программирования Arduino IDE.Скачать

    Урок №49. Пишем программу для поиска  адреса I2C датчиков в среде программирования Arduino IDE.

    Электроника для всех

    Видео:AVR 47# Программный I2CСкачать

    AVR 47# Программный I2C

    Блог о электронике

    Видео:Аппаратная реализация шины I2C на AtmegaСкачать

    Аппаратная реализация шины I2C на Atmega

    Интерфейсная шина IIC (I2C)

    Один из моих самых любимых интерфейсов. Разработан в компании Philips и право на его использование стоит денег, но все на это дружно положили и пользуют в свое удовольствие, называя только по другому. В Atmel его зовут TWI , но от этого ничего не меняется ? Обычно при разборе IIC во всех книгах ограничиваются примером с EEPROM на этом и ограничиваются. Да еще юзают софтверный Master. Не дождетесь, у меня будет подробный разбор работы этой шины как в режиме Master так и Slave, да еще на аппаратных блоках с полным выполнением всей структуры конечного автомата протокола. Но об этом после, а сейчас основы.

    Физический уровень.
    Данные передаются по двум проводам — провод данных и провод тактов. Есть ведущий (master) и ведомый (slave), такты генерирует master, ведомый лишь поддакивает при приеме байта. Всего на одной двупроводной шине может быть до 127 устройств . Схема подключения — монтажное И

    Передача/Прием сигналов осуществляется прижиманием линии в 0 , в единичку устанавливается сама, за счет подтягивающих резисторов . Их ставить обязательно всегда ! Стандарт! Резисторы на 10к оптимальны. Чем больше резистор, тем дольше линия восстанавливается в единицу (идет перезаряд паразитной емкости между проводами) и тем сильней заваливаются фронты импульсов, а значит скорость передачи падает. Именно поэтому у I 2 C скорость передачи намного ниже чем у SPI . Обычно IIC работает либо на скорости 10кбит/с — в медленном режиме, либо на 100кбит/с в быстром. Но в реальности можно плавно менять скорость вплоть до нуля.
    Ни в коем случае нельзя переключать вывод микроконтроллера в OUT и дергать ногу на +5. Можно запросто словить КЗ и пожечь либо контроллер либо какой-нибудь девайс на шине. Мало ли кто там линию придавит.

    Читайте также: Датчик давления шин хендай крета оригинал

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

    После старта передача одного бита данных идет по тактовому импульсу. То есть когда линия SCL в нуле master или slave выставляют бит на SDA (прижимают — если 0 или не прижимают — если 1 линию SDA ) после чего SCL отпускается и master/slave считывают бит. Таким образом, у нас протокол совершенно не зависит от временных интервалов , только от тактовых битов. Поэтому шину I 2 C очень легко отлаживать — если что то не так, то достаточно снизить скорость до байта в минуту и спокойно, обычными вольтметрами, смотреть что у нас происходит. Правда это не прокатит с железным I 2 C , там нет таких низких скоростей. Но что нам мешает затактовать микроконтроллер от ОЧЕНЬ медленного тактового генератора и отладить все по шагам? ?

    Повторим для ясности:

    То есть, изменение на шине данных в момент приема данных может быть только при низком уровне на SCL . Когда SCL вверху то идет чтение. Если же у нас SDA меняется при высоком SCL , то это уже служебные команды START или STOP .

    Если Slave торомоз и не успевает (у EEPROM, например, низкая скорость записи), то он может насильно положить линию SCL в землю и не давать ведущему генерировать новые такты . Мастер должен это понять и дать слейву прожевать байт. Так что нельзя тупо генерить такты, при отпускании SCL надо следить за тем, что линия поднялась. Если не поднялась, то надо остановиться и ждать до тех пор, пока Slave ее не отпустит. Потом продолжить с того же места.

    Логический уровень
    Как передаются отдельные биты понятно, теперь о том что эти биты значат. В отличии от SPI тут умная адресная структура. Данные шлются пакетами, каждый пакет состоит из девяти бит. 8 данных и 1 бит подтверждения/не подтверждения приема.

    Первый пакет шлется от ведущего к ведомому это физический адрес устройства и бит направления .
    Сам адрес состоит из семи бит (вот почему до 127 устройств на шине), а восьмой бит означает что будет делать Slave на следующем байте — принимать или передавать данные . Девятым битом идет бит подтверждения ACK . Если Slave услышал свой адрес и считал полностью, то на девятом такте он придавит линию SDA в 0, сгенерировав ACK — то есть Понял! Мастер, заметя это, понимает, что все идет по плану и можно продолжать. Если Slave не обнаружился, прозевал адрес, неправильно принял байт, сгорел или еще что с ним случилось, то, соответственно, SDA на девятом такте будет прижать некому и ACK не получится. Будет NACK . Мастер с горя хлопнет водки и прекратит свои попытки до лучших времен.

    После адресного пакета идут пакеты с данными в ту или другую сторону, в зависимости от бита RW в заголовочном пакете.
    Вот, например, Запись. В квадратиках идут номера битов. W=0

    Чтение практически также, но тут есть одна тонкость из-за которой я когда то убил кучу времени. При приеме последнего байта надо дать ведомому понять, что в его услугах больше не нуждаемся и отослать NACK на последнем байте. Если отослать ACK то после стопа Master не отпустит линию — такой уж там конечный автомат. Так что прием двух байтов будет выглядеть так (R=1):
    Есть еще одно состояние, как повторный старт .
    Это когда мы не обьявляя STOP вкатываем на шину еще один START . После него мы можем обратиться к другому устройству не освобождая шину. Но чаще идет обращение к тому же самому устройству и это связано с особенностями организации памяти.

    Организация памяти.
    Это относится уже не столько к самому протоколу I 2 C , сколько к заморочкам создателей разных EEPROM и прочих I 2 C устройств. Но встречается это повсеместно, поэтому я расскажу про этот момент. Но, повторюсь, это не аксиома, не стандарт и вообще зависит от конкретного Slave устройства. Так что датит в зубы и вкуривать, но обычно так принято.

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

    Поясню на примере:
    Есть микросхема часов реального времени PCF8583 (я про нее еще напишу, следите за обновлениями), общающася по протоколу I 2 C . Внутри нее ячейки памяти, в которых хранятся часы, минуты, секунды, дата, состояние флагов и куча еще всего. До кучи там еще 240 байт просто так, для свободного пользования. Карта адресов этой микросхемы выглядит так:

    И вот надо мне установить дату. Для этого надо мне записать две ячейки памяти с адресами 0х05 и 0x06 . Как это сделать? Из даташита я узнаю, что первый байт данных это адрес куда мы будем обращаться, а потом уже идут данные и со следующим байтом счетчик адреса увеличивается на 1. Там же, в даташите, написано что эти часы откликаются на Slave-адрес 1010000х где х — состояние ноги А0 микросхемы . Я эту ногу сразу посадил на 0 так что Slave-адрес у меня 10100000. Очевидно, что на одной шине может быть не более двух экземпляров этой микросхемы с адресами 10100000 и 10100001.

    Задача решается так:
    Вот и славно. Часы установлены и начали тикать. Но вот надо нам считать те же данные, а вдруг изменились?
    С записью все понятно — записали вначале адрес, а потом следом записали данные. А умная микросхема все прекрасно поняла и рассовала по ячейкам. А с чтением? А с чтением все через задницу, в смысле через запись.

    То есть, мы, вначале, записываем один байт — адрес. Потом делаем повторный старт, затем снова обращаемся к часам по ее Slave-адресу , но уже с битом R , на чтение. И умная микруха выдает нам байты с адреса который мы в нее вот только что записали. Выглядит это так:
    В этих часах так, у других микрух может быть все по другому, но в 99% очень похоже. Адрес, например, может быть двухбайтным или страницу надо будет указать, но сути это не меняет. Цепочка запись-повстарт-чтение это повсеместно.
    Вот так, кстати, выглядит чтение данных из часов PCF8583 на экране моего логического анализатора. Тут не полная посылка (все 5 байт просто не влезли в экран), но тут четко видно запись начального адреса, потом повторный старт, и чтение из девайса.

    Скриншот с осциллографа RIGOL 1042CD

    Арбитраж шины I 2 C.
    Почему то все мануалы для начинающих в которых рассматривалась тема протокола IIC как то ссыкливо замалчивают возможность работы двух ведущих на линии. Master-Slave и все тут. А если у нас демократия? И каждый сам себе Master и сам себе Slave ? Согласен, редкий случай, но тем не менее, описывать так описывать. Короче, в случае подобного садо-мазо варианта действует железное правило — кто раньше встал того и тапки. В смысле кто первый начал вещать тот и текущий Master .
    Но вот случилось вообще невероятное — два Ведущих начали вещать одновременно . Прям совсем одновременно. Как быть? А тут нам поможет свойство монтажного И — где против лома нуля нет приема. Короче, оба мастера бит за битом играют в простую игру ножик-камень(1 и 0 соответственно). Кто первый выкинет камень против ножика тот и побеждает арбитраж, продолжая вещать дальше. Так что очевидно, что самый важный адрес должен начинаться с нулей, чтобы тот кто к нему пытался обращаться всегда выигрывал арбитраж. Проигравшая же сторона вынуждена ждать пока шина не освободится.

    Вроде бы все, практический пример с AVR будет потом, а пока помедитируйте над диаграммой работы конечного автомата TWI передатчика ATmega8. Скоро я вас буду этим грузить!

    Страшна? ? На самом деле там все не так брутально. Можно обойтись вообще парой десятков строк кода на ассемблере.

    Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

    А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.

    Видео:I2C ScannerСкачать

    I2C Scanner

    200 thoughts on “Интерфейсная шина IIC (I2C)”

    (1) OpenID работает криво. Я зашёл как blacklion.livejournal.com и всё равно справа-сверху «войти» (а не «выйти») и не даю комментировать. Пришлось регистрироваться и теперь тут два меня.

    (2) Софтового мастера сделать не сложно. А вот слейва как-то просто не получается.

    Щас попробую с опен ид поиграться.

    Более того, многие предпочитают делать софтовый И2С мастер чтобы не заморачиваться с встроенным в TWI конечным автоматом.

    Более того, многие предпочитают делать софтовый И2С мастер чтобы не заморачиваться с встроенным в TWI конечным автоматом.
    Я когда первый раз подходил к электронике смотрел на PIC (зачем я это делал!? Зачем на PIC?!) так реализовал мастера в качестве упражнения за вечер. А вот слейва так и не осилил…

    Я сделал софтового слейва на AT89C2051, но работало жутко медленно.

    плюсадин. я уже раз 5 жаловался что логины глючат ? нашел выход, что залогинился, пару минуток подождал и рефреш. работает, но бесит :\

    DI HALT спасибо за статью. Давно ждал рассказ про I2C. ?

    Могу поделицца опытом работы конкретно с DS1307. Он, сука, еще тот глючный девайс. Вроде просто, но не все просто. ПРопиши бит СН, запусти часы, не забудь про бит снова, ой а чо горим — а мы забыли Vbat на землю положить…

    У меня их почти полный аналог ICL12008 ваще работать не хотят — не отзываются на свой адрес, не дают ACK

    и у тебя, Брут? я изъебался с их инициализацией — не пашут и все. взял ds, который считал сгоревшим и не рабочим, по по недоразумению не выкинул — и он заработал. в топку эти ISL, от лукавого они..

    А у меня 5 штук их лежит — сэмплы. Надо бы в ST гневный мессадж накатать. МОл чо вы за говно нам подсунули?

    Да, есть такое дело ? Вообще при начале работы с IIC девайсом, желательно вдоль и поперек изучить Datasheet к нему. В свое время тоже поломал голову с m41 от ST. Вроде все пишется, все читается, но часы стоят и все тут. Оказалось там есть хитрый битик, который при пропадании всего питания — Vcc и Vbat, останавливает часы и пока его не сбросишь они не пойдут.
    Ну и еще обычный прикол с часами, что не все могут работать при отключенной батарейке — даже если Vcc есть, внутри у них стоит контроль, который проверяет разницу между напругой и Vbat, и если Vbat нет, то часы просто ни на что не отвечают ?

    p.s. а про NACK в конце чтения это да, самые популярные грабли наверно. Кстати для отлаживания шины если нет крутого осцила, можно прикрутить I2C Sniffer на Atmega8 — оч удобная штука, она в консоли показывает полностью весь обмен в удобоваримом виде.

    А чё с ним было голову ломать? Кстати, m41t56 рекомендую, простые и удобные I2C часы. Про битик я давно знал — он у всех часовых изделий от ST присутствует. Наверное, как совместимость с m48t08 — который с батареей на борту. Чтобы батарею не сажать, пока таймкипер лежит на складе, они глушат часы.

    О)) На самом деле классная тема! Мне бы сначала с простым UARTом разобраться, а потом только к творению Philips)) Буду ждать исходников…

    Отличная статья! А есть последняя диаграмма только в чуть лучшем качестве? А то буквы трудно различить.

    Красные пути — нормальная работа
    Синие — возможные косяки.

    • Свежие записи
      • Нужно ли менять пружины при замене амортизаторов
      • Скрипят амортизаторы на машине что делать
      • Из чего состоит стойка амортизатора передняя
      • Чем стянуть пружину амортизатора без стяжек
      • Для чего нужны амортизаторы в автомобиле

      💥 Видео

      FLprog урок №2 шины данных Uart\I2C\ICSP\OneWireСкачать

      FLprog урок №2 шины данных Uart\\I2C\\ICSP\\OneWire

      Программирование МК PIC. Урок 19. MSSP. I2C. Подключаем внешний EEPROM. Часть 1Скачать

      Программирование МК PIC. Урок 19. MSSP. I2C. Подключаем внешний EEPROM. Часть 1
Поделиться или сохранить к себе:
Технарь знаток