Микроконтроллеры 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”»
Огромное спасибо. То что надо!