FPGA学习_I2C总线协议


一、I2C协议概述

参考:https://mp.weixin.qq.com/s/Yq7i3y0ElNJiaPOWRetstQ
I2C总线由Philips公司开发的一种简单的双向二线制同步串行总线,英文名称为(Internal-Integrated Circuit Bus),也就是内置集成电路总线,它只需要两根线即可实现系统内部各个连接于总线上的集成电路(IC)之间的信息传递,可以说它是内部的公共通信干线。该协议起初是飞利浦公司为了让主板、嵌入式系统用以连接低速周边装置而研发的,如今得到了广泛应用。在平时,我们习惯把bus给省略了,称之为I2C或者IIC。I2C总线设计可谓非常精巧,它用两根线就可以实现总线上主从设备之间的交流,并且支持分时复用多主多从,也就是说在同一时刻仅支持一主一从,如图1所示。由于在芯片内部都有I2C相关的电路设计以兼容I2C接口,且片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整,故外部只需要加个上拉电阻即可。
I2C控制AT24C64芯片总体概述:
在这里插入图片描述
根据上图我们可以归纳出,I2C写数据(主设备输出)是由“空闲+起始+写+从应答+停止”来实现的,其中写地址和写数据都是写。I2C读数据是由“空闲+起始+写+从应答+读+主应答+不应答+停止”拼凑起来的。前文说过,I2C通过两根线的不同状态实现了数据交换,现在可以进一步说,是用I2C两根线的不同形式表示了上述的起始、写、读等一些状态,这些状态又按照协议要求进行排列完成了数据内容的交换。所谓的不同形式也就是高电平、低电平、上升沿、下降沿这四种而已,下面我们来分析一下上图的数据传输格式的这些状态。

二、I2C状态

在这里插入图片描述

2.1、空闲状态

空闲即为无事所为之状态,在该状态数据线和时钟均处于高电平。

2.2、起始信号

主设备发出起始信号也就意味着通讯的开始,或读或写。起始信号是在时钟为高电平期间将数据线拉低,如图所示。

2.3、写数据

写数据就是主设备向从设备发送内容,发送内容的关键点是在时钟的低电平期间可以改变数据在高电平期间要保持数据内容不变,如图所示,在时钟电平数据线从“0”变成了“1”,那么该时钟周期发送的数据则为“1”,为什么高电平要保持呢?这是因为如果在时钟线为高电平期间拉低数据线,则与起始信号冲突,器件又傻傻的分不清,如果数据线由低电平变为高电平,则与停止信号冲突,器件依旧分不清。
在这里插入图片描述

2.4、从应答

在写数据期间,每发送完一组(8bit)数据,必须由从设备反馈一个应答信号,以示从设备接收到了数据,从应答是在期间主设备释放数据线,由于电路存在上拉电阻,因此数据线为高电平状态,如果期间数据线被拉低,则表示从期间应答
在这里插入图片描述

2.5、主应答

主应答是应用在主设备连续读期间,当主设备读完一组(8bit)数据,欲读下一组数据时,主设备需发送主应答告知从设备。主应答是在接收完数据的下一个时钟将数据线拉低即可。

2.6、不应答

不应答是在主设备读一组数据之后不再读数据了要告知从设备的一种状态信号,也就是在读完一组数据后的下一个时钟不要将数据线拉低即可。

2.7、读数据

读数据即为从设备将数据内容在时钟的伴随下发送给主设备,此时主设备要释放数据线,数据线交由从设备控制,从设备也是在时钟低电平期间发送数据,高电平期间维持数据不变。

2.8、停止信号

无论是读还是写,该信号的出现都标志着一次操作的完成,其方式时钟的高电平期间将数据线有低拉高。随后便进入了空闲状态。

三、IIC总线控制AT24C64芯片

AT24C64芯片:

  • 页大小:32Byte
  • 读期间地址滚动是从最后一个内存也最后一个字节到第一页的第一个字节,写期间地址滚动是从当前页最后一个地址到当前页第一个地址
  • 每次操作地址自动+1

3.1、设备地址

高4bit是固定的,A0 A1 A2根据器件连接方式确定,R/W为读写指示,1为写,0为读。
在这里插入图片描述

3.1、字节写操作

起始位+设备地址+读写指示+从ack+字节地址高8位+从ack+字节地址低8位+从ack+data+从ack+停止位
其中地址位宽为13,所以传输了俩次,具体情况根据芯片手册确定
在这里插入图片描述

3.2、页写操作

连续写和单字节写是一样的,但连续写也不是你想写多少就写多少,AT24C64每页大小为32byte,如果从页起始来写如(0000_0000或0010_0000),则可以写8字节,如图从0000_0010。来写,则最多只能写30字节,在换页之间还有有一定的延时。
在这里插入图片描述

3.2、读当前地址

读当前地址是操作最为简单的一种操作方式,也是最不常用的一种方式,如图所示,写完设备地址直接读数据。读数据地址由上次写数据操作决定,如果上次数据写到了地址3,则读当前地址操作直接读地址3数据。
在这里插入图片描述

3.3、随机读操作

在这里插入图片描述

随机读顾名思义就是可以读任意位置的一个字节数据,其实可以说随机读是在读当前地址数据上演化来的,我们将读指针指向我们要读的地址位置,再去读当前地址数据就是随意读了。具体操作就是先进行一次虚写(dummy_write)操作,将指针指向想要读的地方。

3.4、顺序读操作

顺序读说白了就是读多字节,如图所示,读完一次给ACK即可,不读了就不要给ACK,然后加上停止位,当然读也是有限制的,和连续写一样。
在这里插入图片描述

三、FPGA通过I2C控制AT24C64

下一篇:FPGA通过I2C控制AT24C64

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顺子学不会FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值