EEPROM驱动设计
AI summary
本文详细介绍了EEPROM驱动设计的各个方面,包括字节写操作、页写操作、字节读操作和顺序读操作的时序分析与实现。此外,还涵盖了串行通信系统的设计要求和架构,强调了EEPROM的控制字、应答时序以及数据传输过程中的关键步骤和注意事项。
Last edited time
Oct 17, 2024 03:47 PM
Last edited by
Tags
Serial Communication
Communication Protocols
Data Transmission Methods
24LC64型EEPROM手册解读一:特性和描述二:功能描述三:总线特性四:器件地址五:写操作(字节写操作)六:字节写操作分析七:字节写操作实现八:字节写仿真测试九:字节写下板验证十:字节读操作实现十一:字节读操作设计架构十二:字节读操作实现 十三:字节读仿真测试十四:字节读下板验证EEPROM页写操作一:页写操作时序二:字节写和页写操作区别:三:写某一页多个数据(最少2个,最多32个)四:写满指定的一页(32个)五:写多页(最少2页,最多256页)六:写满整个存储器(64Kbit,256页)EEPROM顺序读操作一:页读/顺序读操作时序二:页读/顺序读操作和字节读操作区别三:顺序读操作实现(读取某一页中多个数据(最少2个,最多32个))四:读取指定的一页数据(32个)五:读取多页数据(3页)六:读取整个EEPROM(64Kbit)串行通信系统设计
24LC64型EEPROM手册解读
一:特性和描述
- 64K I2C™CMOS Serial EEPROM
- 2-wire serial interface bus, I2C compatible

- Cascadable for up to eight devices

- 32-byte page or byte write modes available
字节写/页写操作:1页最多写入32个字节数据。
- 5 ms max write cycle time
字节写/页写操作
- 24LC64(24xx64*) is a 8K x 8 (64K bit) Serial Electrically Eras-able PROM capable of operation across a broad volt-age range

Mem=64Kbit=8K*8bit
1page=32byte
64Kbit/(32*8bit)=8K/32=256page
- 芯片封装/板卡原理图

端口名 | 端口描述 |
A0,A1,A2 | 用户可配置的片选信号:3’b100 |
WP | 写保护:WP=0(可以读写整个存储器) |
SCL | 串行时钟线:MAX=400KHZ |
SDA | 串行数据线:数据改变在时钟低电平器件,数据稳定在时钟高电平器件,如果数据改变在时钟高电平期间,则认为是起始/停止条件 |

- 时序参数


- SDA Serial Data
(1):SDA属于双向管脚(往往采用三态处理)

(2):正常数据传输时,SDA线上数据被改变在SCL低电平期间;如果在SCL高电平期间数据改变,认为是起始/停止条件。SCL高电平期间数据保持稳定。
- SCL Serial Clock
在器件之间用于数据的同步传输,24LC64器件内不会自己产生所需要的工作时钟,该时钟往往由主设备(FPGA)产生,时钟频率最大不超过400KHZ。
- 地址深度
数据深度=8K,地址需要13位(2^13=8K),处理是将13位地址扩展为16位,分为高字节地址(高8位:前3位不用管)和低字节地址(低8位)。
二:功能描述
- 24LC64属于两线制IIC协议
- 器件在总线上发送数据时,作为发送器
- 器件在总线上接收数据时,作为接收器
- 起始/停止条件总是由主设备产生
- 主设备/从设备都可以认为是发送/接收器,由主设备决定是哪种模式被激活。
三:总线特性
- 总线不忙时,SCL和SDA处于高电平
- 数据传输期间:数据稳定是在SCL高电平时,数据改变是在SCL低电平时
- 当数据改变在SCL高电平时,则认为是起始/停止条件

- 从起始位后,可以进行数据传输,每传输一个字节数据(8bit占用8个SCL),需要一次应答ACK(第9个SCL时钟),等待所有数据传输完成后,产生停止条件。

应答时序(ACK):在SCL高电平期间,检测到SDA持续为低电平。
四:器件地址

起始位结束后,由主设备发送控制字(4个控制码:1010、3个片选A2A1A0:001、1个读写控制位:0(写) 1(读))。数据接收方响应主设备发送的控制字;接着由主设备继续发送两个字节地址(高字节地址和低字节地址)。

五:写操作(字节写操作)

字节写操作时序解读步骤:
- 主设备发送起始信号(START)
起始条件:在SCL高电平期间,SDA由高到低。
- 主设备发送写控制字(CONTROL BYTE)
其中1010是EEPROM的型号标识,是一组固定的序列;A2A1A0是片选信号(001);最后一位是W/R位(0(写) 1(读))。
- 主设备接收并检测EEPROM发送过来的应答(ACK1)
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
- 主设备发送高字节地址(ADDR HIGH)
- 主设备接收并检测EEPROM发送过来的应答(ACK2)
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
- 主设备发送低字节地址(LOW HIGH)
- 主设备接收并检测EEPROM发送过来的应答(ACK3)
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
- 主设备发送1个字节数据(DATA)
- 主设备接收并检测EEPROM发送过来的应答(ACK4)
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
- 主设备发送停止信号(STOP)
停止条件:在SCL高电平期间,SDA由低到高。
六:字节写操作分析
- SCL时序问题:以SCL=200KHZ为例

如果以系统时钟(sys_clk=400MHZ)下降沿反转得到SCL=200KHZ,那么在实现START时,需要在系统时钟上升沿来判断SCL为高电平,正好处于SCL高电平中心位置,在系统时钟上升沿来时,将SDA由高拉低即可。
- SDA数据线采用三态门处理
en=1(主设备控制总线控制权) en=0(主设备释放总线控制权)
- 数据并转串
采用计数器实现:计数器记录时钟个数(8个时钟周期)
在每一个SCL时钟周期的低电平期间将数据一位一位发送出去(MSB~LSB)。
在第9个SCL时钟周期满足应答条件。
练习:
- 熟读24LC64器件手册。
- 尝试完成EEPROM字节写操作。

七:字节写操作实现

- 设计架构

eeprom_scl最大工作时钟不超过400KHZ。
- EEPROM字节写控制实现
采用FSM实现,也可以采用LSM实现。
STG如下:


八:字节写仿真测试

九:字节写下板验证

24LC64原理图中片选A2A1A0=3’b000。
十:字节读操作实现

字节读操作补充:
- 字节读和字节写在第二个起始位前操作是一样的,不同的是字节读操作在第二个起始位后,需要将控制字中最后一位设置为读操作(RW=1),之后读控制字应答(ACK4),再读取之前写入地址的数据,之后NO ACK,最后停止条件STOP。
字节写/读:(START1,WR_CTRL_BYTE,ACK1,HIGH_ADDR,ACK2,LOW_ADDR,ACK3)。
- 写数据时和读数据时区别
写数据:主设备(FPGA:en=1),将待写入数据通过数据线给到从设备(EEPROM:en=0)。
在SCL低电平期间将数据发送出去。(SCL低电平期间可以改变数据)。
读数据时需要在SCL高电平期间(SCL高电平期间数据保持稳定)对数据进行读取,总线控制权由从设备控制(EEPROM),读取数据时从SDA线上将数据一位一位进行读取,读取数据完毕后数据是8位,也就是说需要将读取的8位数据放置在读取数据寄存器中(串行数据并行输出)。
- NO ACK(读取数据时:由主设备控制)
在时序中中要求:在SCL高电平期间,检测到SDA持续为高电平。
- 字节读操作时序解读步骤:
- 主设备发送起始信号(START1)
- 主设备发送写控制字(WRCONTROL BYTE:1010_000_0)
- 主设备接收并检测EEPROM发送过来的应答(ACK1)
- 主设备发送高字节地址(ADDR HIGH)
- 主设备接收并检测EEPROM发送过来的应答(ACK2)
- 主设备发送低字节地址(LOW HIGH)
- 主设备接收并检测EEPROM发送过来的应答(ACK3)
- 主设备发送起始条件(START2)
- 主设备发送读控制字(RDCONTROL BYTE:1010_000_1)
- 主设备接收并检测EEPROM发送过来的应答(ACK4)
- 主设备读取EEPROM发送过来的数据(DATA BYTE)
- 主设备控制NO ACK
- 主设备发送停止信号(STOP)
起始条件:在SCL高电平期间,SDA由高到低。
其中1010是EEPROM的型号标识,是一组固定的序列;A2A1A0是片选信号(000);最后一位是W/R位(0(写) 1(读))。
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
起始条件:在SCL高电平期间,SDA由高到低。
其中1010是EEPROM的型号标识,是一组固定的序列;A2A1A0是片选信号(000);最后一位是W/R位(0(写) 1(读))。
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
读数据时需要在SCL高电平期间(SCL高电平期间数据保持稳定)对数据进行读取,总线控制权由从设备控制(EEPROM),读取数据时从SDA线上将数据一位一位进行读取,读取数据完毕后数据是8位,也就是说需要将读取的8位数据放置在读取数据寄存器中(串行数据并行输出)。
在SCL高电平期间,检测到SDA持续为高电平。
停止条件:在SCL高电平期间,SDA由低到高。
十一:字节读操作设计架构

十二:字节读操作实现
采用FSM实现,也可以采用LSM实现。
STG如下:


读取8bit数据时序要求:ACK4,RD_DATA,NO_ACK。

十三:字节读仿真测试

十四:字节读下板验证


EEPROM页写操作
一:页写操作时序

页写操作时序解读步骤:
- 主设备发送起始信号(START)
起始条件:在SCL高电平期间,SDA由高到低。
- 主设备发送写控制字(CONTROL BYTE)
其中1010是EEPROM的型号标识,是一组固定的序列;A2A1A0是片选信号(001);最后一位是W/R位(0(写) 1(读))。
- 主设备接收并检测EEPROM发送过来的应答(ACK1)
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
- 主设备发送高字节地址(ADDR HIGH)
- 主设备接收并检测EEPROM发送过来的应答(ACK2)
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
- 主设备发送低字节地址(LOW HIGH)
- 主设备接收并检测EEPROM发送过来的应答(ACK3)
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
- 主设备发送第一个字节数据(DATA BYTE0)
- 主设备接收并检测EEPROM发送过来的应答(ACK4)
在SCL高电平期间,检测到SDA持续为低电平,则说明是应答信号。
写入多个字节数据重复8,9步骤即可,满足当前页最多写入32个字节。
如果超过32个字节数据,之前写入的数据会被覆盖。
- 主设备发送停止信号(STOP)
停止条件:在SCL高电平期间,SDA由低到高。
二:字节写和页写操作区别:
- 时序初始是一样的(写入第一个数据应答前)
- 字节写操作是只写入一个字节数据,而页写操作是写多个数据
(1):写某一页多个数据(最少2个,最多32个)
(2):写满指定的一页(32个)
(3):写多页(最少2页,最多256页)
(4):写满整个存储器(64Kbit,256页)
- 页写(内部写循环周期:MAX=5ms),完成写多页时,需要考虑换页问题(页写循环周期:MAX=5ms)。
三:写某一页多个数据(最少2个,最多32个)

- 写入数据方式

- 写入2个字节数据仿真测试

- 写入2个字节数据下板验证

四:写满指定的一页(32个)

- 写满指定一页方式1(32个)

可以在之前某一页写入2个数据基础之上,在写数据部分增加多个状态即可(1个写数据对应1个写数据应答)。
- 写满指定一页方式2(32个)

- 写入一页数据(第一页:32个)仿真测试

- 写入一页数据(第一页:32个)下板验证

五:写多页(最少2页,最多256页)

第一页地址区间:0~31
第二页地址区间:32~63
…
最后一页地址区间:8160~8191
写完第一页时(addr:0),需要注意页写循环周期(MAX=5ms),在写完一页时到下一页需要间隔时间,经过页写循环周期后,可以完成第二页数据写入(addr=32),在写完一页时到下一页需要间隔时间,经过页写循环周期后,可以完成第三页数据写入(addr=64)…

- 写入3页数据(第一页:32个 第二页:32个 第三页:32)仿真测试
写入数据:0~31(填充递增序列)

- 写入3页数据(第一页:32个 第二页:32个 第三页:32)下板验证

采样点个数:1280~3480(~=2200)
采样频率:800KHZ T=1250ns
MIN(延时时间):2200*1250ns=2.75ms
1268~3428(~2160)
MIN(延时时间):2160*1250ns=2.7ms
六:写满整个存储器(64Kbit,256页)


EEPROM顺序读操作
一:页读/顺序读操作时序

二:页读/顺序读操作和字节读操作区别
- 时序初始是一样的(读取第一个字节之前,包括
(START1,WR_CTRL_CODE,ACK1,HIGH_ADDR,ACK2,LOW_ADDR,ACK3,START2,RD_CTRL_CODE,ACK4,DATA),在之后顺序读读取一个数据有相应的应答ACK,直到读取最后一个数据后,有非应答NO ACK,之后是停止条件。
- 字节读是只读取一个字节数据,而顺序读是读取多个字节数据
(1):读取某一页中多个数据(最少2个,最多32个)
(2):读取指定的一页数据(32个)
(3):读取多页数据(最少2页,最多256页)
(4):读取整个EEPROM(64Kbit,256page)
- 顺序读,每读取1个字节数据(DATAn,DATAn+1…DATAn+x-1),都需要读取数据的应答ACK,读取最后一个字节数据(DATAn+x)时,出现非应答NO ACK。
三:顺序读操作实现(读取某一页中多个数据(最少2个,最多32个))


- 读取某一页中多个数据(最少2个,最多32个)仿真测试

- 读取某一页中多个数据(最少2个,最多32个)下板验证

四:读取指定的一页数据(32个)

- 读取一页数据第一种方式(32个)

- 读取一页数据第二种方式(32个)

- 读取一页数据第二种方式(32个)仿真测试

- 读取一页数据第二种方式(32个)下板验证

五:读取多页数据(3页)


- 读取多页数据(3页)仿真测试

- 读取多页数据(3页)下板验证

六:读取整个EEPROM(64Kbit)


串行通信系统设计
- 设计要求
(1):采用1个独立按键控制EEPROM的数据写满(64Kbit),另1个独立按键控制EEPROM的数据读取。
(2):读取的数据通过FIFO进行缓存(写FIFO)
(3):读取FIFO数据,通过UART将读取数据发生出去,上位机软件(串口调试器)进行接收。
- 设计过程

- 设计架构

- 设计分析
(1):EEPROM页写页读(64Kbit)

(2):EEPROM页写页读(64Kbit)


Loading...