您的位置:首页 > 其它

基于FPGA EEPROM读写实现及IIC总线协议和时序分析

2017-09-07 11:04 603 查看

结构框图



引脚说明

串行时钟信号引脚(SCL):在 SCL输入时钟信号的上升沿将数据送入 EEPROM器件,并在时钟的下降沿将数据读出。

串行数据输入/输出引脚(SDA): SDA 引脚可实现双向串行数据传输。该引脚为开漏输出,可与其它多个开漏输出器件或开集电极器件线或连接。

器件/页 地址脚(A2,A1,A0): A2、A1 和 A0 引脚为 24C01与 24C02 的硬件连接的器件地址输入引脚。 24C01在一个总线上最多可寻址八个 1K 器件, 24C02 在一个总线上最多可寻址八个 2K 器件, A2、 A1 和 A0内部必须连接。

24C04 仅使用 A2、 A1 作为硬件连接的器件地址输入引脚, 在一个总线上最多可寻址四个 4K 器件。 A0 引脚内部未连接。

24C08 仅使用A2作为硬件连接的器件地址输入引脚, 在一个总线上最多可寻址两个8K器件。 A0和 A1 引脚内部未连接。

24C16 未使用作为硬件连接的器件地址输入引脚,在一个总线上最多可连接一个16K器件。 A0、 A1和A2 引脚内部未连接。

写保护(WP)引脚: 24C01/02/04/08/16 具有用于硬件数据写保护功能的引脚。当该引脚接 GND时,允许正常的读/写操作。当该引脚接 VCC 时,芯片启动写保护功能

器件操作

时钟及数据传输: SDA引脚通常被外围器件拉高。 SDA引脚的数据应在 SCL为低时变化;当数据在SCL为高时变化,将视为下文所述的一个起始或停止命令。

起始命令: 当 SCL为高, SDA由高到低的变化被视为起始命令, 必须以起始命令作为任何一次读/写操作命令的开始。

停止命令: 当 SCL为高, SDA 由低到高的变化被视为停止命令,在一个读操作后,停止命令会使EEPROM进入等待态低功耗模式。

应答: 所有的地址和数据字节都是以 8 位为一组串行输入和输出的。 每收到一组 8 位的数据后, EEPROM都会在第 9 个时钟周期时返回应答信号。 每当主控器件接收到一组 8 位的数据后, 应当在第 9 个时钟周期向EEPROM返回一个应答信号。收到该应答信号后, EEPROM会继续输出下一组 8 位的数据。若此时没有得到主控器件的应答信号, EEPROM会停止读出数据,直到主控器件返回一个停止命令来结束读周期。

等待模式: 24C01/02/04/08/16特有一个低功耗的等待模式。可以通过以下方法进入该模式: (a)上电 ()收到停止位并且结束所有的内部操作后。

器件复位: 在协议中断、下电或系统复位后,器件可通过以下步骤复位:( 1)连续输入 9 个时钟;( 2)在每个时钟周期中确保当 SCL为高时SDA也为高;( 3)建立一个起始条件。

时序分析

总线时序



写时序



数据有效



起始信号与停止信号



起始信号:当时钟信号SCL为高时,检测到数据信号SDA信号由高拉低,则是起始信号,标志着一次数据传输的开始,而且起始信号由主控器主动建立,在建立之前,IIC总线处于空闲状态。

停止信号:当时钟信号SCL为高时,检测到数据信号SDA信号由低拉高,则是停止信号,标志着一次数据传输的结束,而且停止信号由主控器主动建立,信号建立之后,IIC总线返回空间状态。

空闲状态:规定SCL与SDA同时为高的时候,IIC总线处于空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

//起始信号
begin
isOut <= 1;

if(C1 == 0)rSCL <= 1'b1;
else if(C1 == 400) rSCL <= 1'b0;//SCL由高拉低

if(C1 == 0)rSDA <= 1'b1;
else if(C1 == 200) rSDA <= 1'b0;//SDA由高拉低(注意SCL与SDA的拉低时间不同,由此来检测起始信号,其中C1是时钟计数器)

if(C1 == F100K - 1)
begin
C1 <= 9'd0;
i <= i + 1'b1;
end
else C1 <= C1 + 1'b1;
end


//停止信号
begin
isOut <= 1'b1;
if( C1 == 0 ) rSCL <= 1'b0;
else if( C1 == 100 ) rSCL <= 1'b1; //SCL 先变高

if( C1 == 0 ) rSDA <= 1'b0;
else if( C1 == 300 ) rSDA <= 1'b1; //SDA 后变高

if( C1 == F100K -1 ) begin C1 <= 9'd0; i <= i + 1'b1; end
else C1 <= C1 + 1'b1;
end


数据位传输



每一位数据的传输都有一个时钟脉冲相对应或同步控制,也就是说在SCL串行时钟的配合下,SDA上逐位地串行传送每一位数据。进行数传送时,SCL为高电平的期间,SDA上的电平需要保持稳定,低电平为数据0,高电平为数据1。只有在SCL拉低时,SDA上的电平才能改变状态。

应答信号



首先需要清楚IIC 总线数据的传输都是以8位一字节传输的,每当发送器发送完毕一字节,则在第9个时钟脉冲释放总线,此时接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位,即接收器成功接收到一字节数据,否则电平为高时,应答信号无效,接收数据失败。

如果接收器是主控器,则在它收到最后一个字节后,发送一个 NACK 信号,以通知被控发送器结束数据发送,并释放 SDA 线,以便主控接收器发送一个停止信号。

//应答信号
begin
isOut <= 1'b0;
if( C1 == 200 ) isAck <= SDA;

if( C1 == 0 ) rSCL <= 1'b0;
else if( C1 == 100 ) rSCL <= 1'b1;
else if( C1 == 300 ) rSCL <= 1'b0;

if( C1 == F100K -1 )
begin
C1 <= 9'd0;
i <= i + 1'b1;
end
else C1 <= C1 + 1'b1;
end


单字节写入



单字节写入流程为:①起始信号,②写入设备地址,③等待应答响应,④写入数据存放的地址,⑤等待应答响应,⑥写入数据,⑦等待应答响应,⑧停止信号。就这样,一个8位数据就写入EEPROM了。单字节读的原理也是同理。

单字节读取

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fpga