# I²C通訊協定 ## 通訊 通訊最常見的三種模式 : UART/SPI/I²C | I²C | SPI | UART | | -------- | -------- | -------- | | SCL/SDA| SCLK/MOSI/MISO | Tx/Rx | * I²C只使用兩條雙向汲極開路(Open Drain)線: 1. 傳輸資料的串列資料線(SDA) 2. 啟動或停止傳輸以及傳送時鐘序列的串列時脈(SCL)線 ![](https://hackmd.io/_uploads/B1pnuDCn3.png) (圖片來自網路) * I²C 一定要配置上拉電阻,可以在程式內宣告,或者使用電路板接出上拉電阻的電路圖。 (以下是上拉電阻示意圖) ```c= GPIO_PullResistorConfig(HT_GPIOB, GPIO_PIN_0, GPIO_PR_UP); GPIO_PullResistorConfig(HT_GPIOB, GPIO_PIN_1, GPIO_PR_UP); ``` * I²C的傳輸速率模式: 1. 標準模式(100 kbit/s) 2. 低速模式(10 kbit/s) 3. 快速模式(400 kbit/s) 4. 快速+模式(1 Mbit/s) 5. 高速模式(3.4 Mbit/s) 6. 超高速模式(5 Mbit/s)。 ## 開始與結束 ![](https://hackmd.io/_uploads/H1vreDkph.png) 起始條件:clock在high時data出現負緣(此時不穩定) 結束條件:clock在high時data出現正緣 ## 資料傳輸 1. master有控制權,只有master可以發送時脈(clock) 2. 第一筆資料由Master端傳輸,且第一次通訊會決定是否繼續由主端傳送資料 3. 第8個bit是write(0)還是read(1)決定。 4. 如果是0則繼續由主端向從端發送資料。若為1,則下一次傳輸由從端向主端發送 ![](https://hackmd.io/_uploads/r13NhU162.png) (圖源自於網路) ![](https://hackmd.io/_uploads/rkC3xvJa3.png) (圖源自於網路) 如果第8位元是write,則繼續由主端傳輸給從端直到結束為止或有下一個指令為止。 5. 資料一次只能傳輸8位元(像加速度器值有16位元,就需要拆成2個兩個暫存器儲存再合併) 6. 第9個bit為acknowledge(ACK)訊號,由接收端向發送端回應 ![](https://hackmd.io/_uploads/ryvYkwJTn.png) (圖源自於網路) ## 讀取與書寫 ![](https://hackmd.io/_uploads/SkMKbDJ63.png) 1. 當SCL為高電位時(穩態),才開啟read模式 2. 當SCL為低電位時,SDA此時才可以交換接收模式(Rx)或傳輸模式(Tx) [艾鍗學院](https://www.youtube.com/watch?v=D29NePyvxNI) [更詳細的I2C](https://ithelp.ithome.com.tw/articles/10278308)