КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Кнопка, i2c (Metro-модуль) - Datasheet

Исходники изображение:

Модуль Metro - Кнопка.

Техническое описание: Данная страница содержит подробное техническое описание модуля и раскрывает работу с модулем через его регистры.

Ознакомиться с пользовательским описанием модуля и примерами работы с библиотекой iarduino_Metro можно на странице Wiki-Кнопка, i2c (Metro-модуль).

Назначение:

Модуль Metro - Кнопка - является устройством ввода данных с подключением по шине I2С.

К одной шине I2C можно подключить более 100 модулей.

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

Описание:

Модуль построен на базе микроконтроллера STM32F030F4 и снабжен собственным стабилизатором напряжения. Модуль считывает состояние тактовой кнопки сохраняя данные в своих регистрах. Доступ к регистрам модуля осуществляется по шине I2C.

С помощью регистров модуля можно:

  • Изменить адрес данного модуля, обнаружить наличие следующего модуля и изменить адрес следующего модуля.
  • Определить: событие кнопки - нажимается, событие кнопки - отпускается, состояние кнопки - нажата, факт смены состояния кнопки и удержания кнопки дольше указанного времени, прочитать бит-триггер который меняет свое состояние с каждым новым нажатием на кнопку.
  • Записать время для срабатывания флагов реагирующих на удержание кнопки.
  • Узнать время прошедшее с момента установки текущего состояния кнопки нажата/отпущена.
  • Узнать количество совершенных нажатий на кнопку, которые не были прочитаны по шине I2C.

Выводы модуля:

У модуля имеются две колодки выводов: IN - штыревой разъем (вход модуля) и OUT гнездовой разъем (выход для подключения входа следующего модуля Metro). На каждой колодке имеется по пять выводов:

  • SCL - вход/выход линии тактирования шины I2C.
  • SDA - вход/выход линии данных шины I2C.
  • 5V - вход питания.
  • GND - общий вывод питания.
  • ADR (на колодке IN) - вход установки адреса данного модуля.
  • ADR (на колодке OUT) - вывод (вход/выход) обнаружения следующего модуля и установки его адреса.

Выводы SCL, SDA, 5V и GND внутрисхемно соединены с одноимёнными выводами колодок IN и OUT, и предназначены для передачи данных по шине I2C. Выводы SCL и SDA внутрисхемно НЕ подтянуты в модуле до уровня логической 1.

Вход ADR на колодке IN используется для сброса/записи адреса модуля на шине I2C. Данный вход внутрисхемно прижат к GND через резистор номиналом в 1 кОм. Если на вход ADR подать уровень логической 1, то адрес модуля сбросится в значение по умолчанию 0x09, но этот адрес не сохранится во FLASH памяти модуля, а значит после отключения питания, установится прежний адрес. Если при наличии логической 1 на входе ADR, записать адрес в регистр «ADDRESS» с установленным битом «IF_PIN_ADDRESS» то данный адрес станет новым адресом модуля на шине I2C и сохранится во FLASH памяти модуля, а значит сохранится и после отключения питания.

Вывод ADR на колодке OUT является двунаправленным выводом и используется для обнаружения наличия следующего модуля Metro, а также сброса/записи адреса следующего модуля. Данный вывод внутрисхемно подтянут до уровня 3,3 В через резистор в 100 кОм, что позволяет определить наличие следующего модуля Metro. Если вывод сконфигурирован как вход и на нём уровень логической 1 (3,3 В) - значит следующих модулей нет, а если на нём уровень логического 0 (GND) - значит следующий модуль есть. Если вывод сконфигурирован как выход, то установив на нём уровень логической 1 можно сбросить/записать адрес следующего модуля.

Конфигурация, чтение и установка уровней выводов ADR осуществляется через регистры модуля.

Характеристики:

  • Напряжение питания: 5 В (постоянного тока)
  • Потребляемый ток: до 15 мА.
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
  • Уровень логической 1 на выводах ADR: 3,3 В (толерантны к 5 В).
  • Рабочая температура: от -20 до +70 °С.
  • Габариты: 35,56 х 25,40 мм (1400 x 1000 mil).
  • Вес: 5 г.

Установка адреса:

Сброс адреса (без сохранения):

Если физически подать уровень логической 1 на вход модуля ADR, то адрес модуля сбросится в значение по умолчанию 0x09, но этот адрес не сохранится во FLASH памяти, а значит после отключения питания, установится прежний адрес модуля.

Установка адреса (без сохранения):

Если в регистр 0x06 «ADDRESS» записать значение из 7 бит адреса и младшим битом «IF_PIN_ADDRESS» равным 0, то указанный адрес станет адресом модуля на шине I2C, но он не сохранится во FLASH памяти, а значит после отключения питания, установится прежний адрес модуля.

Установка адреса (с сохранением):

Для установки адреса с его сохранением в FLASH память модуля необходимо выполнить два действия:

  • Установить уровень логической 1 на входе ADR колодки IN (при этом адрес модуля сбросится в значение по умолчанию 0x09), или установить в 1 бит «SET_PIN_ADDRES» в регистре 0x01 «BITS_0» (при этом адрес модуля останется прежним).
  • Записать в регистр 0x06 «ADDRESS» значение из 7 бит адреса и младшим битом «IF_PIN_ADDRESS» равным 1. ВАЖНО: запись адреса занимает не менее 30 мс.

Если в регистр 0x06 «ADDRESS» записать значение из 7 бит адреса и младшим битом «IF_PIN_ADDRESS» равным 1, при сброшенном бите «SET_PIN_ADDRES» и наличии уровня логического 0 на входе ADR, то указанный адрес проигнорируется и у модуля останется прежний адрес.

Обнаружение следующего модуля:

Модули Metro подключаются друг к другу (вход к выходу) как вагоны метро.

Вход ADR колодки IN внутрисхемно прижат к GND через резистор 1 кОм, значит если данный вход ни к чему не подключён, то на нем присутствует уровень логического 0.

Вывод ADR колодки OUT внутрисхемно подтянут к 3,3 В через резистор 100 кОм, значит если данный вывод сконфигурирован как вход и ни к чему не подключен, то на нем присутствует уровень логической 1.

Следовательно, если вывод ADR колодки OUT сконфигурирован как вход и на нём присутствует уровень логической 1, значит колодка OUT свободна, а если присутствует уровень логического 0, значит к колодке OUT подключена колодка IN следующего модуля.

За конфигурацию вывода ADR колодки OUT отвечает бит «SET_PIN_OUTPUT» регистра 0x01 «BITS_0», а считать логический уровень с этого входа можно через флаг «GET_PIN_OUTPUT» регистра 0x00 «FLAGS_0».

Значит для обнаружения модуля нужно сбросить бит «SET_PIN_OUTPUT» в регистре 0x01 «BITS_0» и считать бит «GET_PIN_OUTPUT» из регистра 0x00 «FLAGS_0». Если считана 1 значит колодка OUT свободна (следующих модулей нет), а если считан 0, значит к колодке OUT подключен следующий модуль.

Регистры:

Карта регистров модуля:

адрес76543210
0x00 FLG_RESET FLG_SELF_TEST - FLG_GET_NAME RAND_ADR FLG_I2C_UP GET_PIN_ADDRES GET_PIN_OUTPUT
0x01 SET_RESET SET_SELF_TEST - SET_GET_NAME RESERVED SET_I2C_UP SET_PIN_ADDRES SET_PIN_OUTPUT
0x02
0x03
RESERVED
0x04 MODEL[7-0]
0x05 VERSION[7-0]
0x06 ADDRESS[6-0] IF_PIN_ADDRES
0x07 CHIP_ID[7-0]
0x08
---
0x0F
RESERVED
0x10 PUSHED RELEASED PRESSED TRIGGER HOLD_3 HOLD_2 HOLD_1 CHANGED
0x11 TIME[7-0]
0x12
0x13
0x14
TIME_HOLD_1[7-0]
TIME_HOLD_2[7-0]
TIME_HOLD_3[7-0]
0x15 SUM[7-0]

Регистры с адресами 0x02, 0x03, 0x08 - 0x0F зарезервированы, их биты сброшены в 0. Попытка записи данных в эти регистры будет проигнорирована модулем.

Регистр 0x00 «FLAGS_0» - содержит флаги чтения состояния модуля:

Регистр только для чтения.

  • FLG_RESET - Флаг указывает на факт выполнения успешной перезагрузки модуля. Флаг самостоятельно сбрасывается после чтения регистра 0x00 «FLAGS_0».
  • FLG_SELF_TEST - Флаг указывает на результат выполнения самотестирования модуля (0-провал, 1-успех). Не поддерживается данным модулем.
  • FLG_GET_NAME - Если флаг установлен, значит модуль поддерживает вывод своего названия установкой бита «SET_GET_NAME» в регистре 0x01 «BITS_0».
  • RAND_ADR - Если флаг установлен, значит модуль поддерживает генерацию случайного адреса для шины I2C регистрами 0x64 «RANDOM_NUM», «RANDOM_ADR», «BUN_ADR».
  • FLG_I2C_UP - Если флаг установлен, значит модуль позволяет управлять подтяжкой линий шины I2C при помощи бита «SET_I2C_UP» регистра 0x01 «BITS_0».
  • GET_PIN_ADDRES - Бит повторяет логический уровень считанный со входа ADR колодки IN модуля.
  • GET_PIN_OUTPUT - Бит повторяет логический уровень считанный с вывода ADR колодки OUT модуля.

Регистр 0x01 «BITS_0» - содержит биты установки состояния модуля:

Регистр для записи и чтения.

  • SET_RESET - Бит запускает программную перезагрузку модуля. О завершении перезагрузки свидетельствует установка флага «FLG_RESET» регистра 0x00 «FLAGS_0».
  • SET_SELF_TEST - Бит запускает самотестирование модуля. При успешном завершении самотестирования устанавливается флаг «FLG_SELF_TEST » регистра 0x00 «FLAGS_0». Не поддерживается данным модулем.
  • SET_GET_NAME - Бит указывает использовать регистр 0x04 «MODEL» для посимвольного вывода названия модуля. Бит сбрасывается автоматически через 300 мс после его установки. Если флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» сброшен, значит модуль не поддерживает посимвольный вывод своего названия.
  • RESERVED - Третий бит регистра «BITS_0» который не используется у модулей Metro, но у Trema-модулей (аналог Metro) этот бит носит название «BLOCK_ADR», он блокирует смену и сохранение адреса для шины I2C. Бит устанавливается автоматически при попытке записи данных в регистры предназначенные только для чтения. Это защищает чип от ненамеренной смены адреса шумами на шине I2C.
  • SET_I2C_UP - Бит управляет внутрисхемной подтяжкой линий шины I2C. Установка бита в «1» приведёт к подтяжке линий SDA и SCL до уровня 3,3 В. На линии I2C допускается устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния текущего бита. Если флаг «FLG_I2C_UP» регистра 0x00 «FLAGS_0» сброшен, значит управление подтяжкой не поддерживается модулем.
  • SET_PIN_ADDRES - Бит является альтернативой входа ADR колодки IN. Установка бита в 1 расценивается как наличие логической 1 на входе ADR колодки IN, но не устанавливает этот уровень физически на входе, что позволяет установить и сохранить адрес модуля во FLASH память не используя вход ADR. Бит самостоятельно сбрасывается после сохранения адреса во FLASH память. Установка бита в 1 не сбрасывает адрес модуля в значение по умолчанию (0x09), как это делает физическая «1» на входе ADR колодки IN.
  • SET_PIN_OUTPUT - Бит конфигурации вывода ADR колодки OUT. Установка бита в 1 сконфигурирует вывод ADR колодки OUT модуля в режим выхода и установит на нём уровень логической 1. Сброс бита в 0 сконфигурирует вывод ADR колодки OUT в режим входа, логический уровень которого можно считать через бит «GET_PIN_OUTPUT» регистра 0x00 «FLAGS_0».

Регистр 0x04 «MODEL» - содержит идентификатор типа модуля:

Регистр только для чтения.

  • MODEL[7-0] - Для модуля Metro - Кнопка - идентификатор равен значению 0x01.
  • Если установлен флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» значит модуль поддерживает посимвольный вывод своего названия.
  • Установка бита «SET_GET_NAME» регистра 0x01 «BITS_0» включает режим посимвольного вывода названия модуля. При этом в регистре 0x04 «MODEL» появится первый символ названия модуля. В процессе чтения регистра 0x04 «MODEL» он будет возвращать очередной символ названия, вплоть до символа конца строки имеющего код 0x00. Далее цикл повторится.
  • Сброс бита «SET_GET_NAME» регистра 0x01 «BITS_0» отключает режим посимвольного вывода названия модуля. Регистр 0x04 «MODEL» вновь будет содержать идентификатор.

Регистр 0x05 «VERSION» - содержит версию прошивки модуля:

Регистр только для чтения.

  • VERSION[7-0] - Версия прошивки (от 0x01 до 0xFF).

Регистр 0x06 «ADDRESS» - отвечает за чтение/установку адреса модуля на шине I2C:

Регистр для чтения и записи.

  • ADDRESS[6-0] - 7 бит адреса модуля на шине I2C. При чтении возвращается текущий адрес модуля, при записи устанавливается указанный адрес модулю.
  • IF_PIN_ADDRES - Флаг проверки состояния входа ADR колодки IN для записи адреса в FLASH память модуля.
    Флаг имеет значение только при записи данных в регистр.
    Если флаг сброшен, то адрес в битах ADDRESS[6-0] будет установлен временно (до отключения питания, или сброса/записи нового адреса). Если флаг «IF_PIN_ADDRES» установлен, то адрес в битах ADDRESS[6-0] будет сохранён в FLASH память модуля (останется и после отключения питания), но только если на входе ADR колодки IN, или в бите «SET_PIN_ADDRES» регистра 0x01 «BITS_0» установлена логическая 1. Если флаг «IF_PIN_ADDRES» установлен, бит «SET_PIN_ADDRES» сброшен и на входе ADR колодки IN установлен уровень логического 0, то адрес в битах ADDRESS[6-0] не будет установлен ни временно, ни постоянно.

Регистр 0x07 «CHIP_ID» - содержит идентификатор общий для всей линейки Metro:

Регистр только для чтения.

У всех модулей линейки метро в регистре «CHIP_ID» содержится значение 0xC3. Если требуется отличить модули Metro на шине I2C от сторонних модулей, то достаточно прочитать значение регистров 0x06 «ADDRESS» и 0x07 «CHIP_ID» всех модулей на шине I2C. Если 7 старших битов регистра 0x06 «ADDRESS» хранят адрес совпадающий с адресом модуля, а в регистре 0x07 «CHIP_ID» хранится значение 0xC3, то можно с большой долей вероятности утверждать, что данный модуль является модулем Metro.

Регистр 0x10 «REG_DATA» - содержит флаги состояний и событий кнопки:

Регистр только для чтения.

  • PUSHED - Флаг нажатия на кнопку. Устанавливается в момент нажатия на кнопку и остаётся установленным пока не будет прочитан. Флаг сбрасывается самостоятельно после чтении данного регистра.
  • RELEASED - Флаг отпускания кнопки. Устанавливается в момент отпускания кнопки и остаётся установленным пока не будет прочитан. Флаг сбрасывается самостоятельно после чтении данного регистра.
  • PRESSED - Флаг состояния кнопки. Установлен пока кнопка нажата и сброшен если она отпущена.
  • TRIGGER - Флаг триггер. Меняет своё состояние с каждым новым нажатием на кнопку (нажали - установился, нажали - сбросился, нажали - установился, ...).
  • HOLD-3 - Флаг удержания кнопки. Устанавливается если кнопка удерживается дольше времени указанного в регистре 0x14 «TIME_HOLD_3» и сбрасывается при отпускании кнопки.
  • HOLD-2 - Флаг удержания кнопки. Устанавливается если кнопка удерживается дольше времени указанного в регистре 0x13 «TIME_HOLD_2» и сбрасывается при отпускании кнопки.
  • HOLD-1 - Флаг удержания кнопки. Устанавливается если кнопка удерживается дольше времени указанного в регистре 0x12 «TIME_HOLD_1» и сбрасывается при отпускании кнопки.
  • CHANGED - Флаг смены состояния кнопки. Устанавливается в момент нажатия или отпускания кнопки и остаётся установленным пока не будет прочитан. Флаг сбрасывается самостоятельно после чтении данного регистра. ( CHANGED = PUSHED | RELEASED ).

Регистр 0x11 «TIME» - содержит время удержания/простоя кнопки:

Регистр только для чтения.

  • TIME[7-0] - Время удержания или простоя кнопки в десятых долях секунд от 0 (0 сек.) до 255 (25,5 сек.). Если флаг «PRESSED» регистра 0x10 «REG_DATA» установлен, значит значение TIME[7-0] хранит время удержания, иначе, время простоя. Если кнопка удерживается/простаивает дольше 25,5 секунд, то значение TIME[7-0] останавливается на 255.

Регистр 0x12 «TIME_HOLD_1» - содержит время для установки флага HOLD-1:

Регистр для чтения и записи.

  • TIME_HOLD_1[7-0] - Время удержания кнопки в десятых долях секунд от 0 (0 сек.) до 255 (25,5 сек.) по истечении которого устанавливается флаг «HOLD-1» в регистре 0x10 «REG_DATA». Флаг «HOLD-1» сбрасывается самостоятельно при отпускании кнопки.

Регистр 0x13 «TIME_HOLD_2» - содержит время для установки флага HOLD-2:

Регистр для чтения и записи.

  • TIME_HOLD_2[7-0] - Время удержания кнопки в десятых долях секунд от 0 (0 сек.) до 255 (25,5 сек.) по истечении которого устанавливается флаг «HOLD-2» в регистре 0x10 «REG_DATA». Флаг «HOLD-2» сбрасывается самостоятельно при отпускании кнопки.

Регистр 0x14 «TIME_HOLD_3» - содержит время для установки флага HOLD-3:

Регистр для чтения и записи.

  • TIME_HOLD_3[7-0] - Время удержания кнопки в десятых долях секунд от 0 (0 сек.) до 255 (25,5 сек.) по истечении которого устанавливается флаг «HOLD-3» в регистре 0x10 «REG_DATA». Флаг «HOLD-3» сбрасывается самостоятельно при отпускании кнопки.

Регистр 0x15 «SUM» - счётчик количества нажатий на кнопку:

Регистр только для чтения.

  • SUM[7-0] - Содержит количество нажатий на кнопку выполненных после последнего чтения данного регистра. Значение сбрасывается самостоятельно после чтения регистра. Если после последнего чтения данного регистра выполнено более 255 нажатий, то в SUM[7-0] будет храниться значение 255.

Регистры 100+:

У младших версий модулей линейки «FLASH-I2C» нет блока регистров «100+», так же этого блока нет у модулей линейки «Metro», о его наличии свидетельствует установленный флаг «RAND_ADR» в регистре 0x00 «FLAGS_0».

Блок регистров «100+» с адресами от 0x64 (100)10 до 0x75 (117)10 не участвует в работе модуля, он предназначен только для обнаружения модулей с одинаковыми адресами и назначения этим модулям разных адресов, не отключая их от шины I2C.

Карта регистров 100+:

адрес76543210
0x64
0x66
RANDOM_NUM[7-0]
RANDOM_NUM[15-8]
0x66 RANDOM_ADR[7-0]
0x67 BUN_ADR_0F BUN_ADR_0E BUN_ADR_0D BUN_ADR_0C BUN_ADR_0B BUN_ADR_0A BUN_ADR_09 BUN_ADR_08
0x68 BUN_ADR_17 BUN_ADR_16 BUN_ADR_15 BUN_ADR_14 BUN_ADR_13 BUN_ADR_12 BUN_ADR_11 BUN_ADR_10
0x69 BUN_ADR_1F BUN_ADR_1E BUN_ADR_1D BUN_ADR_1C BUN_ADR_1B BUN_ADR_1A BUN_ADR_19 BUN_ADR_18
0x6A BUN_ADR_27 BUN_ADR_26 BUN_ADR_25 BUN_ADR_24 BUN_ADR_23 BUN_ADR_22 BUN_ADR_21 BUN_ADR_20
0x6B BUN_ADR_2F BUN_ADR_2E BUN_ADR_2D BUN_ADR_2C BUN_ADR_2B BUN_ADR_2A BUN_ADR_29 BUN_ADR_28
0x6C BUN_ADR_37 BUN_ADR_36 BUN_ADR_35 BUN_ADR_34 BUN_ADR_33 BUN_ADR_32 BUN_ADR_31 BUN_ADR_30
0x6D BUN_ADR_3F BUN_ADR_3E BUN_ADR_3D BUN_ADR_3C BUN_ADR_3B BUN_ADR_3A BUN_ADR_39 BUN_ADR_38
0x6E BUN_ADR_47 BUN_ADR_46 BUN_ADR_45 BUN_ADR_44 BUN_ADR_43 BUN_ADR_42 BUN_ADR_41 BUN_ADR_40
0x6F BUN_ADR_4F BUN_ADR_4E BUN_ADR_4D BUN_ADR_4C BUN_ADR_4B BUN_ADR_4A BUN_ADR_49 BUN_ADR_48
0x70 BUN_ADR_57 BUN_ADR_56 BUN_ADR_55 BUN_ADR_54 BUN_ADR_53 BUN_ADR_52 BUN_ADR_51 BUN_ADR_50
0x71 BUN_ADR_5F BUN_ADR_5E BUN_ADR_5D BUN_ADR_5C BUN_ADR_5B BUN_ADR_5A BUN_ADR_59 BUN_ADR_58
0x72 BUN_ADR_67 BUN_ADR_66 BUN_ADR_65 BUN_ADR_64 BUN_ADR_63 BUN_ADR_62 BUN_ADR_61 BUN_ADR_60
0x73 BUN_ADR_6F BUN_ADR_6E BUN_ADR_6D BUN_ADR_6C BUN_ADR_6B BUN_ADR_6A BUN_ADR_69 BUN_ADR_68
0x74 BUN_ADR_77 BUN_ADR_76 BUN_ADR_75 BUN_ADR_74 BUN_ADR_73 BUN_ADR_72 BUN_ADR_71 BUN_ADR_70
0x75 BUN_ADR_7F BUN_ADR_7E BUN_ADR_7D BUN_ADR_7C BUN_ADR_7B BUN_ADR_7A BUN_ADR_79 BUN_ADR_78

Регистры 0x64-0x65 «RANDOM_NUM» - содержат случайное число:

Регистры только для чтения.

  • RANDOM_NUM[15-0] - Содержит двухбайтное случайное число позволяющее определить наличие нескольких устройств с одинаковым адресом.
  • Значение из регистров читается одним пакетом (младший и старший байт). После чтения старшего байта, модуль на 5мс перейдёт в режим «молчания». В этом режиме модуль будет отправлять NACK мастеру после получения номера регистра в любых запросах.
  • Если прочитать регистры 0x64-0x65 «RANDOM_NUM» дважды, с промежутком между чтениями менее 5мс, то первый раз мы получим два байта случайного числа, а второй раз модуль откажет в чтении, так как отправит NACK. Но это только в том случае, если адрес модуля уникален.
  • Если адрес принадлежит нескольким устройствам, то и отвечать на запрос чтения будут несколько устройств. При первом чтении регистров 0x64-0x65 «RANDOM_NUM», биты случайного числа у разных модулей не совпадут, в результате чего один модуль передаст оба байта случайного числа и перейдёт в режим «молчания», а другой модуль (или модули) зафиксирует потерю арбитража и не передаст старший байт, следовательно, и не перейдёт в режим «молчания». Значит при повторном чтении регистров, мы опять получим два байта случайного числа от того модуля который не перешёл в режим «молчания», что будет свидетельствовать о наличии нескольких устройств на одном адресе.

Регистр 0x66 «RANDOM_ADR» - случайный адрес:

Регистр для чтения и записи.

  • RANDOM_ADR[7-0] - Позволяет задавать модулю случайный временный адрес, подтверждать временный адрес и получать информацию о состоянии временного адреса.
  • Запись 0x0F - Назначить модулю случайный временный адрес на 50 мс.
    В регистре 0x06 «ADDRESS» останется значение постоянного адреса.
  • Запись 0xF0 - Подтвердить назначенный временный адрес до отключения питания.
    В регистре 0x06 «ADDRESS» появится назначенный временный адрес.
  • Чтение 0x55 - Назначен временный случайный адрес на 50 мс.
  • Чтение 0xFF - Назначенный временный адрес подтверждён до отключения питания.
  • Чтение 0x00 - Временный адрес не назначался или отменён по истечении 50 мс.
  • Если на шине несколько устройств имеют одинаковый адрес, то запись значения 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. За указанное время следует найти все новые временные адреса устройств и подтвердить их отправив в регистр 0x66 «RANDOM_ADR» значение 0xF0.
  • Примечание: Случайный адрес модуль выбирает сам из диапазона от 0x08 до 0x7E включительно, кроме адресов запрещённых регистрами 0x67-0x75 «BUN_ADR».

Регистры 0x67-0x75 «BUN_ADR» - запрещают назначать адреса:

Регистры для чтения и записи.

  • BUN_ADR_08 - Бит запрещает назначать адрес 0x08 регистром 0x66 «RANDOM_ADR».
  • BUN_ADR_09 - Бит запрещает назначать адрес 0x09 регистром 0x66 «RANDOM_ADR».
  • ...
  • BUN_ADR_7D - Бит запрещает назначать адрес 0x7D регистром 0x66 «RANDOM_ADR».
  • BUN_ADR_7E - Бит запрещает назначать адрес 0x7E регистром 0x66 «RANDOM_ADR».
  • Если бит регистров 0x67-0x75 «BUN_ADR» установлен, то модуль не назначит себе случайный временный адрес соответствующий установленному биту.
  • Если на шине есть несколько устройств с одинаковым адресом, то отправка команды 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. Но вновь назначенный адрес может совпасть с адресом другого модуля на шине I2C, особенно если их много. По этому перед назначением случайного временного адреса рекомендуется записать в регистры 0x67-0x75 «BUN_ADR» все найденные на шине I2C уникальные адреса.

Доступ к данным регистров:

Каждый регистр модуля хранит 1 байт данных. Так как модуль использует интерфейс передачи данных I2C, то и доступ к данным охарактеризован им.

Обмен данными по шине I2C происходит по одному биту за один такт, после каждых переданных 8 бит (1 байта) принимающее устройство отвечает передающему одним битом: «ACK» в случае успешного приёма, или «NACK» в случае ошибки. Пакет приёма/передачи данных начинается сигналом «START» и завершается сигналом «STOP». Первый байт пакета всегда состоит из 7 бит адреса устройства и одного (младшего) бита R/W.

Сигналы интерфейса передачи данных I2C:

    Для удобства восприятия сигналов они выполнены в следующих цветах:
  • Зелёный - сигналы формируемые мастером.
  • Красный - данные отправляемые мастером.
  • Синий - данные отправляемые модулем Metro.
  • Фиолетовый - данные отправляемые мастером или модулем Metro.
  • «START» - отправляется мастером в начале пакета приема/передачи данных. Сигнал представляет переход уровня линии «SDA» из «1» в «0» при наличии «1» на линии «SCL».
  • «STOP» - отправляется мастером в конце пакета приёма/передачи данных. Сигнал представляет переход уровня линии «SDA» из «0» в «1» при наличии «1» на линии «SCL».
  • БИТ - значение бита считывается с линии «SDA» по фронту импульса на линии «SCL».
  • «ACK» - бит равный 0, отправляется после успешного приёма байта данных.
  • «NACK» - бит равный 1, отправляется после байта данных в случае ошибки.
  • ПЕРВЫЙ БАЙТ - отправляется мастером, состоит из 7 бит адреса и бита «RW».
  • «R/W» - младший бит первого байта данных указывает направление передачи данных пакета, 1 - прием (от модуля к мастеру), 0 - передача (от мастера в модуль).
  • «RESTART» - повторный старт, отправляется мастером внутри пакета. Сигнал представляет из себя «START» отправленный не на свободной шине, а внутри пакета.

ВАЖНО: Все изменения на линии «SDA» должны происходить только при наличии «0» на линии «SCL» за исключением сигналов «START», «STOP» и «RESTART».

    Запись данных в регистры:

    • Отправляем сигнал «START».
    • Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
      Получаем ответ от модуля в виде одного бита «ACK».
    • Отправляем второй байт: адрес регистра в который будет произведена запись.
      Получаем ответ от модуля в виде одного бита «ACK».
    • Отправляем третий байт: данные для записи в регистр.
      Получаем ответ от модуля в виде одного бита «ACK».
    • Далее можно отправить четвёртый байт данных для записи в следующий по порядку регистр и т.д.
    • Отправляем сигнал «STOP».

    Пример записи в один регистр:

    Запись значения 0x2A в регистр 0x06 модуля с адресом 0x09:

                                     // Запись в регистр методами библиотеки Wire.h
    Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
    Wire.write(0x06);                // Записываем в буфер байт адреса регистра.
    Wire.write(0x26);                // Записываем в буфер байт который будет записан в регистр.
    Wire.endTransmission();          // Выполняем передачу адреса и байтов из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.
    

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

    Запись в модуль с адресом 0x09 нескольких значений начиная с регистра 0x12:
    В регистр 0x12 запишется значение 0x0F, в следующий по порядку регистр (0x13) запишется значение 0x30 и в следующий по порядку регистр (0x14) запишется значение 0xB1.

                                     // Запись в регистры методами библиотеки Wire.h
    byte data[3] = {0x0F,0x30,0xB1}; // Определяем массив с данными для передачи.
    Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
    Wire.write(0x12);                // Записываем в буфер байт адреса первого регистра.
    Wire.write(data, 3);             // Записываем в буфер 3 байта из массива data.
    Wire.endTransmission();          // Выполняем передачу адреса и байт из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.

    Чтение данных из регистров:

    • При чтении пакет делится на 2 части: запись № регистра и чтение его данных.
    • Отправляем сигнал «START».
    • Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
      Получаем ответ от модуля в виде одного бита «ACK».
    • Отправляем второй байт: адрес регистра из которого нужно прочитать данные.
      Получаем ответ от модуля в виде одного бита «ACK».
    • Отправляем сигнал «RESTART».
    • Отправляем первый байт после «RESTART»: 7 бит адреса и бит «R/W» равный 1 (чтение).
      Получаем ответ от модуля в виде одного бита «ACK».
    • Получаем байт данных из регистра модуля.
      Отвечаем битом «ACK» если хотим прочитать следующий регистр, иначе отвечаем «NACK».
    • Отправляем сигнал «STOP».

    Пример чтения одного регистра:

    Чтение из модуля с адресом 0x09 байта данных регистра 0x05:
    (в примере модуль вернул значение 0x01).

                                     // Чтение регистра методами библиотеки Wire.h
    byte data;                       // Объявляем переменную для чтения байта данных.
    Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
    Wire.write(0x05);                // Записываем в буфер байт адреса регистра.
    Wire.endTransmission(false);     // Выполняем передачу без установки состояния STOP.
    Wire.requestFrom(0x09, 1);       // Читаем 1 байт из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
    data=wire.read();                // Сохраняем прочитанный байт в переменную data.

    Пример чтения нескольких регистров подряд:

    Чтение из модуля с адресом 0x09 нескольких регистров начиная с регистра 0x05:
    (в примере модуль вернул значения: 0x01 из рег. 0x05, 0x13 из рег. 0x06, 0xC3 из рег. 0x07).

                                     // Чтение регистров методами библиотеки Wire.h
    byte data[3];                    // Объявляем массив для чтения данных.
    Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
    Wire.write(0x05);                // Записываем в буфер байт адреса регистра.
    Wire.endTransmission(false);     // Выполняем передачу без установки состояния STOP.
    Wire.requestFrom(0x09, 3);       // Читаем 3 байта из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
    int i=0;                         // Определяем счётчик номера прочитанного байта.
    while( Wire.available() ){       // Выполняем цикл while пока есть что читать из буфера.
      if(i<3){                       // Лучше делать такую проверку, чтоб не записать данные за пределы массива data!
        data[i] = wire.read(); i++;  // Читаем очередной байт из буфера в массив data.
      }                              //
    }                                //

    Примечание:

    • Если на линии I2C только один мастер, то сигнал «RESTART» можно заменить на сигналы «STOP» и «START».
    • Рекомендуется не выполнять чтение или запись данных чаще 200 раз в секунду.
      Обратите внимание на сигналы «RESTART» и «STOP» в пакетах чтения данных:
    • Между фронтом и спадом сигнала «RESTART» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 1.
    • Между сигналом «NACK» и сигналом «STOP» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 0.
    • Эти биты не сохраняются в модулях и не расцениваются как ошибки.

    Модуль не поддерживает горячее подключение: Подключайте модуль только при отсутствии питания и данных на шине I2C. В противном случае потребуется отключить питание при уже подключённом модуле.

    Пример чтения состояния кнопки:

    Следующий скетч демонстрирует пример вывода состояния кнопки (нажата/отпущена) в монитор последовательного порта.

    #include <Wire.h>                                // Подключаем библиотеку Wire для работы с шиной I2C.
    const int ADDRESS     = 0x09;                    // Определяем адрес модуля Metro - кнопка.
    const int REG_DATA    = 0x10;                    // Определяем адрес регистра REG_DATA.
    const int FLG_PRESSED = 5;                       // Определяем номер бита FLG_PRESSED в регистре REG_DATA.
    byte      DATA;                                  // Объявляем переменную для хранения байта данных считанных с регистра.
                                                     //
    void setup(){                                    //
        Serial.begin(9600);                          // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек.
        while(!Serial){;}                            // Ждём готовность к работе аппаратной шины UART.
        Wire.setClock(100000L);                      // Устанавливаем скорость передачи данных по шине I2C.
        Wire.begin();                                // Инициируем работу c шиной I2C в качестве мастера.
    }                                                //
                                                     //
    void loop(){                                     //
        Wire.beginTransmission(ADDRESS);             // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
        Wire.write(REG_DATA);                        // Функция write() помещает значение своего аргумента в буфер для передачи.
        Wire.endTransmission(false);                 // Выполняем инициированную ранее передачу данных (параметр false указывает что состояние STOP устанавливать не требуется).
        Wire.requestFrom(ADDRESS, 1);                // Читаем из модуля с адресом ADDRESS, 1 байт данных в буфер библиотеки Wire. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
        if   ( Wire.available() ){DATA=Wire.read();} // Если в буфере библиотеки Wire есть данные, то читаем 1 байт в переменную DATA.
        while( Wire.available() ){     Wire.read();} // Если в буфере библиотеки Wire есть еще данные, то читаем их в никуда (чистим буфер).
        if   ( DATA & bit(FLG_PRESSED) ){            // Если в полученном байте DATA установлен бит FLG_PRESSED, значит кнопка нажата.
               Serial.println("Кнопка нажата");      //
        }else{ Serial.println("Кнопка отпущена"); }  //
        delay(1000);                                 //
    }                                                //

    Габариты:

    Ссылки:




    Обсуждение

    Гарантии и возврат Используя сайт Вы соглашаетесь с условями