基于FPGA的I2C通信(一)

目录

一、I2C通信协议

1.I2C总线介绍

2.I2C总线特性

3.I2C总线协议

3.1 SDA和SCL信号

3.1 数据有效性

3.2 起始和终止位

3.3 传输1字节格式

3.4 应答(ACK)与非应答(NACK)

3.5 从设备器件地址和读写位

二、EEPROM介绍(AT24C64)

1.EEPROM总线时序

2.EEPROM读写时序

2.1 设备地址

2.2 写操作

2.3 读操作


一、I2C通信协议

1.I2C总线介绍

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。

I2C总线是公认的世界标准,由50多家公司生产超过1000个不同的地方实施的集成电路。此外,通用的i2c总线用于各种控制体系结构,如系统管理总线(SMBus),电源管理总线(PMBus),智能平台管理接口(IPMI),显示器数据通道(DDC)和高级电信计算架构(ATCA)。

2.I2C总线特性

  • 只需要两条总线:串行数据线(SDA)和串行时钟线(SCL);
  • 每一个设备连接到总线是由一个唯一的地址和简单的主/从关系存在的软件寻址;
  • 它是一个真正的多主总线,如果两个或更多的主同时发起数据传输,自带碰撞检测和仲裁,以防止数据损坏;
  • 串行、面向8位、双向数据传输,在标准模式下可达100kbit /s,在快速模式下可达400kbit /s,在快速模式+下可达1mbit /s,此外,在高速模式下最高可达3.4 Mbit/s;
  • 串行,8位,超快模式下单向数据传输高达5mbit /s;
  • 片上过滤拒绝总线数据线上的尖峰,以保持数据的完整性;
  • 可连接到同一母线上的集成电路的数量仅受最大母线电容的限制。在某些条件下可以允许有更多的电容。

下图为I2C总线应用示例:

可以看到在SDA和SCL两根总线上挂接了很多I2C总线设备,一次通过I2C总线进行数据传输。其与FPGA连接的总线拓扑图如下图:

3.I2C总线协议

两线串行数据线(SDA)和串行时钟(SCL),在连接到总线的设备之间传递信息。每个设备都有一个唯一的地址(无论是微控制器、LCD驱动程序、内存还是键盘接口),根据设备的功能,可以作为发送器或接收器操作。一个液晶驱动器可能只是一个接收器,而存储器可以接收和传输数据。除了发射器和接收器,设备在执行数据传输时也可以被认为是主设备或从设备。

下图为使用两个微控制器的i2c总线配置的例子。此示例突显了在i2c总线上发现的主从关系和接收-发送关系。注意,这些关系不是永久的,但只依赖于当时数据传输的方向。

i2c总线上时钟信号的产生总是由主设备负责;当在总线上传输数据时,每个主设备产生自己的时钟信号。只有在被低的从设备拉下时钟线或者由另外一个 主设备仲裁时,总线时钟信号才会改变。

3.1 SDA和SCL信号

SDA和SCL都是双向的线路,通过电流源或上拉电阻连接到一个正的供应电压(如下图)。连接到总线的设备的输出级必须有一个开路漏极或开路集电极来执行线和功能。I2C-bus上的数据可以在标准模式下以高达100kbit /s的速率传输,在快速模式下以高达400kbit /s的速率传输,在快速模式+下为1 Mbit/s,在高速模式下最高为3.4 Mbit/s。总线电容限制连接到总线的接口数量。

3.1 数据有效性

SDA线上的数据必须在时钟高期间保持稳定。只有当SCL线上的时钟信号是低时,数据线的高或低状态才能改变
(见下图)。每传输一个数据位产生一个时钟脉冲。因此我们在设计信号时,最佳情况就是在时钟线scl为低电平中间时SDA数据线上的数据改变,在时钟高电平中间时获取SDA数据线上的数据。

3.2 起始和终止位

所有数据的传输都以START (S)开始,以STOP (P)结束(见下图)。
       I2C总线空闲:SDA和SCL均为高电平;
       I2C协议起始位:SCL为高电平时,SDA出现下降沿;
       I2C协议终止位:SCL为高电平时,SDA出现上升沿。

启动和停止条件总是由主设备生成。在启动条件后,总线被认为是忙碌的。该总线在停止条件后的某一段时间内再次空闲。如果生成了重复启动(Sr)而不是停止条件,则总线将保持忙碌状态。在这方面,启动(S)和重复启动(Sr)条件在功能上是相同的。

3.3 传输1字节格式

在SDA数据线上传输的每个字节长度必须是8位。每次传输可以传输的字节数是不受限制的。每个字节后面必须跟着一个应答位(ACK)。数据从字节最高位(MSB)开始传输(见下图)。如果一个从设备无法接收或发送另一个完整的字节的数据,直到执行一些其他功能,例如服务内部中断,它可以维持时钟线scl为低强迫主设备进入等待状态。当从设备准备好另一个字节的数据后继续传输数据并释放时钟线SCL。

3.4 应答(ACK)与非应答(NACK)

应答发生在每个字节之后。应答位响应,表明该字节已成功接收,并且可以发送另一个字节。主设备产生所有时钟脉冲,包括确认位第九个时钟脉冲。应答信号定义如下:在响应时钟脉冲期间,发射机释放SDA线,接收机可以把SDA线拉低,,并且在时钟高电平期间稳定保持低电平。

当SDA在第9个时钟脉冲期间保持高时,这被定义为非应答信号。然后,主设备可以生成终止传输的停止条件,或者生成启动新传输的重复启动条件。NACK的产生有五个条件:

  • 总线上没有带有所传输地址的接收者,因此没有设备以应答。
  • 接收器无法接收或发送,因为它正在执行一些实时功能,并没有准备好开始与主控通信。
  • 在传输过程中,接收方获取它不理解的数据或命令。
  • 在传输过程中,接收器无法接收到更多的数据字节。
  • 主控接收机必须将传输结束的信号发送给从发射机。

3.5 从设备器件地址和读写位

从设备地址是I2C协议在传输数据时对总线上设备寻址的依据。数据传输遵循下图所示的格式。在启动条件之后,发送一个从设备器件地址。这个地址有7位长,后面跟着一个数据方向位(R/W)——“0”表示传输(写),“1”表示对数据的请求(读)(参见下2图)。数据传输总是以主设备产生的停止条件(P)结束。然而,如果一个主人仍然希望在总线上通信,它可以产生一个重复的开始条件(Sr)和地址而不用再产生一个停止条件。

图: 完整数据传输图

从设备器件地址通常是由固定为和可变位组合而成的。所谓固定位就是器件本就确定无法更改的,认为不能让控制的的,而可变位通常是器件的硬件,可供用户进行硬件连接,按照用户的硬件连接确定,例如下图中7位器件地址中,前四位1010是出厂时就已经固定了的,而后三位是器件硬件引脚可供用户改变的。

对不同的器件,I2C传输格式略有不同,对于存储设备,还具有存储器的地址号,在主设备发送器件地址,从设备存储器响应后,主设备要再发8或16位存储器地址数据,来选择存储器的地址,等待从设备响应后,主设备在发送数据到存储器地址或从存储器地址读取数据。


以上对I2C协议的阐述内容参考自恩智浦半导体公司的UM10204 I2C-bus specification and user manual  Rev. 4 — 13 February 2012(i2c总线规范和用户手册)。
数据手册下载地址为:
https://download.csdn.net/download/qq_33231534/12501985


 

二、EEPROM介绍(AT24C64)

1.EEPROM总线时序

AT24C32/64提供了32,768/65,536位串行电可擦和可编程只读存储器(EEPROM),组织为每个8位的4096/8192个字。该设备的级联特性允许最多8个设备共享一个通用的2线总线。该设备被优化用于许多工业和商业应用,其中低功率和低电压操作是必不可少的。该芯片引脚图如下:

各个硬件功能如下:

PinDescription
SCL串行时钟输入,该SCL输入是用来在上升沿时钟数据进入每个EEPROM设备,下降沿时钟数据输出每个设备。
SDA串行数据线,SDA引脚是双向串行数据传输,这种引脚是开漏驱动的,并且可以与任意数量的其他开漏或开集电极装置相连。
A2,A1,A0设备地址输入,当这些引脚是硬线连接时,最多有8个
32K/64K设备可以在单个总线系统上寻址,当引脚不是硬线,默认的A2, A1和A0是零。
WP写保护,当与连接到GND时,写保护输入允许正常的写操作;当WP被连接到VCC时,所有高位的部分内存(8/16K)的写操作被限制;如果不连接,WP内部下拉到GND。

其总线时序如下图:

写周期时序如下图:写周期时间t_{WR}是写序列从有效停止到内部清除/写周期结束的时间。

对照上两图时序情况,其交流特性表如下所示:

该设备一些基本操作如下:

  • 时钟和数据转换:SDA引脚通常与外部设备拉高。SDA引脚上的数据只能在SCL低时间期间更改(参阅数据有效性时序图)。在SCL高峰期间的SDA数据更改将表示如下所定义的启动或停止条件。
  • 启动条件:SCL高电平时,SDA出现下降沿。
  • 停止条件:SCL高电平时,SDA出现上升沿。读完一个序列后,stop命令将EEPROM置于待机电源模式。
  • 响应(ACK):所有地址和数据字以8位字串行地从EEPROM传送数据或从EEPROM接收数据。EEPROM在第9个时钟周期中发送一个0(低电平)来确认它收到了每个字。
  • 待机模式:AT24C32/64为低功耗待机模式,开启状态为:a)开机后;b)收到停止位并完成内部操作后。

上图数据有效位,启动和停止条件,输出响应和上边讲的I2C协议一样,这里不再过多叙述。

2.EEPROM读写时序

2.1 设备地址

32K/64K EEPROM需要一个8位的设备地址字,在启动条件下使芯片能够进行读或写操作。设备地址字由一个强制的前四位1,0序列组成,如图所示。这对所有2线EEPROM设备来说都是常见的。32K/64KEEPROM使用三个设备地址位A2, A1, A0,在同一总线上允许多达8个设备。这些位可以通过硬线输入引脚设置。A2、A1和A0引脚使用内部专用电路,如果允许引脚悬空,则使其偏向于逻辑低电平。

设备地址的第8位是读/写操作选择位。如果这个位高,则启动读操作;如果这个位低,则启动写操作。当EEPROM比较主设备发送的地址一样时,EEPROM将输出一个0。如果不一样,设备将返回到待机状态。

2.2 写操作

2.2.1 字节写

写操作需要在设备地址字和响应(ACK)之后有两个8位数据字地址。在收到第一个数据字地址后,EEPROM将再次响应一个0。在收到第二个数据字地址后,EEPROM再次响应一个0。接着传输要写入的数据,在EEPROM响应一个0后停止读写,此时EEPROM进入到非易失性存储器的内部定时写周期t_{WR}。所有的输入在这个写周期被禁用,EEPROM将不响应直到写结束。

2.2.2 页写

32K/64K EEPROM能够进行32字节的页写操作。页写的启动方式与字节写的方式相同,但微控制器在发送第一个数据字后不会进入停止条件。相反,在EEPROM确认接收到第一个数据字后,微控制器可以再传输多达31个数据字。EEPROM在接收到每个数据字后将以零响应。微控制器必须使用停止条件终止页写序列(参见上图)。

低于5位(32个)的数据字地址在收到每个数据字后内部递增。高于5位的数据字地址位不递增,保持内存页行位置。当内部生成的字地址到达页面边界时,下面的字节被放置在同一页面的开头。如果传输到EEPROM的数据字超过32个,数据字地址将“滚动”,之前的数据将被覆盖。

2.3 读操作

除了设备地址字中的读/写选择位被设置为1之外,读操作的启动方式与写操作相同。有三种读取操作:当前地址读取、随机地址读取和顺序读取。

2.3.1 当前地址读

内部数据字地址计数器保持最后一次读或写操作期间访问的最后一个地址,递增1。只要芯片功率保持不变,这个地址在操作之间保持有效。读取期间地址“滚动”是从最后一个内存页的最后一个字节到第一页的第一个字节。写入期间地址“滚动”是从当前页的最后一个字节到同一页的第一个字节。

2.3.2 随机地址读

随机读取需要一个“伪”字节写序列来加载数据字地址。一旦设备地址字和数据字地址被记录并被EEPROM确认,微控制器必须产生另一个启动条件,随后微控制器开始一个当前地址读取操作,发送一个设备地址与读/写选择位高。EEPROM确认设备地址并连续计时输出数据字。微控制器不响应一个零,但产生一个停止条件(参阅上图)。

2.3.3 顺序读取

顺序读取由当前地址读取或随机地址读取启动。在微控制器接收到一个数据字后,它以一个ACK作出响应。只要EEPROM接收到应答时,它将继续递增数据字地址并串行时钟输出顺序数据字。当达到内存地址限制时,数据字地址将“滚动”,顺序读取将继续。当微控制器没有响应0,但发送了停止条件时,顺序读取操作终止。


以上对AT24C64的EEPROM的讲解都是基于ATMEL公司的AT24C32/AT24C64芯片数据手册,需要观看或下载的可以进入以下网址:https://pdf1.alldatasheet.com/datasheet-pdf/view/56068/ATMEL/AT24C64.html

 

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
基于FPGAI2C控制器设计是一种用于实现I2C总线通信协议的方案。I2C是一种串行通信接口,用于在多个设备之间进行数据传输。FPGA作为一种可编程逻辑器件,具有高度灵活性和可重构性,非常适合用于设计I2C控制器。 在设计基于FPGAI2C控制器时,首先需要了解I2C协议的工作原理。I2C总线由一个主设备和多个从设备组成,主设备负责发起并控制通信过程,从设备负责响应主设备的指令。 设计中,我们可以利用FPGA的可编程性和并行处理能力来实现I2C控制器。首先,我们可以使用FPGA的I/O引脚作为SCL(时钟线)和SDA(数据线)来与外部的I2C总线进行连接。然后,我们可以使用FPGA内部的逻辑电路实现I2C协议的各个功能。 例如,在FPGA中可以设计一个状态机来控制I2C的起始,停止,发送和接收等操作。该状态机可以根据I2C的时钟以及外部的读写信号进行状态转换。同时,我们可以使用FPGA内部的存储器来缓存发送和接收的数据,以便实现数据的存储和传输。 此外,FPGA还可以使用硬件描述语言(如Verilog或VHDL)来描述I2C控制器的行为,方便实现和调试。通过FPGA的可编程性,我们可以根据需求对控制器进行优化和修改,以适应不同的应用场景。 总的来说,基于FPGAI2C控制器设计可以充分发挥FPGA的可编程性和并行处理能力,实现灵活、高效的I2C通信功能。该设计方案可以应用于各种需要I2C通信的电子设备中,提升系统的可扩展性和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值