Arduino - 互聯積體電路



互聯積體電路 (I2C) 是一種用於新一代微控制器和專用積體電路之間進行序列資料交換的系統。當它們之間的距離較短時(接收器和發射器通常位於同一印刷電路板上),就會使用它。連線透過兩根導線建立。一根用於資料傳輸,另一根用於同步(時鐘訊號)。

如下圖所示,一個裝置始終為主裝置。它在通訊開始前執行一個從裝置晶片的定址。這樣,一個微控制器可以與 112 個不同的裝置通訊。波特率通常為 100 Kb/秒(標準模式)或 10 Kb/秒(慢波特率模式)。最近出現了波特率為 3.4 Mb/秒的系統。透過 I2C 匯流排通訊的裝置之間的距離限制在幾米以內。

I2C

開發板 I2C 引腳

I2C 匯流排由兩個訊號組成 - SCL 和 SDA。SCL 是時鐘訊號,SDA 是資料訊號。當前的匯流排主裝置始終生成時鐘訊號。某些從裝置有時可能會強制時鐘為低電平以延遲主裝置傳送更多資料(或需要更多時間來準備資料,然後再讓主設備嘗試將其輸出)。這稱為“時鐘拉伸”。

以下是不同 Arduino 開發板的引腳 -

  • Uno、Pro Mini A4 (SDA)、A5 (SCL)
  • Mega、Due 20 (SDA)、21 (SCL)
  • Leonardo、Yun 2 (SDA)、3 (SCL)

Arduino I2C

我們有兩種模式 - 主程式碼和從程式碼 - 用於使用 I2C 連線兩個 Arduino 開發板。它們是 -

  • 主傳送器/從接收器
  • 主接收器/從傳送器

主傳送器/從接收器

現在讓我們看看什麼是主傳送器和從接收器。

主傳送器

以下函式用於初始化 Wire 庫並以主裝置或從裝置身份加入 I2C 匯流排。這通常只調用一次。

  • Wire.begin(address) - address 是 7 位從裝置地址,在我們的例子中,由於主裝置未指定,因此它將以主裝置身份加入匯流排。

  • Wire.beginTransmission(address) - 開始向具有給定地址的 I2C 從裝置傳送資料。

  • Wire.write(value) - 將位元組排隊,以便從主裝置傳輸到從裝置(在 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(address) - address 是 7 位從裝置地址。

  • Wire.onReceive(received data handler) - 當從裝置從主裝置接收資料時要呼叫的函式。

  • 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(address,number of bytes) - 主裝置用於向從裝置請求位元組。然後可以使用函式 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(handler) - 當主裝置從此從裝置請求資料時,會呼叫一個函式。

示例

#include <Wire.h> 

void setup() { 
   Wire.begin(2); // join i2c bus with address #2
   Wire.onRequest(requestEvent); // register event
} 

Byte x = 0;

void loop() { 
   delay(100); 
} 

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()

void requestEvent() { 
   Wire.write(x); // respond with message of 1 bytes as expected by master
   x++; 
}
廣告