Программирование Arduino — библиотека Wire — для работы с I2C


Микроконтроллеры Atmega имеют хардварную поддержку интерфейса I2C(TWI). Линии интерфейса SDA и SCL у МК Atmega8/168/328, сидят на ножках c номерами 27 (PC4) и 28 (PC5), соответственно.
На платах Arduino, линия данных — SDA (data line) выведена на аналоговый пин 4, а линия тактирования — SCL (clock line) выведена на аналоговый пин 5.
На Arduino Mega, SDA — это цифровой пин 20, а SCL — цифровой пин 21.
На Arduino Leonardo — 2 (SDA), 3 (SCL).
На Arduino Due — 20 (SDA), 21 (SCL), SDA1, SCL1

На нашей CraftDuino, i2c, помимо стандартных пинов, удобно выведен на отдельный разъём (4 обычных пина с шагом 2.54), а так же добавлены два джампера, которыми можно подключить подтягивающие резисторы.

Для работы с протоколом I2C, у Arduino есть штатная библиотека Wire, которая позволяет взаимодействовать с I2C/TWI-устройствами, как в режиме мастера, так и в режиме слейва.

В Arduino 1.0, библиотека наследуется от Stream, что делает её использование схожим с другими библиотеками чтения/записи (read/write libraries). В связи с этим, методы send() и receive() были заменены на read() и write().

class TwoWire : public Stream
{

Рассмотрим методы библиотеки

void begin();
void begin(uint8_t address);
void begin(int address);

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

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

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

uint8_t requestFrom(uint8_t address, uint8_t quantity);

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

Параметры:
address: 7-битный адрес устройства для запроса байтов данных
quantity: количество запрошенных байт

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

void beginTransmission(uint8_t address);

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

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

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

uint8_t endTransmission(void);

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

Параметры:
нет

Возвращаемое значение:
байт, который указывает статус передачи:
0: успех
1: данных слишком много и они не помещается в буфер передачи

размер буфера задаётся определением

#define BUFFER_LENGTH 32

2 получили NACK на передачу адреса
3 получили NACK на передачу данных
4: другая ошибка

size_t write(uint8_t data);
size_t write(const uint8_t *data, size_t quantity);

Вызов:

Wire.write(value);
Wire.write(string);
Wire.write(data, length);

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

Параметры:
value: значение для отправления как единичный байт

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

data: массив байт для отправления
length: число байт для передачи

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

Пример:

#include <Wire.h>

byte val = 0;

void setup()
{
   Wire.begin(); // подключение к шине i2c
}

void loop()
{
   Wire.beginTransmission(44); // передача для устройства #44 (0x2c)
                               // адрес устройства указывается в документации (datasheet)
   Wire.write(val);             // отправка байта val
   Wire.endTransmission();     // передача данных

   val++;        // инкремент значения
   if(val == 64) // если достигли 64 (max)
   {
     val = 0;    // начинаем с минимального значения
   }
   delay(500);
}

int available(void);

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

available() наследуется от класса Stream.

Параметры:
нет

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

int read(void);

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

read() наследуется от класса Stream.

Параметры:
нет

Возвращаемое значение:
Следующий полученный байт.

Пример:

#include <Wire.h>

void setup()
{
   Wire.begin();        // подключение к шине i2c
   Serial.begin(9600);  // запуск последовательного порта
}

void loop()
{
   Wire.requestFrom(2, 6);    // запрос 6 байт от слейва #2

   while(Wire.available())    // пока есть, что читать
   {
     char c = Wire.read();    // получаем байт (как символ)
     Serial.print(c);         // печатает в порт
   }

   delay(500);
}

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

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

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

void MyHandler (int numBytes);

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

void onRequest( void (*function)(void) );

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

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

void MyHandler();

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

setClock(clockFrequency);

Описание:
Эта функция изменяет тактовую частоту для связи I2C. Базовой тактовой частотой является 100 кГц.

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

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

Ссылки
http://www.arduino.cc/en/Reference/Wire

По теме
Интерфейс I2C
I2CScanner.pde: Arduino as I2C bus scanner


0 комментариев на «“Программирование Arduino — библиотека Wire — для работы с I2C”»

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

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение