没有合适的资源?快使用搜索试试~ 我知道了~
I2C 总线控制器及读写 EEPROM实验内容,适合FPGA初学者
需积分: 5 0 下载量 2 浏览量
2024-05-16
07:38:20
上传
评论
收藏 2.97MB DOC 举报
温馨提示
试读
23页
I2C(Inter-Integrated Circuit)总线是由Philips公司开发的一种简单、双向二线制同步串行总线,它只需要两根线(SDA数据线和SCL时钟线)即可在连接于总线上的器件之间传送信息。EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种常见的非易失性存储器,它可以通过I2C总线进行读写操作。 II2C 总线具备广泛的用途,比如寄存器的配置,EEPROM 的使用,更重要的是 I2C 总线上可以挂载非常多的外设。 对于一些低速器件的访问非常节省 IO 资源,由于是标准的总线接口,使用起来非常方便。
资源推荐
资源详情
资源评论
I2C 总线控制器及读写 EEPROM
软件版本:VIVADO2019.2
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
1 概述
我们知道 I2C 总线具备广泛的用途,比如寄存器的配置,EEPROM 的使用,更重要的是 I2C
总线上可以挂载非常多的外设。 对于一些低速器件的访问非常节省 IO 资源,由于是标准
的总线接口,使用起来非常方便。I2C 总线是 OC 开路,支持双向传输,所以总线上需要
上拉电阻,如下图。
2 I2C 总线协议
由于本文讲解的 I2C 是基于 ZYNQ 的 I2C 控制器,实际上可以不需要非常清楚 I2C 的详
细时序,但是作为初学者,如果第一次学习 I2C 总线的,还是有必要学习下。
I2C 协议把传输的消息分为两种类型的帧:
一个地址帧 :用于 master 指明消息发往哪个 slave;
一个或多个数据帧: 由 master 发往 slave 的数据(或由 slave 发往 master),每一帧是 8-bit
的数据。
注:协议要求每次放到 SDA 上的字节长度必须为 8 位,并且每个字节后须跟一个 ACK 位,
在下面会讲到。
数据在 SCL 处于低电平时放到 SDA 上,并在 SCL 变为高电平后进行采样。读写数据和
SCL 上升沿之间的时间间隔是由总线上的设备自己定义的,不同芯片可能有差异。
I2C 数据传输的时序图如下:
1、开始条件(start condition):
为了标识传输正式启动,master 设备会将 SCL 置为高电平(当总线空闲时,SDA 和 SCL
都处于高电平状态),然后将 SDA 拉低,这样,所有 slave 设备就会知道传输即将开始。
如果两个 master 设备在同一时刻都希望获得总线的所有权,那么谁先将 SDA 拉低,谁就
赢得了总线的控制权。在整个通信期间,可以存在多个 start 来开启每一次新的通信序列
(communication sequence),而无需先放弃总线的控制权。
2、地址帧(address frame):
地址帧总是在一次通信的最开始出现。一个 7-bit 的地址是从最高位(MSB)开始发送的,
这个地址后面会紧跟 1-bit 的操作符,1 表示读操作,0 表示写操作。
3、应答 AC K/NACK
接下来的一个 bit 是 NACK/ACK,当这个帧中前面 8bits 发送完后,接收端的设备获得 SDA
控制权,此时接收设备应该在第 9 个时钟脉冲之前回复一个 ACK(将 SDA 拉低)以表示
接收正常,如果接收设备没有将 SDA 拉低,则说明接收设备可能没有收到数据(如寻址的
设备不存在或设备忙)或无法解析收到的消息,如果是这样,则由 master 来决定如何处理
(stop 或 repeated start condition)。
4、数据帧(data frames):
在地址帧发送之后,就可以开始传输数据了。Master 继续产生时钟脉冲,而数据则由 master
(写操作)或 slave(读操作)放到 SDA 上。每个数据帧 8bits,数据帧的数量可以是任意
的,直到产生停止条件。每一帧数据传输(即每 8-bit)之后,接收方就需要回复一个 ACK
或 NACK(写数据时由 slave 发送 ACK,读数据时由 master 发送 ACK。
当 master 知道自己读完最后一个 byte 数据时,可发送 NACK 然后接 stop condition)。
5、停止条件(stop condition):
当所有数据都发送完成时,master 将产生一个停止条件。停止条件定义为:在 SDA 置于低
电平时,将 SCL 拉高并保持高电平,然后将 SDA 拉高。
注意,在正常传输数据过程中,当 SCL 处于高电平时,SDA 上的值不应该变化,防止意
外产生一个停止条件。
6、重复开始条件(repeated start condition):
有时 master 需要在一次通信中进行多次消息交换(例如与不同的 slave 传输消息,或切换
读写操作),并且期间不希望被其他 master 干扰,这时可以使用“重复开始条件” —— 在
一次通信中,master 可以产生多次 start condition,来完成多次消息交换,最后再产生一个 stop
condition 结束整个通信过程。由于期间没有 stop condition,因此 master 一直占用总线,其
他 master 无法切入。
为了产生一个重复的开始条件,SDA 在 SCL 低电平时拉高,然后 SCL 拉高。接着 master
就可以产生一个开始条件继续新的消息传输(按照正常的 7-bit/10-bit 地址传输时序)。重
复开始条件的传输时序如下图所示:
7、时钟拉伸(clock stretching)(了解即可):
有时候,低速 slave 可能由于上一个请求还没处理完,尚无法继续接收 master 的后续请求,
即 master 的数据传输速率超过了 slave 的处理能力。这种情况下,slave 可以进行时钟拉伸
来要求 master 暂停传输数据 —— 通常时钟都是由 master 提供的,slave 只是在 SDA 上
放数据或读数据。而时钟拉伸则是 slave 在 master 释放 SCL 后,将 SCL 主动拉低并保持,
此时要求 master 停止在 SCL 上产生脉冲以及在 SDA 上发送数据,直到 slave 释放 SCL
(SCL 为高电平)。之后,master 便可以继续正常的数据传输了。可见时钟拉伸实际上是
利用了时钟同步的机制(见下文),只是时钟由 slave 产生。
如果系统中存在这种低速 slave 并且 slave 实现了 clock stretching,则 master 必须实现为
能够处理这种情况,实际上大部分 slave 设备中不包含 SCL 驱动器的,因此无法拉伸时钟。
所以更完整的 I2C 数据传输时序图为:
8、10-bit 地址空间(了解即可):
上面讲到 I2C 支持 10-bit 的设备地址,此时的时序如下图所示:
在 10-bit 地址的 I2C 系统中,需要两个帧来传输 slave 的地址。第一个帧的前 5 个 bit 固
定为 b11110,后接 slave 地址的高 2 位,第 8 位仍然是 R/W 位,接着是一个 ACK 位,
由于系统中可能有多个 10-bit slave 设备地址的高 2bit 相同,因此这个 ACK 可能由多有
slave 设备设置。第二个帧紧接着第一帧发送,包含 slave 地址的低 8 位(7:0),接着该地
址的 slave 回复一个 ACK(或 NACK)。
注意,10-bit 地址的设备和 7-bit 地址的设备在一个系统中是可以并存的,因为 7-bit 地址
的高 5 位不可能是 b11110。
实际上对于 7-bit 的从设备地址,合法范围为 b0001XXX-b1110XXX,’X’表示任意值,
因此该类型地址最多有 112 个(其他为保留地址[1])。
两个地址帧传输完成后,就开始数据帧的传输了,这和 7-bit 地址中的数据帧传输过程相同。
9、时钟同步和仲裁(了解即可):
如果两个 master 都想在同一条空闲总线上传输,此时必须能够使用某种机制来选择将总线
控制权交给哪个 master,这是通过时钟同步和仲裁来完成的,而被迫让出控制权的 master
则需要等待总线空闲后再继续传输。在单一 master 的系统上无需实现时钟同步和仲裁。
10、时钟同步(了解即可):
时钟同步是通过 I2C 接口和 SCL 之间的线“与”(wired-AND)来完成的,即如果有多个
master 同时产生时钟,那么只有所有 master 都发送高电平时,SCL 上才表现为高电平,否
则 SCL 都表现为低电平。
11、总线仲裁(了解即可):
总线仲裁和时钟同步类似,当所有 master 在 SDA 上都写 1 时,SDA 的数据才是 1,只
要有一个 master 写 0,那此时 SDA 上的数据就是 0。一个 master 每发送一个 bit 数据,
在 SCL 处于高电平时,就检查看 SDA 的电平是否和发送的数据一致,如果不一致,这个
master 便知道自己输掉仲裁,然后停止向 SDA 写数据。也就是说,如果 master 一直检查
到总线上数据和自己发送的数据一致,则继续传输,这样在仲裁过程中就保证了赢得仲裁的
master 不会丢失数据。
输掉仲裁的 master 在检测到自己输了之后也不再产生时钟脉冲,并且要在总线空闲时才能
重新传输。
仲裁的过程可能要经过多个 bit 的发送和检查,实际上两个 master 如果发送的时序和数据
完全一样,则两个 master 都能正常完成整个的数据传输。
3 EEPROM 24C02 介绍
经过上面对 I2C 总线的介绍,下面我们介绍 EEPROM 24C02 的 I2C 总线读写控制。
如下图,A0-A2 是 EEPROM I2C 器件地址,SDA 和 SCL 是 EEPROM I2C 总线 SLAVE 接口,
WP 是保护脚,一般接 VCC。
我们看下 24C02 的写时序,可以看到,支持单个字节的写,以及多个字节的写。首先发送器件
的地址,然后发送需要写 EEPROM 存储空间的地址,之后就是数据,对于读操作一次可以写 1 个
字节或者多个字节。
写字节操作 BYTE WRITE
在起始位产生后,先写器件地址,再写芯片内存地址,再写入数据,最后产生停止位,每写
一个字节都要产生 ACK 位。
页写 PAGE WRITE
页写和字节写差不多,在字节写的基础上,连续写入数据,最后产生停止位。
剩余22页未读,继续阅读
资源评论
icysmile131
- 粉丝: 3158
- 资源: 111
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功