НАЗАД

Модуль Wire.h

Микроконтроллеры, на которых реализованы Arduino имеют аппаратную поддержку интерфейса I2C. На платах Arduino линия данных (SDA) на аналоговый вход/выход 4, линия тактового сигнала (SCL) выведена на аналоговый вход/выход 5. Вход/выход на платах Arduino называют pin или на русском – пин. В дальнейшем будем использовать русскоязычный термин.
Для Arduino Mega линия данных (SDA) выведена на 20 цифровой пин, а линия тактового сигнала (SCL) на 21 цифровой пин.
Для микроконтроллеров, для примера, микроконтроллеры Atmega (8/16/32), поддерживающие I2C, линия данных (SDA) расположена на ножке 27, а линия тактового сигнала (SCL) на ножке 28.
Для работы Arduino с протоколом шины I2C имеется штатная библиотека Wire.

Метод «begin» инициализации Wire

Метод подключения к шине I2C и инициализации библиотеки Wire. Ниже приведен синтаксис вызова метода:

void begin(); //метод запуска работы
void begin(uint8_t address);
void begin(int address);

Данный метод вызывается для подключения к шине I2C в качестве master device или slave device. Вызывается один раз. Параметр address определяет адрес устройства при работе в режиме slave device, если не указан, то устройства работает в режиме master device.
Возвращаемого значения нет.

Метод «requestFrom»

Метод предназначен для запроса байта от устройства в режиме slave device. Данные (байты) получаем с помощью методов available() и read(). Ниже приведен синтаксис вызова метода:

uint8_t requestFrom(uint8_t address, uint8_t quantity);

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

Методы передачи данных по шине I2C

Для начала передачи данных устройства в режиме slave device с заданным адресом используется метод:

void beginTransmission(uint8_t address);

Параметр address – это адрес устройства.
Возвращаемого значения нет.
Для добавления данных (последовательности байт) в очередь для передачи данных необходимо вызвать метод:

write(uint8_t address);
write(value);
write(string);
write(data, length);

Данный метод вызывается между методами beginTransmission() и endTransmission().


Возвращаемое значение: возвращает число записанных байт.
Для выполнения передачи данных используется метод:

uint8_t endTransmission(void);

Данный метод завершает передачу данных, которые были построены в очередь методом write(), для устройства в режиме slave device, которое было инициировано beginTransmission().
Возвращаемое значение: байт, биты которого указывают на состояние передачи данных.
Описание байта состояния передачи:


Пример работы методов приведен в листинге ниже.

#include
byte val = 0;
void setup()
{
Wire.begin(); // инициализация шины i2c
}
void loop()
{
Wire.beginTransmission(44); // передача для устройства с адресом #44 (0x2c)
// адрес устройства определен в документации на устройство
Wire.write(val); // отправка байта val
Wire.endTransmission(); // передача данных
val++; // инкремент значения
if(val == 64) // если достигли 64 (max)
{
val = 0; // начинаем с минимального значения
}
delay(500);
}

Метод «available»

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

int available(void);

Данный метод вызывается на устройстве работающем в режиме master device, после вызова метода requestFrom(). Может вызываться устройством в режиме slave device внутри обработчика onReceive().
Параметров нет.
Возвращаемое значение: число байт, доступных для чтения.

Метод «read»

Метод считывает байт, который передается от устройства в режиме slave device к устройству в режиме master device, после вызова requestFrom() или наоборот. Метод наследуется от класса Stream. Метод вызывается следующим синтаксисом:

int read(void);

Параметров нет.
Возвращаемое значение: полученный байт.
Ниже приведен листинг с примером

#include
void setup()
{
Wire.begin(); // подключение к шине i2c
Serial.begin(9600); // запуск последовательного порта /br> }
void loop()
{
Wire.requestFrom(2, 6); // запрос 6 байт от слейва #2
while(Wire.available()) // пока есть, что читать
{
char c = Wire.read(); // получаем байт (как символ)
Serial.println(c); // печатает в порт
}
delay(500);
}

Обработчик «onRecieve»

Данный метод регистрирует вызываемую функцию, когда устройство в режиме slave device получает данные от устройства master device. Синтаксис команды ниже:

void onReceive( void (*function)(int) );

Параметры: function – функция, которая вызывается, когда устройство в режиме slave device получает данные. Обработчик должен принимать один параметр с типом переменной int (число байт, считанных от устройства в режиме master device).
Возвращаемых значений нет.
Пример:

void MyHandler (int numBytes);