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表示有效数据位
下面是关于读和写