Linux I2C协议
I2C总线协议是NXP公司设计的,I2C使用两条线在主控制器和从机之间进行数据通信。一条是SCL(串行时钟线),另外一条是SDA(串行数据线),这两条数据线需要接上拉电阻(4.7K),空闲状态的时候处于高电平。I2C总线标准模式下速度可以达到100Kb/S, 快速模式下可以达到400Kb/S。
起始位
SCL高电平且SDA下降沿则是起始位。
停止位
SCL高电平且SDA上升沿则是停止位。
应答信号
主机发送完8位数据之后会在时钟周期内等待从机应该,也就是将SDA信号拉低。
I2C写时序
- 主机发送开始信号
- 发送I2C设备地址,发送8bit数据,高7位是从机地址,最后1位是读写位(0表示写,1表示读)
- 等待从机ACK应答
- 重新发送开始信号
- 发送要写入数据的寄存器地址
- 等待从机ACK应答
- 发送要写入寄存器的数据
- 等待从机ACK应答
- 主机发送停止信号
I2C读时序
- 主机发送开始信号
- 发送设备地址写信号
- 等待从机ACK应答
- 重新发送开始信号
- 发送要读取的寄存器地址
- 等待从机ACK应答
- 重新发送开始信号
- 重新发送要读取的从设备地址以及读信号
- 等待从机ACK应答
- 从I2C器件读取数据
- 主机发出NO ACK信号表示读取完成,不需要从机再发送ACK信号
- 主机发送停止信号