iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
自我挑戰組

MCU功能介紹與實作系列 第 26

Day 26:I2C通訊

  • 分享至 

  • xImage
  •  

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通訊廣泛應用於各種嵌入式系統中,其中一些常見的用途包括:

  • 感測器:連接各種類型的傳感器,如溫度、濕度、氣壓等,以獲取環境數據。
  • 顯示螢幕:控制OLED顯示器、LCD顯示器等,以顯示圖像。
  • 記憶體:與EEPROM(電可擦寫讀取專用記憶體)或實時時鐘(RTC)晶片進行通訊,以存儲和檢索數據。
  • 音頻編解碼器:連接音頻編解碼器晶片,以播放音樂或聲音效果。
  • 擴充模組:與各種外部模組,如擴展IO、輸出PWM等,以擴展MCU的功能。

簡單的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); // 將結果回傳給主機
  }
}

上一篇
Day 25:SPI通訊
下一篇
Day 27:CAN通訊
系列文
MCU功能介紹與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言