IIC总线若干基本概念
总线信号:
SDA:串行数据线
SCL:串行数据时钟
总线空闲状态:
SDA:高电平
SCL:高电平
Uart协议:开始一个字节的传输时
IIC协议起始位
SCL为高电平时,SDA出现下降沿,产生一个起始位。
IIC协议结束位
SCL为高电平时,SDA出现上升沿,产生一个结束位。
IIC读写单bit时序
10100010
IIC主机对IIC从机写入数据时,SDA上的每一位数据在SCL的高电平期间被写入从机中。对于主机,在SCL的低电平期间改变要写入的数据。400k 2.5us/2 1.25us
IIC主机从IIC从机中读出数据时,从机在SCL的低电平期间将数据输出到SDA总线上,在SCL的高电平期间保持数据稳定。对于主机,在SCL的高电平期间将SDA线上的数据读取并存储。
数据接收方对数据发送方的响应
每当一个字节的数据或命令传输完成时,都会有一位的应答位。需要应答位时,数据发出方将SDA总线设置为3态输入,由于IIC总线上都有上拉电阻,因此此时总线默认为高电平,若数据接收方正确接收到数据,则数据接收方将SDA总线拉低,以示正确应答。
例如当IIC主机对IIC从机写入数据或命令时,每个字节都需要从机产生应答信号以告诉主机数据或命令成功被写入。所以,当IIC主机将8位的数据或命令传出后,会将SDA信号设置为输入,等待从机应答(等待SDA被从机拉低为低电平),若从机正确应答,表明当前数据或命令传输成功,可以结束或开始下一个命令/数据的传输,否则表明数据/命令写入失败,主机就可以决定是否放弃写入或者重新发起写入。
IIC器件地址
每个IIC器件都有一个器件地址,有的器件地址在出厂时地址就设置好了,用户不可以更改
(ov7670:0x42),有的确定了几位,剩下几位由硬件确定(比如有三位由用户确定,就留有3个控制地址的引脚,最常见的为IIC接口的EEPROM存储器),此类较多;还有的有地址寄存器。
严格讲,主机不是向从机发送地址,而是主机往总线上发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向主机发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。
通常情况下,主从器件的角色是确定的,也就是说从机一直工作在从机模式。不同的器件定义地址的方式是不同的,有的是软件定义,有的是硬件定义。例如某些单片机的IIC接口作为从机时,其器件地址是可以通过软件修改从机地址寄存器确定的。而对于一些其他器件,如CMOS图像传感器、EEPROM存储器,其器件地址在出厂时就已经设定好了,具体值可以在对应的数据手册中查到。
对于AT24C64这样一颗EEPROM器件,其器件地址为1010加3位的片选信号。3位片选信号由硬件连接决定。例如SOIC封装的该芯片pin1、pin2、pin3为片选地址。当硬件电路上分别将这三个pin连接到GND或VCC时,就实现了设置不通的片选地址。
IIC协议在进行数据传输时,主机需要首先向总线上发出控制命令,其中,控制命令就包含了从机地址/片选信号+读写控制。然后等待从机响应。以下为IIC控制命令传输的数据格式。
IIC传输时,按照从高到低的位序进行传输。控制字节的最低位为读写控制位,当该位为0时表示主机对从机进行写操作,当该位为1时表示主机对从机进行读操作。例如,当需要对片选地址为100的AT24LC64发起写操作,则控制字节应该为CtrlCode = 1010_100_0。若要读,则控制字节应该为CtrlCode = 1010_100_1。
IIC存储器地址
每个支持IIC协议的器件,内部总会有一些可供读写的寄存器或存储器,例如,对于我们用到的EEPROM存储器,内部就是顺序编址的一系列存储单元。对于我们常接触的CMOS摄像头如OV7670(OV7670的该接口叫SCCB接口,其实质也是一种特殊的IIC协议,可以直接兼容IIC协议),其内部就是一系列编址的可供读写的寄存器。因此,我们要对一个器件中的存储单元(寄存器和存储器以下简称存储单元)进行读写,就必须要能够指定存储单元的地址。IIC协议设计了有从机存储单元寻址地址段,该地址段为一个字节或两个字节长度,在主机确认收到从机返回的控制字节响应后,由主机发出。地址段长度视不同的器件类型,长度不同,例如同是EEPROM存储器,AT24C04的址段长度为一个字节,而AT24C64的地址段长度为两个字节。具体是一个字节还是两个字节,与器件的存储单元数量有关。
AT24C01地址段:
AT24C64地址段:
IIC单字节写时序
1字节地址段器件单字节写时序
2字节地址段器件单字节写时序
从主机角度看一次写入过程
- 主机设置SDA为输出
- 主机发起起始信号
- 主机传输器件地址字节,其中最低为0,表明为写操作。
- 主机设置SDA为输入三态,读取从机应答信号。
- 读取应答信号成功,传输1字节地址数据
- 主机设置SDA为输入三态,读取从机应答信号。
- 对于两字节地址段器件,传输地址数据低字节,对于1字节地址段器件,传输待写入的数据
- 设置SDA为输入三态,读取从机应答信号。
- 对于两字节地址段器件,传输待写入的数据(2字节地址段器件可选)
- 设置SDA为输入三态,读取从机应答信号(2字节地址段器件可选)。
- 主机产生STOP位,终止传输。
IIC连续写时序(页写时序)
注:IIC连续写时序仅部分器件支持。
2字节地址段器件多字节写时序
从主机角度看一次写入过程
- 主机设置SDA为输出
- 主机发起起始信号
- 主机传输器件地址字节,其中最低为0,表明为写操作。
- 主机设置SDA为输入三态,读取从机应答信号。
- 读取应答信号成功,传输1字节地址数据
- 主机设置SDA为输入三态,读取从机应答信号。
- 对于两字节地址段器件,传输低字节地址数据,对于1字节地址段器件,传输待写入的第一个数据
- 设置SDA为输入三态,读取从机应答信号。
- 写入待写入的第2至第n个数据并读取应答信号。对于AT24Cxx,一次可写入的最大长度为32字节。
- 主机产生STOP位,终止传输。
IIC单字节读时序
1字节地址段器件单节读时序
2字节地址段器件单节读时序
从主机角度看一次读取过程
- 主机设置SDA为输出
- 主机发起起始信号
- 主机传输器件地址字节,其中最低为0,表明为写操作。
- 主机设置SDA为输入三态,读取从机应答信号。
- 读取应答信号成功,传输1字节地址数据
- 主机设置SDA为输入三态,读取从机应答信号。
- 对于两字节地址段器件,传输低字节地址数据,对于1字节地址段器件,无此段数据传输。
- 主机发起起始信号
- 主机传输器件地址字节,其中最低为1,表明为写操作。
- 设置SDA为输入三态,读取从机应答信号。
- 读取SDA总线上的一个字节的数据
- 产生无应答信号(高电平)(无需设置为输出高点片,因为总线会被自动拉高)
- 主机产生STOP位,终止传输。
IIC多字节连续读时序(页读取)
1字节地址段器件多字节读时序
2字节地址段器件多字节读时序
从主机角度看一次读取过程
- 主机设置SDA为输出
- 主机发起起始信号
- 主机传输器件地址字节,其中最低为0,表明为写操作。
- 主机设置SDA为输入三态,读取从机应答信号。
- 读取应答信号成功,传输1字节地址数据
- 主机设置SDA为输入三态,读取从机应答信号。
- 对于两字节地址段器件,传输低字节地址数据,对于1字节地址段器件,无此段数据传输。
- 主机发起起始信号
- 主机传输器件地址字节,其中最低为1,表明为写操作。
- 设置SDA为输入三态,读取从机应答信号。
- 读取SDA总线上的n个字节的数据(对于AT24Cxx,一次读取长度最大为32字节)
- 产生无应答信号(高电平)(无需设置为输出高点片,因为总线会被自动拉高)
主机产生STOP位,终止传输。