Hid на шине i2c

USB-UART/I2C модуль класса HID от FTDI

Hid на шине i2c

UMFT260EV1A – отладочный модуль (Рис. 1 – Рис. 3) для микросхемы FT260 (Рис. 4) моста USB-UART/I2C HID-класса.

Используя стандартный драйвер класса, который имеется в большинстве операционных систем, FT260 обеспечивает взаимодействие между USB и UART либо I2C периферией. Микросхема совместима с протоколом HID over I2C, предложенным Microsoft, начиная с Windows 8. FT260 представляет собой полноскоростное USB устройство.

Интерфейс I2C мастер поддерживает стандартный режим (SM), быстрый режим (FM), быстрый режим плюс (FM+) и высокоскоростной (HS) режим. UART работает с  номинальными скоростями передачи от 1200 Бод до 12МБод. Уровни логических сигналов (IO), с которыми работает микросхема, находятся в диапазоне от 1.8 В до 3.3 В.

Благодаря встроенному генератору ФАПЧ, для работы FT260 внешний кварц не требуется. Конфигурируемыми линиями GPIO можно управлять из программы приложения через USB порт.

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

Отладочный модуль отлично подходит для применения в разработках и позволяет быстро добавить в проект USB функциональность. Конструктивно модуль изготовлен в форм-факторе DIP-24 и позволяет установить его в стандартный 24-контактный DIP сокет шириной 0.8 дюйма. Для подключения к хосту на плате установлен micro USB разъем. Все используемые на плате компоненты соответствуют RoHS (Pbfree).

Стандартный HID драйвер поддерживает микросхему FT260 и доступен в следующих ОС:       

  • Windows 10 32, 64-bit
  • Windows 8.1 32, 64-bit
  • Windows 8 32, 64-bit
  • Windows 7 32, 64-bit
  • Windows Vista and Vista 64-bit
  • Windows XP and XP 64-bit
  • Windows CE 4.2, 5.0, 5.2, 6.0
  • Windows Server 2008, 2003, 2000
  • Windows Embedded Operating Systems
  • Mac OS X
  • Linux
  • Android
Рис. 1. Отладочный модуль UMFT260EV1AРис. 2. Назначение выводов модуля UMFT260EV1A
Рис. 3. Схема принципиальная электрическая  модуля UMFT260EV1AРис. 4. Структурная схема чипа FT260

Отличительные особенности:

  • Микросхема FT260 моста USB-UART/I2C HID-класса
    • USB0 FS совместимый чип с обработкой микросхемой всего протокола USB
    • Поддержка двух USB HID интерфейсов, каждый из которых соответствует физическим интерфейсам на кристалле, I2C и UART
    • Конфигурация выводов делает возможным использование HID интерфейса для различных приложений
    • Поддержка спецификации HID over I2C
    • Конфигурируемый контроллер интерфейса I2C мастер, соответствующий Спецификациям I2C v1 и v3.0
    • Поддержка четырех режимов скоростей, определенных в Спецификации шины I2C: стандартный режим (SM), быстрый режим (FM), быстрый режим плюс (FM+) и высокоскоростной (HS) режим
    • Надежный FTDI UART контроллер с поддержкой аппаратного и программного управления потоком
    • Скорость передачи данных от 1,2 КБод до 12 Мбод (RS422, RS485, RS232) на уровнях TTL
    • Конфигурируемые линии GPIO могут легко управляться программными приложениями класса HID через шину USB
    • Полностью интегрированный генератор ФАПЧ. Нет необходимости во внешнем кварцевом резонаторе
    • Встроенный eFUSE для записи идентификатора поставщика USB (VID), идентификатора продукта (PID) и других специфических параметров
    • Уникальный генератор серийного номера и программирование пути к внешней EEPROM
    • Встроенный преобразователь уровня 5V-3.3V-1.8V для USB I/O
    • +5 В детектор USB VBUS
    • Конфигурация USB питания; поддержка питания от шины и переключения питания между шиной и автономным источником
    • Низкий ток потребления: типичные значения – 24 мА в рабочем режиме и 385 мкА в режиме ожидания
    • CMOS выход 3.3 В и TTL вход (работает до 1.8 В с внешней подтяжкой)
    • Несколько уровней рабочего напряжения ввода-вывода + 3.3 В, + 2.5 В, + 1.8 В
    • Выходной ток от 4 мА (min)до 16 мА (max)
    • Интегрированная схема сброса при включении питания
    • Обнаружение зарядного USB устройства
    • Совместимость с хост-контроллером UHCI / OHCI / EHCI / XHCI
    • Расширенный диапазон рабочих температур -40?C … 85?C
    • Чипы доступны в компактных Pbfree корпусах: WQFN28 или TSSOP
  • Полностью собранный на PCB модуль в стандартном форм-факторе DIP24 для установки в DIP-розетку шириной 20,32 мм (0,8 “). Шаг выводов 2.54 мм (0.1 дюйма)
  • Встроенный разъем Micro USB-B позволяет подключать модули к хост-системе через стандартный USB A-Micro B кабель
  • Встроенная EEPROM I2C 2Кбит (адрес: 0x50 для хранения настройки конфигурации FT260 и специфических параметров поставщика (схема подтяжки I2C к высокому уровню реализована по умолчанию)
  • Джамперы для выбора конфигурации интерфейсов HID FT260
  • Джамперы под пайку для конфигурирования FT260Q для режимов питания от USB шины или автономного источника

Документацию для  изделия можно найти на сайте производителя.

Источник: https://www.terraelectronica.ru/news/5619

Простой USB HID контроллер 4-й версии под Windows или Android/Linux — DRIVE2

Hid на шине i2c

Простой USB HID контроллер 4-й версии предназначен в первую очередь для управления мультимедиа в авто.
Питается только от BAT, от 6 до 18В.Сигнал ACC при наличии на нем напряжения не ниже 10.5В аппаратно включает контроллер.

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

Поэтому контроллер от BAT в выключенном состоянии практически ничего не потребляет (около 350 микро-ампер).

Контроллер обладает следующими возможностями:
— имеет встроенный источник питания DC/DC 12/5В до 1А с возможностью полного программного отключения при отсутствии АСС;— имеет входы BAT для постоянного питания и ACC для управления включением-выключением;— имеет выход для питания внешних устройств 5В (5В на нем присутствует пока включен контроллер);— имеет управляемый выход для питания внешних устройств 5В (выдачей 5В можно управлять с помощью событий);

— имеет 4 канала для подключения резистивных кнопок руля или внешних кнопок, джойстиков… (до 15 кнопок на канал);

— имеет 2 канала аналоговых выходов для управления штатными магнитолами имитируя нажатие резистивных кнопок (выходное напряжение 0…5В);
— содержит 2 выхода типа открытый коллектор с током до 500mA для управления кнопкой включения планшета, тв-бокса, либо внешним реле или выдачи ИК кода…;
— имеет 6 цифровых входов/выходов общего применения с защитой (выходное напряжение 0…3.3В, последовательно резистор 330 Ом). Из них 2 шины — UART (для подключения UART GPS приемника…);— любая из 11 ножек контроллера может быть использована для генерации события по указанному уровню и необходимому таймауту;— поддерживает 4-х проводные резистивные тачпанели. Для перехвата тачпанели у штатной системы имеет внешнюю плату мультиплексора. Она выполнена на плате 25×20мм с кабелем 20 см и всеми необходимыми разъемами для подключения в разрыв без пайки;— поддерживает работу совместно с контроллером CAP2RES для замены родного резистивного тача на емкостный с сохранением штатной работы. При этом для штатной системы эмулируется резистивный тач, а для внешнего CARPC он обеспечивает мультитач управление;

— можно подключить 2 цифровых энкодера с программным предделителем;

— может эмулировать 2 цифровых энкодера;

— имеет 2 линии аналогового входа 0…18В с возможностью отслеживания любых изменений и выдачи любых реакций на них;

— имеет поддержку шины Toyota/LexusIEBUS (AVC-LAN) для эмуляции внешнего навигатора, внешнего DVD и CD чейнджера, управления штатным усилителем Toyota/Lexus без штатного головного устройства, чтения кнопок по шине, управления с родного тача головных устройств…;
— поддерживает шину BMW iBUS и работу приложения I-BUS APP;
— поддерживает автономное управление с джойстиков iDrive от BMW с тачпадом и без по CAN (работающих на скоростях 100KBit/s или 500KBit/s);— поддерживает подключение внешних UART GPS приемников или других устройств (контролер представляет собой виртуальный COM порт);

— поддерживает протоколы внешних навигаторов для головных устройств ALPINE, KENWOOD, PIONEER;

— поддерживает подключение и управление внешними навигационными блоками GARMIN, PHANTOM, KENWOOD и т.д.;
— любая из 11 ножек контроллера может быть настроена для приема ИК посылок по протоколам NEC, JVC, RC5, SONY, SAMSUNG, APPLE как с прямой, так и с инверсной кодировкой (см. на вкладке ИК вход);
— любая из 13 ножек контроллера может быть настроена для передачи ИК посылок по протоколам NEC, JVC, RC5, SONY, SAMSUNG, APPLE как с прямой, так и с инверсным выходом (для ALPINE например) только огибающая без несущей;
— поддерживает работу с блоком кнопок и джойстика HONDA ODYSSEY;
— поддерживает работу по CAN кнопок руля Opel Astra J по ее шине GMLAN;
— поддерживает работу по CAN кнопок руля Mercedes CLK 320 W209 W212;
— поддерживает работу по CAN кнопок руля VW MKV GTI;
— поддерживает работу по CAN кнопок руля Volvo;
— поддерживает работу по CAN кнопок руля VW GOLF7 и Citroen C5 X7 (с 2008г.);
— поддерживает работу по шине comfort CAN AUDI RNS-E;
— поддерживает работу по CAN кнопок руля BMW E81 и аналогичных;
— поддерживает работу по CAN кнопок руля Crysler 300C;
— поддерживает работу по CAN кнопок руля Skoda Superb 2013/ETI 2017;
— поддерживает работу по CAN кнопок руля Hyundai Genesis;
— в версии для CAN встроен CAN логгер;
— поддерживает шину GaNet Acura RDX/MDX + вывод данных климата через Serial Manager и использование джойстика;
— поддерживает кнопки по шине LIN для Opel Astra J, Opel Insignia, Citroen C5 X7 (с 2008г.);— поддерживает PS2 тачпад от Synaptics;— поддерживает управление через Serial Manager;

— поддерживает управление через блютуз модуль на BK3231 или JDY-33 с SPP-C профилем через Serial Manager;

— реализован ИК сниффер для добавления любого ИК пульта. Включается командой i2 в терминале;
— поддерживает автономную работу (включая энкодер сзади) под рулевого джойстика от Renault на 6 или 9 кнопок;
— поддерживает автономную работу кнопок руля AUDI А6С7, А7, А8 4Н (AUDI А4В8, А4В9, Q7) с 2012г. по шине LIN включая подогрев;
— поддерживает автономную работу кнопок руля VW Polo GT, GOLF VII по шине LIN;
— поддерживает работу джойстика Mazda CX5 по шине LIN;— для подключения имеет разъем микро-USB + возможность припайки внешнего кабеля USB (питается контроллер только от BAT);

— может быть внутрисхемным программатором SPI FLASH для скалера RTD2662;

— размер платы 50×65мм

Вариант с мультиплексором тачпанели:

Вариант без мультиплексора тачпанели:

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

ПО настройки:

Графическая оболочка для программирования под windows YAMDT_GUIV4.zip
ПО контроллера droid_touch4.zip
(Прошивки с _wo_keys в имени без поддержки USB клавиатуры, но с поддержкой мультимедиа кнопок и кнопок управления питанием.

Они для применения в андроиде где при подключении внешней USB клавиатуры пропадает виртуальная. Можно из маркета поставить например smart keyboard и пользоваться обычной версией. Прошивки с _wo_cdc для работы на андроиде без поддержки композитных устройств.

Все работает кроме виртуального ком-порта).
inf файл виртуального COM порта для windows DROID-TOUCH-V4-INF.zip
Чтобы не было курсора при нажатиях вообще, этот файл (после распаковки) положить в /system/usr/idc, и выставить права 644.

Описание YAM-DROID-TOUCH-V4_V0419.zip
Подключение YAM_DROID_TOUCHV4_CONN.zip

Настройка кнопок джойстика от Рено:

Работа джойстика от Renault Fluence на магнитоле Joying Intel Sofia 6.0.1:

Пример работы контроллера с джойстиком iDrive от BMW на андроид магнитоле JOYING:

iDrive на андроид свистке:

Подключение контактов джойстика iDrive от BMW:
1 — питание +12В2 — масса3 — к контакту X4/5

4 — к контакту X4/6

Подключение для проверки на столе:

Работа проверялась на таких джойстиках:

Просмотр событий от джойстика в терминале — набрать CV1.

Подключение руля AUDI А6С7, А7, А8 4Н (AUDI А4В8, А4В9, Q7) с 2012г. по шине LIN.


Подключение, руль:коричневый — GNDкрасный — +12Vсиреневый — шина LINПодключение, шина:X5/8 и X5/10 вместе — шина LIN, необходимо подключить резистор подтяжки 1К между шиной и +12VПодключение, обогреватель руля:X5/7 и +12V — обмотка реле включения нагревателяНормально разомкнутые контакты реле, один через предохранитель 10…15А к +12V, второй к элементу нагревателя.Так-же можно поставить P-MOSFET с током коммутации не менее 10А.Реализованные события (вкладка событие LIN):— энкодер громкости ENCODER VOL UP, ENCODER VOL DN— нажатие на энкодер громкости KEY MUTE— энкодер вверх-вниз ENCODER UP, ENCODER DN— нажатие на энкодер вверх-вниз KEY OK— кнопка влево KEY BACKWARD— кнопка вправо KEY FORWARD— кнопка меню KEY MENU— кнопка nav KEY NAV— кнопка голос KEY VOICE— кнопка обогрев руля KEY SW HEATвсе кнопки поддерживают как короткое, так и длинное нажатие.события:— обогрев выключен SW HEAT OFF— обогрев включен SW HEAT ONРеализованные реакции (вкладка реакция LIN):— выключить подсветку руля— включить подсветку руля— выключить подогрев руля— включить подогрев руля на 20°C— включить подогрев руля на 25°C— включить подогрев руля на 30°C— включить подогрев руля на 35°C— включить подогрев руля на 40°C

при установленной галке триггер реакции имеют переключающий эффект, т.е. если что-то было выключено оно включается и наоборот.

Как пример, для управления подогревом руля можно создать:событие LIN, выбрать KEY SW HEAT, длинное нажатие(для защиты от возможных коротких нажатий), реакция LIN включить подогрев руля на 30°C + триггер.

и для индикации включенного состояния нагрева светодиодом на ножке X6/6 (анод к X6/6, катод на массе):На нижней вкладке Выводы для этой ножки выбрать Акт выход 0В,добавить событие LIN SW HEAT ON, реакцию Вывод X6/6 Полное управление Однократно включить

добавить событие LIN SW HEAT OFF, реакцию Вывод X6/6 Полное управление Однократно выключить

Как пример для включения подсветки руля при включении габаритов:подключить +12В от габаритов к скажем X5/9 это VIN1добавить событие Напряжение VIN1 > 6000mV, реакция LIN подсветку включить

добавить событие Напряжение VIN1 < 6000mV, реакция LIN подсветку выключить

Подключение руля VW Polo GT с 2013г. по шине LIN.

Подключение руля VW GOLF VII по шине LIN (5G0 419 091).

Подключение разъема на руле:1 GND2 +12V3 LIN4 кнопка HORN5 кнопка HORN

Между +12V и LIN подключить резистор 1К

Ножки X5/8 и X5/10 вместе — шина LINРеализованы события для всех кнопок (вкладка событие LIN) включая кнопку подачи звукового сигнала.все кнопки поддерживают как короткое, так и длинное нажатие.
Так-же можно включать или выключать подсветку кнопок. По аналогии с подсветкой для руля от AUDI.

Программатор SPI FLASH для скалера RTD2662 из контроллера:
Версия ПО для контроллера версии 4 и ПО оболочки программатора YAM_RTDPROG_V4.zipТипы SPI FLASH памяти прописываются в файле jedec.ini по аналогии с моими записями.Подключение:X6/4 — GNDX6/5 — SDAX6/6 — SCLИли в VGA разъем или в разъем за ним. Как раз слева направо в нем SCL-SDA-GND.

После программирования можно запустить контроллер в работу кнопкой “Сброс RTD2662” без передергивания питания.Чтение памяти W25X040 ~80 сек, запись ~40 сек (зависит от содержимого, т.к. блоки с xFF пропускаются).Биты защиты в регистре статуса после записи восстанавливаются в состояние до программирования.

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

Источник: https://www.drive2.ru/b/487379970562196134/

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

Hid на шине i2c

Один из моих самых любимых интерфейсов. Разработан в компании Philips и право на его использование стоит денег, но все на это дружно положили и пользуют в свое удовольствие, называя только по другому.

В Atmel его зовут TWI, но от этого ничего не меняется 🙂 Обычно при разборе IIC во всех книгах ограничиваются примером с EEPROM на этом и ограничиваются. Да еще юзают софтверный Master.

Не дождетесь, у меня будет подробный разбор работы этой шины как в режиме Master так и Slave, да еще на аппаратных блоках с полным выполнением всей структуры конечного автомата протокола. Но об этом после, а сейчас основы.

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

Схема подключения — монтажное И

Передача/Прием сигналов осуществляется прижиманием линии в 0, в единичку устанавливается сама, за счет подтягивающих резисторов. Их ставить обязательно всегда! Стандарт! Резисторы на 10к оптимальны.

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

Обычно IIC работает либо на скорости 10кбит/с — в медленном режиме, либо на 100кбит/с в быстром. Но в реальности можно плавно менять скорость вплоть до нуля.
Ни в коем случае нельзя переключать вывод микроконтроллера в OUT и дергать ногу на +5.

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

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

После старта передача одного бита данных идет по тактовому импульсу.

То есть когда линия SCL в нуле master или slave выставляют бит на SDA (прижимают — если 0 или не прижимают — если 1 линию SDA) после чего SCL отпускается и master/slave считывают бит.

Таким образом, у нас протокол совершенно не зависит от временных интервалов, только от тактовых битов. Поэтому шину I2C очень легко отлаживать — если что то не так, то достаточно снизить скорость до байта в минуту и спокойно, обычными вольтметрами, смотреть что у нас происходит.

Правда это не прокатит с железным I2C, там нет таких низких скоростей. Но что нам мешает затактовать микроконтроллер от ОЧЕНЬ медленного тактового генератора и отладить все по шагам? 😉

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

  • Начало передачи определяется Start последовательностью — провал SDA при высоком уровне SCL
  • При передаче информации от Master к Slave, ведущий генерирует такты на SCL и выдает биты на SDA.

    Которые ведомый считывает когда SCL становится 1.

  • При передачи информации от Slave к Master, ведущий генерирует такты на SCL и смотрит что там ведомый творит с линией SDA — считывает данные.

    А ведомый, когда SCL уходит в 0, выставляет на SDA бит, который мастер считывает когда поднимет SCL обратно.

  • Заканчивается все STOP последовательностью. Когда при высоком уровне на SCL линия SDA переходит с низкого на высокий уровень.

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

Но чаще идет обращение к тому же самому устройству и это связано с особенностями организации памяти.

Организация памяти.
Это относится уже не столько к самому протоколу I2C, сколько к заморочкам создателей разных EEPROM и прочих I2C устройств.

Но встречается это повсеместно, поэтому я расскажу про этот момент. Но, повторюсь, это не аксиома, не стандарт и вообще зависит от конкретного Slave устройства.

Так что датит в зубы и вкуривать, но обычно так принято.

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

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

Это не стандарт, но юзается повсеместно.

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

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

И вот надо мне установить дату. Для этого надо мне записать две ячейки памяти с адресами 0х05 и 0x06.

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

Я эту ногу сразу посадил на 0 так что Slave-адрес у меня 10100000. Очевидно, что на одной шине может быть не более двух экземпляров этой микросхемы с адресами 10100000 и 10100001.

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

То есть, мы, вначале, записываем один байт — адрес. Потом делаем повторный старт, затем снова обращаемся к часам по ее Slave-адресу, но уже с битом R, на чтение.

И умная микруха выдает нам байты с адреса который мы в нее вот только что записали. Выглядит это так:
В этих часах так, у других микрух может быть все по другому, но в 99% очень похоже.

Адрес, например, может быть двухбайтным или страницу надо будет указать, но сути это не меняет. Цепочка запись-повстарт-чтение это повсеместно.
Вот так, кстати, выглядит чтение данных из часов PCF8583 на экране моего логического анализатора.

Тут не полная посылка (все 5 байт просто не влезли в экран), но тут четко видно запись начального адреса, потом повторный старт, и чтение из девайса.

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

Арбитраж шины I2C.
Почему то все мануалы для начинающих в которых рассматривалась тема протокола IIC как то ссыкливо замалчивают возможность работы двух ведущих на линии. Master-Slave и все тут.

А если у нас демократия? И каждый сам себе Master и сам себе Slave? Согласен, редкий случай, но тем не менее, описывать так описывать. Короче, в случае подобного садо-мазо варианта действует железное правило — кто раньше встал того и тапки. В смысле кто первый начал вещать тот и текущий Master.

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

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

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

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

UPD:
Полный перевод оригинальной спецификации IIC от суровых Челябинских электронщиков с радиозавода Полет

Источник: http://easyelectronics.ru/interface-bus-iic-i2c.html

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.