CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Программирование 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.

На нашей 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();


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

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

По теме:
Интерфейс I2C
I2CScanner.pde: Arduino as I2C bus scanner
  • +3
  • 24 февраля 2012, 12:21
  • admin

Комментарии (1)

RSS свернуть / развернуть
+
0
Огромное спасибо. То что надо!
avatar

daitel

  • 4 марта 2012, 20:39

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.