Учебники

Arduino — Интегральная микросхема

Межинтегральная схема (I2C) представляет собой систему последовательного обмена данными между микроконтроллерами и специализированными интегральными схемами нового поколения. Он используется, когда расстояние между ними небольшое (приемник и передатчик обычно находятся на одной печатной плате). Соединение устанавливается через два проводника. Один используется для передачи данных, а другой — для синхронизации (тактовый сигнал).

Как видно на следующем рисунке, одно устройство всегда является мастером. Он выполняет адресацию одного ведомого чипа до начала связи. Таким образом, один микроконтроллер может связываться со 112 различными устройствами. Скорость передачи данных обычно составляет 100 кбит / с (стандартный режим) или 10 кбит / с (режим медленной скорости). Недавно появились системы со скоростью передачи 3,4 Мбит / с. Расстояние между устройствами, связывающимися по шине I2C, ограничено несколькими метрами.

I2C

Плата I2C Pins

Шина I2C состоит из двух сигналов — SCL и SDA. SCL — это тактовый сигнал, а SDA — это сигнал данных. Текущий мастер шины всегда генерирует тактовый сигнал. Некоторые ведомые устройства могут время от времени приводить к снижению тактового сигнала, чтобы задержать передачу мастером большего количества данных (или требовать больше времени для подготовки данных, прежде чем мастер попытается отключить их). Это известно как «растяжение часов».

Ниже приведены выводы для различных плат Arduino —

  • Uno, Pro Mini A4 (SDA), A5 (SCL)
  • Mega, Due 20 (SDA), 21 (SCL)
  • Леонардо, Юн 2 (SDA), 3 (SCL)

Arduino I2C

У нас есть два режима — мастер-код и подчиненный код — для подключения двух плат Arduino с использованием I2C. Они —

  • Главный передатчик / ведомый приемник
  • Главный приемник / ведомый передатчик

Главный передатчик / ведомый приемник

Давайте теперь посмотрим, что такое главный передатчик и подчиненный приемник.

Мастер передатчик

Следующие функции используются для инициализации библиотеки проводов и подключения шины I2C в качестве главного или подчиненного. Обычно это называется только один раз.

  • Wire.begin (адрес) — Адрес — это 7-битный адрес ведомого в нашем случае, так как мастер не указан, и он присоединится к шине как мастер.

  • Wire.beginTransmission (address) — начать передачу на ведомое устройство I2C с заданным адресом.

  • Wire.write (значение) — ставит байты в очередь для передачи от ведущего устройства к ведомому (промежуточные вызовы функций beginTransmission () и endTransmission ()).

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

Wire.begin (адрес) — Адрес — это 7-битный адрес ведомого в нашем случае, так как мастер не указан, и он присоединится к шине как мастер.

Wire.beginTransmission (address) — начать передачу на ведомое устройство I2C с заданным адресом.

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

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

пример

#include <Wire.h> //include wire library

void setup() //this will run only once { 
   Wire.begin(); // join i2c bus as master
} 

short age = 0; 

void loop() {   
   Wire.beginTransmission(2); 
   // transmit to device #2
   Wire.write("age is = ");
   Wire.write(age); // sends one byte
   Wire.endTransmission(); // stop transmitting
   delay(1000); 
}

Раб приемник

Используются следующие функции —

  • Wire.begin (адрес) — Адрес является 7-битным адресом подчиненного устройства.

  • Wire.onReceive (обработчик полученных данных) — функция, которая вызывается, когда подчиненное устройство получает данные от ведущего.

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

Wire.begin (адрес) — Адрес является 7-битным адресом подчиненного устройства.

Wire.onReceive (обработчик полученных данных) — функция, которая вызывается, когда подчиненное устройство получает данные от ведущего.

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

пример

#include <Wire.h> //include wire library

void setup() {  //this will run only once
   Wire.begin(2); // join i2c bus with address #2
   Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing 
   Serial.begin(9600); // start serial for output to print what we receive 
}

void loop() {   
   delay(250); 
}

//-----this function will execute whenever data is received from master-----//

void receiveEvent(int howMany) { 
   while (Wire.available()>1) // loop through all but the last {
      char c = Wire.read(); // receive byte as a character
      Serial.print(c); // print the character
   }
}

Главный приемник / ведомый передатчик

Давайте теперь посмотрим, что такое главный приемник и подчиненный передатчик.

Мастер приемник

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

Следующая функция используется —

Wire.requestFrom (адрес, количество байтов) — используется ведущим для запроса байтов от подчиненного устройства. Затем байты могут быть получены с помощью функций wire.available () и wire.read ().

пример

#include <Wire.h> //include wire library void setup() { 
   Wire.begin(); // join i2c bus (address optional for master) 
   Serial.begin(9600); // start serial for output
} 

void loop() { 
   Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
   while (Wire.available()) // slave may send less than requested {
      char c = Wire.read(); // receive a byte as character
      Serial.print(c); // print the character
   } 
   delay(500); 
}

Раб передатчик

Следующая функция используется.

Wire.onRequest (обработчик) — функция вызывается, когда мастер запрашивает данные с этого подчиненного устройства.

пример