Arduino 之間進行 I2C 通訊

原理

I2C 分為兩種模式共四個可能性萨咳,分別為

  • Master Transmitter:主動發(fā)起 START,并向指定地址的 slave 傳送數據疫稿,接受來自 slave 的 ACK培他,傳輸結束后主動發(fā)起 STOP
  • Master Receiver:主動發(fā)起 START,并向指定地址的 slave 請求數據遗座,向 slave 發(fā)送 ACK 并發(fā)起 STOP
  • Slave Transmitter:接受來自 master 向本機地址發(fā)起的 START舀凛,向 master 傳送數據,接受來自 master 的 ACK途蒋,并檢測是否 STOP
  • Slave Receiver:接受來自 master 向本機地址發(fā)起的 START猛遍,接受來自 master 的數據,向 master 發(fā)送 ACK号坡,并檢測是否 STOP

它們這樣對應:
Master Transmitter <-> Slave Receiver
Master Receiver <-> Slave Transmitter

接線

兩個 Arduino 之間進行 I2C 通信懊烤,接線如下

Device SDA SCL
Arduino A4 A5
Arduino A4 A5

注意,因為 I2C 協(xié)議需要線與宽堆,所以要添加上拉電阻
這里選擇 A4 和 A5 各 10k 上拉腌紧,如果需要更快的 I2C 通訊速度,可以降低電阻值

接線

加上 Probe

接線

代碼

/** I2C_Master_Transmitter.ino
 * 
 * | Arduino | A4 | ---- SDA
 *           | A5 | ---- SCL
 */

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin();       // join I2C bus as master (no address provided).
}

byte x = 0;

void loop() {
  uint8_t slave_addr = 0x02;
  Serial.println("Finish transmission");
  Wire.beginTransmission(slave_addr); // transmit to device
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte  
  Wire.endTransmission();    // stop transmitting

  x += 1;
  delay(100);
}

/** I2C_Master_Receiver.ino
 * 
 * | Arduino | A4 | ---- SDA
 *           | A5 | ---- SCL
 */

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin();       // join I2C bus as master (no address provided).
}

void loop() {
  uint8_t slave_addr = 0x2;
  uint8_t n_bytes = 1;
  Wire.requestFrom(slave_addr, n_bytes);    // request data from slave device

  while (Wire.available() > 0) {  // slave may send less than requested
    char c = Wire.read();         // receive a byte as character
    Serial.print(c);
  }

  delay(100);
}

/** I2C_Slave_Transmitter.ino
 * 
 * | Arduino | A4 | ---- SDA
 *           | A5 | ---- SCL
 */

#include <Wire.h>

void setup() {
  uint8_t device_addr = 0x02;
  Serial.begin(115200);
  Wire.begin(device_addr);            // join I2C bus as slave (address provided)
  Wire.onRequest(requestEvent);       // register event
}

void loop() {
  delay(100);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  Serial.println("replied");
  
  Wire.write("hello "); // respond with message of 6 bytes
  // as expected by master
}

/** I2C_Slave_Receiver.ino
 * 
 * | Arduino | A4 | ---- SDA
 *           | A5 | ---- SCL
 */

#include <Wire.h>

void setup() {
  uint8_t device_addr = 0x02;
  Serial.begin(115200);
  Wire.begin(device_addr);            // join I2C bus as slave (address provided)
  Wire.onReceive(receiveEvent);       // register event
}

void loop() {
  delay(100);
}

void receiveEvent(int howMany) {
  while(1 < Wire.available()) {
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);
}

示波器圖形

6bc783c308e84c2a6e83d854ef0e784.jpg
325e082278601b3ad2910b15fc88c30.jpg
3061bebce0d25f8dd4f23230e578adb.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末畜隶,一起剝皮案震驚了整個濱河市壁肋,隨后出現的幾起案子,更是在濱河造成了極大的恐慌籽慢,老刑警劉巖浸遗,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異嗡综,居然都是意外死亡乙帮,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門极景,熙熙樓的掌柜王于貴愁眉苦臉地迎上來察净,“玉大人,你說我怎么就攤上這事盼樟∏饪ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵晨缴,是天一觀的道長译秦。 經常有香客問我,道長,這世上最難降的妖魔是什么筑悴? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任们拙,我火速辦了婚禮,結果婚禮上阁吝,老公的妹妹穿的比我還像新娘砚婆。我一直安慰自己,他們只是感情好突勇,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布装盯。 她就那樣靜靜地躺著,像睡著了一般甲馋。 火紅的嫁衣襯著肌膚如雪埂奈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天定躏,我揣著相機與錄音账磺,去河邊找鬼。 笑死共屈,一個胖子當著我的面吹牛绑谣,可吹牛的內容都是我干的。 我是一名探鬼主播拗引,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼借宵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矾削?” 一聲冷哼從身側響起壤玫,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哼凯,沒想到半個月后欲间,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡断部,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年猎贴,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝴光。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡她渴,死狀恐怖,靈堂內的尸體忽然破棺而出蔑祟,到底是詐尸還是另有隱情趁耗,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布疆虚,位于F島的核電站苛败,受9級特大地震影響满葛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜罢屈,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一嘀韧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儡遮,春花似錦乳蛾、人聲如沸暗赶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹂随。三九已至十嘿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岳锁,已是汗流浹背绩衷。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留激率,地道東北人咳燕。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像乒躺,于是被迫代替她去往敵國和親招盲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • 在使用單片機的過程中嘉冒,I2C 通信可以說是最被廣泛使用和采納的協(xié)議之一曹货,采用 I2C 協(xié)議可以占用更少的資源,鏈接...
    noparkinghere閱讀 2,168評論 0 8
  • I2C總線是由Philips公司開發(fā)的一種簡單讳推、雙向二線制同步串行總線顶籽。它只需要兩根線即可在連接于總線上的器件之間...
    WB莫遙燚閱讀 5,158評論 0 1
  • 1. I2C接口 ——概述:I2C是一個兩線接口究驴,一條數據線镊绪、一條時鐘線,采用邊沿觸發(fā)方式纳胧。使用方式為cpu<——...
    鄭行_aover閱讀 1,323評論 0 0
  • 1.目的: 寫一個關于nrf52832的用硬件I2C驅動一個傳感器的流程文檔 2.分析: 現在用IIC和BMI16...
    Mo_輝仔閱讀 2,256評論 0 0
  • 久違的晴天镰吆,家長會。 家長大會開好到教室時跑慕,離放學已經沒多少時間了万皿。班主任說已經安排了三個家長分享經驗摧找。 放學鈴聲...
    飄雪兒5閱讀 7,523評論 16 22