Библиотека для шины i2c

I²C (IIC, англ. Inter-Integrated Circuit) — последовательная асимметричная шина для связи между интегральными схемами внутри электронных приборов.

Шина I2C также известна как двухпроводной интерфейс (Two Wire Interface, TWI) — простое и удобное устройство, используемое для обмена данными. Сам протокол был предложен фирмой Philips, но во избежание проблем с авторскими правами иногда протокол называют «двухпроводным».

Передача данных между устройствами и Arduino осуществляется по двум линиям, которые называют линией данных (Serial Data Line, SDA) и тактовой линией синхронизации сигнала (Serial Clock Line, SCL). В Arduino Uno вывод SDA находится на A4, а линия SCL — на контакте A5. Некоторые новейшие платы R3 имеют отдельные контакты, соединённые с шиной I2C и расположенные в верхнем левом углу для удобства доступа к ним. При подключении требуется установка подтягивающих резисторов. Обычно используют резисторы номиналом 4.7 кОм.

Будучи подключённой к шине I2C, плата Arduino считается ведущим устройством, а все остальные устройства — ведомыми. Каждое ведомое устройство имеет свой адрес (идентификационный номер) — шестнадцатеричное число, — позволяющий плате Arduino обращаться и взаимодействовать с каждым устройством по отдельности. Обычно устройство имеет на выбор диапазон адресов I2C, который указан в документации к нему. Конкретные доступные адреса определяются подключением контактов IC тем или иным образом.

Ведущее устройство (Uno) отвечает за инициирование обмена. Ведомые устройства не могут инициировать обмен данных, а только отвечают на запросы от ведущего устройства.

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

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

Библиотека Wire

Библиотека Wire входит в состав Arduino и используется для работы с шиной I2C.

В скетче сначала необходимо активировать библиотеку, затем в setup() активировать шину.

Поскольку как правило плата Arduino действует как ведущее устройство, ей не нужно присваивать адрес. Если бы плата настраивалась на работу в режиме ведомого устройства, нам пришлось бы присвоить адрес в диапазоне от 0 до 127, передав его как параметр, чтобы уникально идентифицировать плату на шине I2C.

Передача данных по шине осуществляется по одному байту. Чтобы послать байт из платы Arduino в устройство на шине, необходимо вызвать три функции:

  • Первая функция инициализирует связь, как показано ниже (где аргумент address — это адрес ведомого устройства на шине в шестнадцатеричном виде, например 0x50):
  • Вторая функция посылает 1 байт данных из Arduino в устройство с адресом, указанным в предыдущем вызове функции. Здесь аргумент data — это переменная, содержащая 1 байт данных; вы можете послать несколько байтов, но для каждого байта придётся вызвать Wire.write():
  • По завершении передачи данных определённому устройству следует разорвать связь:

Чтобы запросить данные из устройства на шине I2C, инициализируйте связь вызовом Wire.beginTransmission(address) и отправьте запрос Wire.requestFrom(address, x), (где x — количество запрашиваемых байтов данных). Затем с помощью следующей функции нужно сохранить принятый байт в переменной:

По окончании приёма следует разорвать связь вызовом Wire.endTransmission().

Видео:Видеоуроки по Arduino. I2C и processing (7-я серия, ч1)Скачать

Видеоуроки по Arduino. I2C и processing (7-я серия, ч1)

Методы библиотеки

begin()

Инициализация библиотеки Wire и подключение к шине I2C в качестве ведущего или ведомого устройства. Как правило, вызывается только один раз.

Параметры

address: 7-битный адрес устройства (если работаем в режиме ведомого). Если не указано, то контроллер подключается к шине в роли ведущего (master).

Читайте также: Вставляем камеру в бескамерных шинах

Возвращаемое значение

requestFrom()

Используется ведущим устройством для запроса байта от ведомого устройства. Байты могут быть получены с помощью методов available() и read().

Параметры

Возвращаемое значение

Возвращает число считанных байт.

beginTransmission()

Начало передачи I2C для ведомого устройства с заданным адресом. Затем, нужно вызвать метод write() для добавления последовательности байт в очередь предназначенных для передачи, и выполнить саму передачу данных методом endTransmission().

Параметры

address: 7-битный адрес устройства для передачи.

Возвращаемое значение

endTransmission()

Завершает передачу данных для ведомого устройства, которое было начато beginTransmission() и, фактически, осуществляет передачу байт, которые были поставлены в очередь методом write().

Параметры

Возвращаемое значение

Возвращает байт, который указывает статус передачи:

  • 0: успех
  • 1: данных слишком много и они не помещается в буфер передачи/размер буфера задаётся определением #define BUFFER_LENGTH 32
  • 2: получили NACK на передачу адреса
  • 3: получили NACK на передачу данных
  • 4: другая ошибка

write()

Записывает данные от ведомого устройства в ответ на запрос мастера, или записывает очередь байт для передачи от мастера к ведомому устройству (в промежутках между вызовами beginTransmission() и endTransmission()).

Примеры

Параметры

  • value: значение для отправления как единичный байт
  • string: строка для отправления как последовательность байт
  • data: массив байт для отправления
  • length: число байт для передачи

Возвращаемое значение

Возвращает число записанных байт.

available()

Метод available() наследуется от класса Stream. Возвращает количество байт, доступных для получения. Этот метод должно быть вызван на мастере, после вызова requestFrom() или ведомым внутри обработчика onReceive().

Параметры

Возвращаемое значение

Число байт, доступных для чтения.

Метод read() наследуется от класса Stream. Считывает байт, который был передан от ведомого устройства к мастеру, после вызова requestFrom() или был передан от мастера к ведомому.

Параметры

Возвращаемое значение

Следующий полученный байт.

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

Параметры

  • function: функция, которая вызывается, когда ведомый получает данные; обработчик должен принимать один параметр — int (число байт, считанных от мастера) и ничего не возвращать. Например:
    void MyHandler (int numBytes);

Возвращаемое значение

onRequest()

Регистрирует функцию, которая вызывается, когда мастер запрашивает данные из этого ведомого устройства.

Параметры

  • function: функция, которая будет вызываться; не имеет параметров и ничего не возвращает. например:
    void MyHandler();

Возвращаемое значение

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

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

Узнать адрес

В примерах, где используется I2C, важно использовать правильный адрес. Если у вас устройство, чей адрес вы не знаете, то можете воспользоваться библиотекой i2cdetect, доступный через менеджер библиотек. После установки библиотеки запустите прилагаемый к нему пример и через последовательный монитор увидите нужный адрес.

Также можно запустить собственный скетч.

Проверил на ЖК-экране, чей адрес обычно 0х27.

Видео:AvrStudio 4. Библиотека для AVR. Модуль для I2C или TWIСкачать

AvrStudio 4. Библиотека для AVR. Модуль для I2C или TWI

Библиотека Wire для Arduino для работы с шиной I2C

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

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

Описание библиотеки Wire

Данная библиотека позволяет вам взаимодействовать с I2C / TWI устройствами. На платах Arduino с компоновкой R3 (распиновка 1.0) SDA (линия данных) и SCL (линия тактового сигнала) находятся на выводах около вывода AREF. Arduino Due имеет два I2C / TWI интерфейса: SDA1 и SCL1 находятся около вывода AREF, а дополнительные линии находятся на выводах 20 и 21.

Читайте также: Шины матадор чья производство

В таблице ниже показано, где расположены TWI выводы на разных платах Arduino.

Расположение выводов I2C/TWI на платах Arduino

Начиная с Arduino 1.0, данная библиотека наследует функции Stream , что делает ее совместимой с другими библиотеками чтения/записи. Из-за этого send() и receive() были заменены на read() и write() .

Видео:Шина данных i2c - декодируем/синхронизируем с помощью осциллографа Lecroy!Скачать

Шина данных i2c - декодируем/синхронизируем   с помощью осциллографа Lecroy!

Примечание

Существуют 7- и 8-битные версии адресов I2C. 7 битов идентифицируют устройство, а восьмой бит определяет, идет запись или чтение. Библиотека Wire использует 7 битные адреса. Если у вас есть техническое описание или пример кода, где используется 8-битный адрес, вам нужно откинуть младший бит (т.е. сдвинуть значение на один бит вправо), получив адрес от 0 до 127. Однако адреса от 0 до 7 не используются, так как зарезервированы, поэтому первым адресом, который может быть использован, является 8. Обратите внимание, что при подключении выводов SDA/SCL необходимы подтягивающие резисторы. Для более подробной информации смотрите примеры. На плате MEGA 2560 есть подтягивающие резисторы на выводах 20 и 21.

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

Шина I2C.

Описание методов

Wire.begin()

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

address : 7-битный адрес ведомого устройства (необязательно); если не задан, плата подключается к шине как мастер.

Примеры для ведомого устройства смотрите в примерах к методам onReceive() и onRequest() . Примеры для ведущего устройства смотрите в примерах к остальным методам. .

Wire.requestFrom()

Используется мастером для запроса байтов от ведомого устройства. Эти байты могут быть получены с помощью методов available() и read() .

Для совместимости с определенными I2C устройствами, начиная с Arduino 1.0.1, requestFrom() принимает аргумент логического типа данных, меняющий его поведение.

Если этот аргумент равен true , то requestFrom() после запроса посылает сообщение STOP, освобождая шину I2C.

Если этот аргумент равен false , то requestFrom() после запроса посылает сообщение RESTART. Шина не освобождается, что мешает другому устройству-мастеру влезть между сообщениями. Это позволяет одному ведущему устройству посылать несколько запросов, пока оно контролирует шину.

По умолчанию этот аргумент равен true .

Wire.requestFrom(address, quantity, stop)

  • address : 7-битный адрес устройства, у которого запрашиваются байты;
  • quantity : количество запрашиваемых байтов;
  • stop : boolean . true посылает сообщение STOP после запроса. false посылает сообщение RESTART после запроса, сохраняя соединение активным.

byte : количество байтов, возвращенных от ведомого устройства.

Смотрите пример к методу read() .

Wire.beginTransmission()

Начинает передачу на ведомое I2C устройство с заданным адресом. После него последовательность байтов для передачи ставится в очередь с помощью функции write() , и их передача с помощью вызова endTransmission() .

address : 7-битный адрес устройства, на которое необходимо передать данные.

Смотрите пример к методу write() .

Wire.endTransmission()

Завершает передачу на ведомое устройство, которая была начата методом beginTransmission() и передает байты, которые были поставлены в очередь методом write() .

Для совместимости с определенными I2C устройствами, начиная с Arduino 1.0.1, requestFrom() принимает аргумент логического типа данных, меняющий его поведение.

Если этот аргумент равен true , то requestFrom() после передачи посылает сообщение STOP, освобождая шину I2C.

Если этот аргумент равен false , то requestFrom() после передачи посылает сообщение RESTART. Шина не освобождается, что мешает другому устройству-мастеру влезть между сообщениями. Это позволяет одному ведущему устройству посылать несколько передач, пока оно контролирует шину.

По умолчанию этот аргумент равен true .

stop : boolean . true посылает сообщение STOP после передачи. false посылает сообщение RESTART после передачи, сохраняя соединение активным.

byte , который указывает на состояние передачи:

  • 0: успех;
  • 1: данные слишком длинны для заполнения буфера передачи;
  • 2: принят NACK при передаче адреса;
  • 3: принят NACK при передаче данных;
  • 4: остальные ошибки.

Смотрите пример к методу write() .

Wire.write()

Записывает данные от ведомого устройства в отклик на запрос от ведущего устройства, или ставит в очередь байты для передачи от мастера к ведомому устройству (между вызовами beginTransmission() и endTransmission() ).

  • value : значение для передачи, один байт.
  • string : строка для передачи, последовательность байтов.
  • data : массив данных для передачи, байты.
  • length : количество байтов для передачи.

byte : write() возвращает количество записанных байтов, хотя чтение этого количества не обязательно.

Wire.available()

Возвращает количество байтов, доступных для получения с помощью read() . Этот метод должен вызываться на ведущем устройстве после вызова requestFrom() или на ведомом устройстве внутри обработчика onReceive() .

Количество байтов, доступных для чтения.

Смотрите пример к методу read() .

Wire.read()

Считывает байт, который был передан от ведомого устройства к ведущему после вызова requestFrom() , или который был передан от ведущего устройства к ведомому.

byte : очередной принятый байт.

Wire.setClock()

Изменяет тактовую частоту для связи по шине I2C. У ведомых I2C устройств нет минимальной рабочей тактовой частоты, однако обычно используется 100 кГц.

clockFrequency : значение частоты (в герцах) тактового сигнала. Принимаются значения 100000 (стандартный режим) и 400000 (быстрый режим). Некоторые процессоры также поддерживают 10000 (низкоскоростной режим), 1000000 (быстрый режим плюс) и 3400000 (высокоскоростной режим). Чтобы убедиться, что необходимый режим поддерживается, обращайтесь к технической документации на конкретный процессор.

Wire.onReceive()

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

handler : функция, которая должна будет вызываться, когда ведомое устройство принимает данные; она должна принимать один параметр int (количество байтов, прочитанных от мастера) и ничего не возвращать, т.е.:

void myHandler(int numBytes)

Код для платы Arduino, работающей в качестве ведомого устройства:

Wire.onRequest()

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

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

Код для платы Arduino, работающей в качестве ведомого устройства:

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

    Автоподбор © 2023
    Информация, опубликованная на сайте, носит исключительно ознакомительный характер

    💥 Видео

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

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

    MCP2515, контроллер CAN шины с интерфейсом SPIСкачать

    MCP2515, контроллер CAN шины с интерфейсом SPI

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

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

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

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

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

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

    LCD дисплей LCM1602A-14, I2C и SPIСкачать

    LCD дисплей LCM1602A-14, I2C и SPI

    I2C интерфейсСкачать

    I2C интерфейс

    Сканер I2C шиныСкачать

    Сканер I2C шины

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

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

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

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

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

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

    I2C расширитель портов ввода-вывода PCF8574 и ArduinoСкачать

    I2C расширитель портов ввода-вывода PCF8574 и Arduino

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

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