原理
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