I2C协议:基础知识指南
文章目录
概述
IIC(I2C)是一个同步半双工串行通信协议,使用3根线即可连接
名称 | 功能 |
---|---|
SCL | 时钟线 |
SDA | 数据线 |
GND | 接地 |
设计用于低速设备的连接,速度不及SPI,快于串口通信,接线简单。
有主机和从机之分,主机产生时钟信号,地址信号,从机根据地址选择是否收发数据,如果主机发送的地址与从机相同,则从机开始接受或发送数据,占用地址线。
电气连接如图
时序
不同的设备的具体发送的数据不同,但总体上主设备是先发送地址,再发送或接受数据
注意:iic是同步通信方式,允许不定长度的数据,也就是每一对起始信号和终止信号中间可以传输多个8bit数据
发送地址和数据的流程为
- 发送起始信号
- 发送地址
- 接受校验信号
- 发送或接受数据8bit
- 接受校验信号
- 重复
- 发送结束信号
SDA和SCL的默认电平为高电平(空闲状态)
起始信号
在空闲状态时(SCL,SDA为高电平),SDA产生下降沿为起始信号
注意:SDA如果要回到高电平,需要在SCL为低电平时动作,避免误触停止信号
如果SDA为低电平时,将其置高时,SDA高电平状态需要存留一段时间,
SDA与SCL下降沿之间也需要一段延迟
具体时间与外设有关
思路
- 拉高SDA和SCL,顺序无所谓,确保进入空闲状态
- 拉低SDA,产生下降沿,发送起始信号
- 拉低SCL,确保数据传输不好误触(也可以放到数据传输的最前)
停止信号
在SCL为高电平时,SDA产生上升沿信号,之后SCL,SDA全为高,进入空闲状态
注意,SCL与SDA的上升沿之间需要一定时间间隔,SDA的高电平需要持续一段时间
思路:
- 拉低SDA(默认从发送数据后SCL为低电平)
- 拉高SCL
- 拉高SDA,产生终止信号,回到空闲状态
数据信号
对于数据来说,只有SCL为低电平时才允许SDA发送电平变化
即SCL为高电平时SDA保持稳定,为高电平或低电平
就像这样,只有在SCL为低电平时才允许SDA变化
思路:
- 拉低SCL
- 改变SDA为自己的数据(发)
- 拉高SCl
- 读取SDA的电平(收)
- 重复到8次
应答信号
当数据传输完成后,需要产生一个校验信号,这是第9个时钟周期,应答信号由接受机产生
这个信号除了数据来源不同以外,与数据信号完全相同
SDA为低电平为应答,高电平为非应答
思路
- 拉低SDA(收)(默认从数据出来是低电平)
- 拉高SCL
- 读取SDA(发)
- 拉低SCL
总时序
读数据和写数据只有方向上的区别
注意:时钟信号是由主设备产生的,数据信号可以由主从设备操作
主设备产生时钟信号时不要忘记应答信号的时钟
接收时不要忘记应答信号
IIC的地址
地址由主机发送
从高位到低位发送7bit地址,最后一位是选择发送或接受数据
0是主机发送数据,1是主机接受数据
I2C读写寄存器
写寄存器
- 起始信号(开始I2C通信)
- 发送从设备地址(检测应答)
- 发送寄存器地址(检测应答)
- 发送数据直到完成(每次均检测应答)
- 发送结束信号
读寄存器
- 起始信号(开始I2C通信)
- 发送从设备地址(检测应答)
- 发送起始信号(表示发送的是寄存器地址)
- 发送寄存器地址(检测应答)
- 读取数据(发送应答信号)
- **读取到最后一个字节时(**发送非应答信号)
- 结束信号