# 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)) ---