I2C(Inter-Integrated Circuit)通常用於連接MCU(Microcontroller Unit)和外部設備,以實現數據的可靠傳輸。I2C通訊是由飛利浦(Philips)開發的,現在由NXP Semiconductors繼續維護。
I2C通訊使用兩條線進行數據傳輸:
SCL(Serial Clock): 時鐘訊號線,用於同步數據傳輸。
SDA(Serial Data): 數據訊號線,用於傳輸數據位。
I2C通訊是一種主從(Master-Slave)協議,它包括一個主機(Master)和一個或多個從機(Slave)。主機生成時鐘訊號(SCL)並控制數據的傳輸,而從機則回應主機的命令。
I2C通訊的用途
I2C通訊廣泛應用於各種嵌入式系統中,其中一些常見的用途包括:
以下一個Arduino當做主機,另一個Arduino當作從機。主機向從機發送一個字節,從機接收該字節,將其加倍並回傳給主機。
主機端程式碼
#include <Wire.h>
void setup() {
Wire.begin(); // 初始化I2C通訊
Serial.begin(9600);
}
void loop() {
byte dataToSend = 5; // 要發送的數據
byte receivedData;
Wire.beginTransmission(8); // 8是從機地址
Wire.write(dataToSend); // 傳送數據
Wire.endTransmission();
delay(100);
Wire.requestFrom(8, 1); // 從機地址8,要求一個字節的數據
if (Wire.available()) {
receivedData = Wire.read(); // 讀取接收到的數據
Serial.print("Sent: ");
Serial.print(dataToSend);
Serial.print(" | Received: ");
Serial.println(receivedData);
}
delay(1000); // 延遲1秒
}
從機端程式碼
#include <Wire.h>
void setup() {
Wire.begin(8); // 從機地址為8
Wire.onReceive(receiveEvent); // 設定接收事件
Serial.begin(9600);
}
byte receivedData;
void loop() {
// 從機不需要特別的循環處理
}
void receiveEvent(int bytes) {
if (Wire.available()) {
receivedData = Wire.read(); // 讀取主機傳送的數據
receivedData *= 2; // 加倍數據
Wire.write(receivedData); // 將結果回傳給主機
}
}