i2c協議解析
阿新 • • 發佈:2018-12-16
i2c總線上有兩根線,一根是資料線SDA,一根是時鐘線SCL
在空閒的時候,他們都是高電平
I2C傳輸資料快速且簡便,速率最高可以達到3.4M/s
i2C速率分為S(標準, 100kb/s)、F(快速, 400kb/s)和H(高速, 3.4Mb/s)模式。
基本結構如下圖所示:
1、I2c一個時鐘週期裡面傳輸一個位,從高位到低位,一般8位為一個數據
起始的時候:SDA由高變低、SCL為高電平
停止的時候:SDA由低變高、SCL為高電平
起始和結束訊號都是由主裝置產生的
/* START: High -> Low on SDA while SCL is High */ static void i2c_gpio_send_start(struct gpio_desc *scl, struct gpio_desc *sda, int delay) { udelay(delay); i2c_gpio_sda_set(sda, 1); udelay(delay); i2c_gpio_scl_set(scl, 1); udelay(delay); i2c_gpio_sda_set(sda, 0); udelay(delay); }
中間設定了一定時間的延遲
/* STOP: Low -> High on SDA while SCL is High */ static void i2c_gpio_send_stop(struct gpio_desc *scl, struct gpio_desc *sda, int delay) { i2c_gpio_scl_set(scl, 0); udelay(delay); i2c_gpio_sda_set(sda, 0); udelay(delay); i2c_gpio_scl_set(scl, 1); udelay(delay); i2c_gpio_sda_set(sda, 1); udelay(delay); }
scl是先低再高,他也不是一直保持低電平
2、bit是位 byte是位元組
傳輸結束從裝置拉低SDA,返回主裝置一個應答位,當ACK訊號為"0"時,說明接收成功;為"1"時,說明接收失敗
3、SCL開始的0~6表示的是從裝置的地址、7方向位(讀1或者是寫0)8表示應答位
0~7表示有效資料位
下面是關於讀和寫