.
I2C 簡介
I2C 念作 I-squared-C 普遍被念作 I Two C 因此將錯就錯就用這種念法
傳輸為半雙工,只需兩條線 SDA 和 SCL
SCL : Serial Clock Line ,在傳輸或接收資料時Clock的震盪為Low
SDA: Serial Data Line,用來傳輸 / 接收 資料,以 Shift的方式來進行傳遞
一次只能傳一個byte
傳輸的前7 Byte 為 Address 接著為 1 byte的 Read / Write
緊接著為 I2C Ack 如果為0表示設定成功
之後為要傳輸的資料 共 8 byte ,如下圖所示
簡單來說就是
Master發起通訊開始
SCL = HIGH SDA = LOW
在SCL為Low時可以改變資料
然後在 SCL為HIGH時不可改變資料,讓Slave讀取該資料
在全部都傳輸完後 SCL = HIGH SDA = HIGH
最後為功能實作 , 原理如上面所敘述
隨意拿一個 I2C Device作通訊測試
- #include <Wire.h>
-
- void setup(void){
- Serial.begin(9600);
- Serial.println("I2C Test");
- Wire.begin();
-
- //write reg
- I2C_Write(0x10, 0xF1);
- Serial.print("register 0x10 is ");
- // print Write Data
- Serial.println(I2C_Read(0x10), BIN);
-
- }
-
- void loop(void){
-
- }
-
- uint8_t I2C_Read(uint8_t reg)
- {
- uint8_t chr = 0;
- Wire.beginTransmission(0x48); //device address
- Wire.write(reg); // read register
- Wire.endTransmission(false);
- Wire.requestFrom(0x48, 1, true); //address, quantity, stop
- if(Wire.available()){
- chr = Wire.read(); //data
- }
- return chr ;
- }
-
- uint8_t I2C_Write(uint8_t reg, uint8_t data)
- {
- Wire.beginTransmission(0x48); //device address
- Wire.write(reg); // REG
- Wire.write(data); // DATA
- Wire.endTransmission(true); // generate stop condition // STOP
-
- }
執行結果