---
# System prepended metadata

title: Arduino講義：Serial Communication (I2C)

---

# Arduino講義：Serial Communication (I2C)
---

<!-- > **重點 or 縮寫** 請標**黑粗** 且 英文記得空格ㄚㄚㄚㄚ -->
<!-- > -->
<!-- > [name=YuanHaoHo][color=#c8ff05] -->

## Introduction of I2C
* I2C bus 為 Inter-Integrated Circuit Bus 的縮寫，中文叫做積體電路匯流排，其功用為提供 IC 之間的連接與通訊。
* 目的:減少MCU與周邊晶片之間的腳位數
* 只有兩條訊號線，<font color="red">SCL(Serial CLock Line) 負責傳時脈，SDA(Serial Data line)負責傳資料</font>。
*  **I2C** : <font color="red"> 半雙工、串列、同步</font>
* 以匯流排型介接允許有多個master以及slave。

![](https://i.imgur.com/jOQudK1.png)
* 由上圖可知，所有I2C裝置皆並接(Wired-AND)在SCL及SDA兩條線路上
* 須接<font color="red">上拉電阻(Rp)</font>，將浮接狀態( float )轉變為邏輯高準位( High )狀態。

## I2C Bus協定
* 閒置( idle )時兩者皆為高電位。
![](https://i.imgur.com/X4RwG5W.gif)
* START condition：<font color="red">SCL為 HIGH時，SDA發生下緣</font>

* 先傳地址( slave address，決定跟哪個 slave 溝通)，再傳資料。地址有 7bit跟 10bit兩種。 
  * 7bit：最大可以有 128個 slave (但實際上有16個系統擴充位址是保留的)。
  * 10bit：最大可以有 1024個 slave 。(但很少見，不是所有使用 I2C 的裝置都支援 10bit mode)。
* 地址：由於地址為 7bit，因此在傳第一個 byte的時候，前 7bit(MSB 為 address，最後的 bit 為 R/W bit，指定要"讀"或"寫"資料(0：write，1：Read)。
 * 只在 <font color="red">SCL 為 HIGH 時，才會對 SDA 取樣。 SCL 為 LOW 時，不會取樣，但可改變資料</font>。 
* STOP condition：<font color="red">SCL為 HIGH時，SDA發生上緣</font> 

## ACK/NACK機制
* 發送端在每組(8bits)訊號送出後，需讀去接收端所回應的一個ACK bit(Acknowledge bit)
<font color="red">(注意:發送端不一定是master，ex:讀取資料時，發送端為slave)</font>

## 實際傳輸的狀況
* 寫入：
![](https://i.imgur.com/ThlOXjN.gif)
    * R/W為0時，代表 slave 端要讀取master端資料，此時 slave 會發出一個 ==acknowledge bit==(就是由 slave 把 SDA 拉低)，讓 master 確認 slave 是否有收到資料。
* 讀取：
![](https://i.imgur.com/PRWtSDN.gif)
    * R/W 為1時，代表 master 端要讀取 slave 端資料，此時 master 為 Receiver，slave 為 transmiter，因此 acknowledge bit 會是由 master 進行發送。
:::info
note：傳地址後的 acknowledge bit 必為 slave 傳送給 master；傳送 Data 後的 acknowledge bit 則須視前面 R/W 的值而定。
::: 

* 當 master 讀到 ACK 回應, 即可以繼續傳輸下一個 Byte。
* 當 master 讀到 NACK 回應, 意思是 **slave 無回應**，此時 master 應送出 (結束) 訊號放棄該命令。
* 參考資料：
    * [資料來源1](http://i2c.info/i2c-bus-specification)
    * [資料來源2](http://magicjackting.pixnet.net/blog/post/173061691-i2c-bus-%E7%B0%A1%E4%BB%8B-(inter-integrated-circuit-b))
---