FPGA — IIC学习笔记1

EEPROM介绍

EEPROM(E2PROM,Electrically Erasable ProgammableRead Only Memory)即电可擦除可编程只读存储器,是一种常用的非易失性存储器。不同厂家的产品,相同厂家不同型号、系列的产品,它们的寿命也不尽相同,100万次为常见主流产品。

非易失性存储器

IIC通信协议

1. IIC简介

IIC(I2C,Inter-IntegratedCircuit)即集成电路总线,是一种两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。多用于主机和从机在数据量不大且传输距离短的场合下的主(FPGA)从(AT24C64)通信。
在这里插入图片描述

I2C总线由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据,也可接收数据。

总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(可以从 I2C器件数据手册得知),主从设备之间就是通过这个地址来确定与哪个器件进行通信。

三种传输速率模式
标准模式:100Kbit/s
快速模式:400kbit/s
高速模式:3.4Mbit/s

IIC是半双工通信方式(分时收/发),而UART是异步全双工通信方式

2. IIC协议规定

IIC整体时序图如下:
IIC整体时序图
空闲状态:串行时钟线 SCL 和串行数据线 SDA 线由于上拉的原因处于高电平状态
起始信号:在时钟(SCL)为高电平的时候,数据总线(SDA)由高电平跳变到低电平。
停止信号:在时钟(SCL)为高电平的时候,数据总线(SDA)由低电平跳变到高电平。
传输数据:在时钟(SCL)为高电平的时候,数据总线(SDA)必须保持稳定,所以数据总线(SDA)在时钟**(SCL)为低电平的时候**才能改变。
数据传输

应答信号约定如下:
在这里插入图片描述
应答(ACK):当 IIC 主机(不一定是发送端还是接受端)将 8 位数据或命令传出后,会将数据总线(SDA)释放,即设置为输入,然后等待从机应答(低电平 0 表示应答,1 表示非应答),此时的时钟仍然是主机提供的。

IIC具体时序图如下:
IIC具体时序图
我们在起始信号之后,主机开始发送传输的数据;在串行时钟线 SCL 为低电平状态时,SDA 允许改变传输的数据位(1 为高电平,0 为低电平),在 SCL 为高电平状态时,SDA 要求保持稳定,相当于一个时钟周期传输 1bit 数据,经过 8 个时钟周期后,传输了 8bit 数据,即一个字节。第 8 个时钟周期末,主机释放 SDA 以使从机应答,在第 9 个时钟周期,从机将 SDA 拉低以应答;如果第 9 个时钟周期,SCL 为高电平时,SDA 未被检测到为低电平,视为非应答,表明此次数据传输失败。第 9 个时钟周期末,从机释放 SDA 以使主机继续传输数据,如果主机发送停止信号,此次传输结束。我们要注意的是数据以 8bit 即一个字节为单位串行发出,其最先发送的是字节的最高位。

3.IIC器件地址

每个 I2C 器件都有一个器件地址,有的器件地址在出厂时地址就设置好了,用户不可以更改(例如 OV7670 器件地址为固定的 0x42),有的确定了几位,剩下几位由硬件确定(比如常见的 I 2 C 接口的 EEPROM 存储器,留有 3 个控地址的引脚,由用户自己在硬件设计时确定)。

I2C 协议在进行数据传输时,主机需要首先向总线上发出控制命令,其中控制命令就包含了从机器件地址和读写控制,然后等待从机响应。如图所示为 I 2 C 控制命令传输的数据格式。
控制命令格式
在开始位之后,7位为器件地址,前四位为固定值,剩下三位用于对从机器件的寻址,所以最大可以挂载8个器件。最后一位为读/写控制位,1表示读,0表示写。
ACK为应答信号。

4.IIC存储器地址

主机发送完控制命令并收到正确的应答之后,就开始发送字地址(Word Address),字节地址的长度与器件的存储电鱼数量有关,若为256以内的,则只需要1个字节地址。
下图是1字节地址器件的地址分布:
存储器地址
下图为双字节地址分布
双字节地址

IIC写时序

1.单字节写时序

根据地址的大小分为单字节地址和2字节地址的单字节写操作时序:
单字节时序图
单字节地址写单字节数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输待写入的数据;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机产生 STOP 位,终止传输。

双字节地址写单字节数据过程:
前四步和后四步与单字节地址相同,第5步分为以下三步:
5、读取应答信号成功,主机设置 SDA 为输出,传输地址数据高字节;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输地址数据低字节;

2. 连续写(页写)时序

连续写与单字节写的区别在于,发完一个字节的数据之后,是发送结束信号还是发送下一个字节的数据,如果发送的是结束信号,就称为单次写,如果继续发送下一字节数据,就称为连续写。其时序图如下图所示:
页写
需要注意的是:在当前页循环写入,如果写满了继续写入的话会从当前页的第一个字节开始覆盖写入。
若要从别的页写,则要从前面开始,改变字节地址再写入。

IIC读时序(随机地址读)

1. 单字节读时序

单字节读时序与写时序类似,也根据地址的大小分为1字节地址器件单字节读操作时序和2字节地址器件单字节读操作时序
在这里插入图片描述
单字节地址读取单字节数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作;
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机发起起始信号;
8、主机传输器件地址字节,其中最低位为 1,表明为读操作;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置 SDA 为三态门输入,读取 SDA 总线上的一个字节的
数据;
10、产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
11、主机产生 STOP 位,终止传输。

双字节地址读取单字节数据过程:
1-4步与6-11步相同,第五步分为了以下三步:
5、读取应答信号成功,主机设置 SDA 为输出,传输地址数据高字节;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输地址数据低字节;

2. 连续读时序(页读取)

2字节地址的连续读时序如下所示:
连续读时序
双字节地址器件连续多字节读取数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0表明为写操作
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输地址数据高字节;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输地址数据低字节;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机发起起始信号;
10、主机传输器件地址字节,其中最低位为 1表明为读操作
11、设置 SDA 为三态门输入,读取从机应答信号;
12、读取应答信号成功,主机设置 SDA 为三态门输入,读取 SDA 总线上的第 1 个字节的数据;
13、主机设置 SDA 输出,发送一位应答信号;
14、设置 SDA 为三态门输入,读取 SDA 总线上的下一个字节的数据;若 n 个字节数据读完成,跳转到步骤 15,若数据未读完,跳转到步骤 13;(对于 AT24Cxx,一次读取长度最大为 32 字节,即 n 不大于 32)
15、主机设置 SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总
线会被自动拉高);
16、主机产生 STOP 位,终止传输。

注意:为什么读操作开始的时候要先表示为呢?这是因为我们需要使从机内的存储单元地址指针指向我们想要读取的存储单元地址处,所以首先发送了一次Dummy Write 也就是虚写操作,只所以称为虚写,是因为我们并不是真的要写数据,而是通过这种虚写操作使地址指针指向虚写操作中字地址的位置,等从机应答后,就可以以当前地址读的方式读数据了,如图 20.1.10 所示,随机地址读是没有发送数据的单次写操作和当前地址读操作的结合体。

系统框图

系统框图
首先 FPGA 向 EEPROM 写数据,写完之后从EEPROM 读出所写入的数据,并判断读出的数据与写入的数据是否相同,如果相同则 LED 灯常亮,否则LED 灯闪烁。

SDA信号三态开漏模式的原理

三态开漏
在这里插入图片描述
代码

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值