I2C串口协议详解
Inter-Integrated Circuit(内置集成电路),是一种通用的总线协议。它是由Philips(飞利浦)公司,现NXP(恩智浦)半导体开发的一种简单的双向两线制总线协议标准。
I2C 总线在物理连接分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。
I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信;
I2C可以工作在以下5种不同的速率模式,不同的器件可能支持不同的速率
- 标准模式(Standard): 100kbps
- 快速模式(Fast): 400kbps
- 高速模式(Fast-Plus): 1Mbps
- 超快模式(Fast-Speed):3.4Mbps
- 超快模式(Ultra-Fast):5Mbps(单向传播)
其中超快模式是单向数据传输,通常用于LED、LCD等不需要应答的器件,和正常的I2C操作时序类似,但是只进行写数据,不需要考虑ACK应答信号。
I2C最基本的四种信号
起始信号
I2C协议规定,SCL是高电平时,SDA由高到低变化,这种信号是起始信号
停止信号
I2C协议规定,SCL是高电平时,SDA由低到高变化,这种信号是停止信号
应答信号
应答信号出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机,由于上拉电阻的作用,此时总线为高电平,如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应
非应答信号
当第9个SCL时钟周期时,SDA保持高电平,表示非应答信号。
非应答信号可能是主机产生也可能是从机产生,产生非应答信号的情况主要有以下几种:
I2C总线上没有主机所指定地址的从机设备
从机正在执行一些操作,处于忙状态,还没有准备好与主机通讯
主机发送的一些控制命令,从机不支持
主机接收从机数据时,主机产生非应答信号,通知从机数据传输结束,不要再发数据了
数据有效性
I2C协议对数据的采样发生在SCL高电平期间,除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,在SCL低电平时才可以进行变化。
总线空闲状态
SCL和SDA都保持着高电平
I2C主设备指定从设备地址传输数据
I2C总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输建立在地址的基础上
主设备在传输有效数据前要先指定从设备地址,大多数从设备地址是7位,协议规定再给地址添加一个最低位来表示接下来数据传输的方向:
0表示主设备向从设备写数据;
1表示主设备向从设备读数据;
向指定对象发送数据的格式:
主从设备读写操作
1.主设备往从设备写数据
2.主设备从从设备中读数据
3.主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;
或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据;
写数据时序图
读时序图
注意,读数据时有两次起始信号