协议介绍:
I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,用于连接在数字系统中的多个集成电路。它是由飞利浦公司(Philips)于上世纪80年代开发的,并在现在被广泛应用于各种电子设备和嵌入式系统中。
I2C协议使用两根线进行通信:SDA(Serial Data Line)和SCL(Serial Clock Line)。SDA是用于传输数据的双向线路,而SCL是一个时钟线路,用于同步数据的传输。这两根线路都需要外部上拉电阻来恢复默认高电平状态。
在I2C通信中,每个设备都有唯一的地址,可以作为主设备(Master)或从设备(Slave)进行工作。主设备负责发起通信并控制总线的操作,而从设备则根据主设备的命令进行响应。
数据传输过程中,主设备发起开始信号(Start)和停止信号(Stop),用于标识通信的开始和结束。开始信号指示着总线空闲状态结束,而停止信号表示着通信的终点。在通信过程中,主设备通过发送地址和数据来与从设备进行通信。从设备根据地址来判断是否需要响应,并通过数据线回复数据。
I2C协议支持不同的数据传输速率,最常见的是标准模式(100 kHz)和快速模式(400 kHz)。此外,还有更高速的Fast Mode Plus(1 MHz)和超高速模式(3.4 MHz)。
I2C协议仅使用两根线路、支持多主设备、可通过总线电源供电等。它被广泛应用于各种应用领域,包括传感器、存储器、显示屏、温度计、实时时钟等。
重要性:
对于找工作的帮助:
I2C协议应用框图如下:
1)只需要两条总线线路:一条串行数据线(SDA)和一条串行时钟线(SCL)。
2)连接到总线上的每个设备都可通过唯一地址进行软件寻址,并且在任何时候都存在简单的主/从关系;主设备可作为主发送器或主接收器运行
3)这是一条真正的多主总线,包括碰撞检测和仲裁,以防止两个或多个主设备同时启动数据传输时出现数据损坏。
4)串行、面向 8 位的双向数据传输,在标准模式下传输速率最高可达 100 kbit/s,在标准模式下传输速率最高可达 400 kbit/s。在标准模式下最高可达 100 kbit/s,在快速模式下最高可达 400 kbit/s,在高速模式下最高可达 3.4 Mbit/s。
5)串行、8 位定向、单向数据传输,在超高速模式下最高可达 5 Mbit/s
6)片上滤波可拒绝总线数据线上的尖峰,以保持数据的完整性。
7)可连接到同一总线的集成电路数量仅受最大总线电容(默认是400pF)的限制。在某些情况下,可能允许更大的电容。
I2C协议经典应用框图
I2C总线负载电容
总线负载电容推荐值不超过400pf,超过Spec时需要设置Buffer进行隔离。
I2C协议的数据格式包括以下几个部分:开始信号、设备地址、寄存器地址(可选)、数据、应答位和停止信号。通过这种格式,主设备和从设备能够按照约定的规则进行数据的传输和解析,实现可靠的通信。
I2C协议使用了一种特定的数据格式来进行通信。在传输过程中,数据被分为字节(Byte)单位,并按照特定的格式进行传输和解析。
每一个字节都有8位(Bit),通信的起始由主设备(Master)发出开始信号(Start)来表示。接下来的第一个字节是设备地址(Address),它用于指示要通信的从设备(Slave)的身份。地址由7位组成,最高位用于表示读取(1)或写入(0)操作。
在设备地址之后,可能会跟着一个可选的寄存器地址(Register
Address)。这个寄存器地址用于指定从设备内部的特定寄存器,以便进行读取或写入操作。寄存器地址也是一个字节大小。
在寄存器地址之后,可以发送多个字节的数据。这些数据可以是要写入寄存器的值,或者是从设备读取到的数据。在写入操作中,主设备将数据逐个字节地发送给从设备。而在读取操作中,主设备发送读取请求后,从设备会按照顺序将数据逐个字节地回复给主设备。
在每个字节的传输之间,都会有一个应答位(ACK)来确认数据的接收情况。当从设备成功接收到一个字节时,它会发送一个应答位来通知主设备继续发送下一个字节。而如果从设备未能成功接收到一个字节,它会发送一个非应答位(NACK)来终止数据传输。
在通信的末尾,主设备会发送停止信号(Stop),表示通信结束。
1. 数据有效性:
SDA线上的数据在时钟的HIGH周期内必须稳定。当SCL线上的时钟信号为LOW时,数据线的LOW状态才能改变。每个数据位对应一个时钟脉冲。
2. 起始和终止条件:
起始条件:当 SCL 为高电平时,SDA 由高电平转换为低电平。
终止条件:当 SCL 为高电平时,SDA 从低电平转换为高电平。
3. 数据格式:
SDA 传输的字节长度为 8 位。每次传输的字节数不受限制。每个字节后必须有一个应答位,数据传送时,先传送最高位(MSB)。
如果从机要完成一些其他功能后,例如一个内部中断服务程序,才能接收或发送下一个完整的数据字节。可以使时钟线 SCL 保持低电平迫使主机进入等待状态。 当从机准备好接收下一个数据字节并释放时钟线 SCL 后 数据传输继续
4. 应答位:
应答位的信号定义如下:主机在第9位传输期间,在SCL时钟脉冲期间释放 SDA 线(拉高SDA)。以便从机能将 SDA 线拉至低电平,并在该时钟脉冲期间保持稳定的低电平。
通常从机在接收到的每个字节后,除了用 CBUS 地址开头的报文,必须产生一个应答位。当从机不能响应从机地址时,从机必须使数据线保持高电平。主机之后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。
产生非应答的几种情况:
5. 时钟同步和仲裁
时钟同步:
多个主机可以同时开始在空闲的I2C总线上传输数据,因此必须有一种方法来决定由哪个主机控制总线并完成传输。这是通过时钟同步和仲裁实现的,单主角的系统中不需要时钟同步和仲裁。
时钟同步通过线与连接 I2C 接口到 SCL 线来执行,这就是说 SCL 线的高到低切换会开始数低电平周期,而一旦器件的时钟变低电平,它会使 SCL 线保持这种状态直到时钟的高电平。
同步 SCL 时钟的低电平周期由时钟低电平周期最长的主机决定,而其高电平周期则由时钟高电平周期最短的主机决定。(SCL是线与连接的)
仲裁:
只有当总线空闲时,主机才能开始传输。两个主机可在启动条件的最短保持时间 (tHD;STA) 内产生一个启动条件,从而在总线上产生一个有效的启动条件。这时需要进行仲裁,以确定由哪个主机完成传输。
由于SDA也是线与连接的,所有主机会在SCL拉高时将自己产生的SDA信号与总线SDA信号进行对比,当检测到和总线不一致时,则退出仲裁,直到SDA总线上信号和该主机一致。
整个仲裁过程不会遗漏发送的SDA信息,仲裁时间的长短和SDA对应的信息正确与否相关,即仲裁所需时间是不确定的。也没有额外的仲裁单元,每个主机内部都会检查SDA总线和自己发送的SDA对应位的信息。
难度:⭐⭐
推荐度:⭐⭐⭐
推荐天数:1~3天
要求的软件和EDA环境:
(1)操作系统要求:
Windows
(2)EDA 软件要求:
iverilog & gtkwave
项目学习目的:
(1)熟练掌握I2C协议;
(2)熟悉 Verilog HDL仿真;
(3)熟练掌握EEPROM;
(4)掌握iverilog和gtkwave联合仿真的流程和脚本。
整体项目包含两部分,一个是I2C协议的控制模块,另一个是EEPROM模块(M24LC64),在SDA端口上配置一个上拉电阻。
项目工程文件如下:
1、rtl和tb文件夹分别为设计文件和仿真文件;
2、srcfile.txt 是仿真文件及对应的路径;
3、flow.bat是仿真脚本,进终端运行这个就可以dump出波形并调用gtkwave查看;
4、clr.bat是清除脚本,用于删除仿真的波形数据。
项目代码:
本项目采用的是iverilog和gtkwave完成前仿,利用bat脚本完成,首先将设计文件和仿真tb文件的路径和名称保存至txt文件中,文件内容如下:
文件名为“srcfile.txt”
bat脚本:
### clr.bat begin ###
echo "clean the simulation files "
del wave
del wave.lxt
echo "Finished"
### clr.bat end ###
#### flow.bat begin ####
echo "Compile Start"
iverilog -o wave -c srcfile.txt
echo "Compilation completed"
vvp -n wave -lxt2
echo "Generating Waveform Files"
echo "Open Waveform File"
gtkwave wave.lxt
#### flow.bat end ####
tb文件加入dump波形的代码段:
iverilog和gtkwave仿真时需要在tb文件中加入以下代码:
initial begin
$dumpfile("wave.lxt");
$dumpvars(0, i2c_control_tb); // dump所有信号波形
end
仿真流程:
1、cd到对应的项目文件夹中,查看脚本和对应文件
2、执行flow.bat脚本
3、脚本结果和波形查看
4、gtkwave查看对应波形:
EEPROM读写数据正常,I2C驱动正常。
5、附上芯片手册中的读写波形:
支持Byte写和随机读
I2C协议是一种串行通信协议,用于在集成电路之间进行数据传输。它使用两根线路,即时钟线(SCL)和数据线(SDA),通过主从模式进行通信。关于I2C协议读写EEPROM的例程总结: