1. 程式人生 > >i2c協議解析

i2c協議解析

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表示有效資料位

下面是關於讀和寫