您的位置  > 互联网

NXP半导体公司I2C-(集成电路总线)协议层I2C

I2C全称Inter-( Bus),是一家半导体公司(现在的NXP半导体公司)在20世纪80年代初设计的一种简单、双向、两线制的总线标准。 多用于数据量不大、传输距离较短的场合,主机与从机之间的主从通信。 主设备启动总线并生成用于传输数据的时钟。 此时,任何接收数据的设备都被视为从机。

I2C使用两条信号线进行通信:时钟线SCL和数据线SDA。 I2C以SCL为高时将SDA拉低的动作作为起始信号,以SCL为高时将SDA拉为高的动作作为结束信号; 传输数据时,SDA在SCL为低电平时改变数据,在SCL为高电平时保持数据。 每个SCL脉冲的高电平传输1位数据。

2 物理层特性: 3 协议层

I2C协议定义了通信开始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播。

在I2C设备开始通信(传输数据)之前,串行时钟线SCL和串行数据线SDA由于上拉而处于高状态,此时I2C总线处于空闲状态。 如果主机要开始传输数据,只需在SCL为高电平时将SDA线拉低即可产生启动信号。 从机检测到启动信号后,就准备好接收数据。 当数据传输完成后,主机只需产生一个停止信号告诉从机数据传输完成。 当SCL为高电平且SDA从低电平跳变到高电平时产生停止信号。 从机检测到停止信号后,停止接收数据。 I2C整体时序如下图所示。 空闲状态是在启动信号之前,在启动信号之后和停止信号之前的时段是数据传输状态。 主机可以向从机写入数据,也可以读取从机输出的数据。 数据的传输是由双向数据线(SDA)完成的。 停止信号产生后,总线再次空闲。

启动信号后,主机开始发送传输数据; 当串行时钟线SCL为低电平时,SDA允许传输的数据位发生变化(1为高电平,0为低电平),当SCL为高电平状态时,要求SDA保持稳定,相当于在一个时钟周期内传输 1 位数据。 经过8个时钟周期,传输了8位数据,即一个字节。 在第 8 个时钟周期结束时,主机释放 SDA 以允许从机响应。 第9个时钟周期,从机将SDA拉低进行响应; 如果在第9个时钟周期,SCL为高电平,则未检测到SDA。 为低功率,视为无响应,表明数据传输失败。 在第9个时钟周期结束时,从机释放SDA以允许主机继续传输数据。 如果主机发送停止信号,则本次传输结束。 需要注意的是,数据是以8位为单位串行发送的,即一个字节,先发送该字节的最高位。

设备地址(也称为从机地址,SLAVE):每个I2C设备都有一个设备地址。 有些I2C设备的设备地址是固定的,而有些I2C设备的设备地址由固定部分和可编程部分组成。 。 当主机想要向某个设备发送数据时,只需要将接收设备的设备地址发送到总线上即可。 进行数据传输时,主机首先向总线发送起始信号,对应起始位S,然后按位顺序从高到低发送设备地址,通常为7位。 第8位是读写控制位R/W。 该位为0时,表示主机向从机写入。 当为1时,表示主机从从机读取数据,然后收到从机的响应。 对于 ,其传输设备地址格式如下图所示。

发送第一个字节(7位设备地址和一个读写控制位)并收到从机的正确响应后,开始发送字地址(Word)。 一般来说,每一个兼容I2C协议的设备总是具有可读写的内部寄存器或存储器。 对于我们在本实验中使用的存储器,内部有一系列顺序寻址的存储单元。 所以我们在读写设备中的内存单元(包括寄存器)时,首先要指定该内存单元的地址,即字地址,然后再向该地址写入内容。 地址的长度为一或两个字节。 具体长度由设备内部存储单元的数量决定。 当存储单元数量不超过1个字节所能表示的最大数量(2^8=256)时,使用1个字。 段的意思是当超过一个字节可以表示的最大数量时,需要用两个字节来表示。 例如,都是存储器,存储单元容量为2Kbit=(一般bit缩写为b,Byte缩写为B),所有存储单元都可以用一个字节地址来寻址,存储单元容量为64Kb=8KB ,需要13个地址位(2^13=8KB),I2C以字节为单位传输。 ,因此需要两个字节地址来寻址整个内存单元。 图 23.1.5 和图 23.1.6 分别是单字节字地址和双字节字地址器件的地址分布图。 单字节字地址 以存储容量为2Kb 的设备为例。 双字节字地址的设备以存储容量为64Kb的存储器为例。 WA7 是字地址的第 7 位,依此类推。 WA用于区分。 先前设备地址中的 A。

主机发送字地址后,从机响应正确后,将内部存储单元地址指针指向该单元。 如果读写控制位的R/W位为“0”,即为写命令,则从机处于接收数据状态。 此时主机开始写入数据。 写入数据分为单次写入(对于 ,称为字节写入)和连续写入(对于 ,称为页写入),那么两者有什么区别呢? 对比图23.1.7和图23.1.8可以看出,两者的区别在于发送完一个字节数据后是发送结束信号还是继续发送下一个字节数据。 如果发送结束信号,则称为单次写入,如果继续发送下一个字节的数据,则称为连续写入。 图23.1.7是单次写(字节写)时序。 对于字地址为单字节的I2C设备,字地址发送后(对应图23.1.7中字地址的高位),从机响应后,即可串行发送8bit数据。 图23.1.8是顺序写入(页写入)时序。 需要注意的是,对于页写入来说,超过一页单位容量的数据是无法发送的,页的单位容量是。 当写入页的最后一个单元时,地址指针指向页的开头。 如果再次写入数据,该页的起始数据将被覆盖。

如果读写控制位R/W位为“1”,即为读命令,则主机处于接收数据状态,从机从地址单元输出数据。 读取数据有三种方式:当前地址读取、随机读取和连续读取。 当前地址读取是指在读或写操作之后发起读操作。 由于I2C设备的内部地址指针在读或写操作后自动加1,因此当前地址读取可以读取下一个字地址的数据。 也就是说,当最后一次读或写操作的单元地址为02时,当前地址读取的内容为地址03处的单元数据。时序图如图23.1.9所示。

由于当前地址读取极不方便读取任意地址单元的数据,因此采用随机读取的方式。 随机读取的时机有点奇怪。 参见图 23.1.10。 发送设备地址和字地址后,再次发送起始点。 信号和设备地址,第一次发送设备地址时,后续读写控制位为“0”,为写命令。 第二次发送设备地址时,后续读写控制位为“1”,为读命令。 。 为什么会有这么奇怪的操作呢? 这是因为我们需要让slave中的内存单元地址指针指向我们想要读取的内存单元地址,所以我们首先发送一个Dummy Write,也就是一个虚拟写操作。 之所以称为虚拟写,是因为我们并不真正需要写入数据,而是通过这种虚拟写操作,使地址指针指向虚拟写操作中字地址的位置。 从机响应后,可以通过读取当前地址来读取数据,如图23.1.10所示,随机地址读取是不发送数据的单个写操作和当前地址读取操作的组合。

对于连续读,对应的是当前地址读和随机读,一次读一个字节。 它将当前地址读取或随机读取的主机无响应变为有响应,即继续读取数据,图23.1 .11是当前地址读取下的连续读取。

4 波形图

Pro FPGA开发指南V1.2.pdf

62.8M

·

百度云盘

.pdf

549K

·

百度云盘

.pdf

128.3K

·

百度云盘

.pdf

751K

·

百度云盘

.pdf

869.5K

·

百度云盘