芯片参数 : VCC 2.7V-3.3V
8位数据/地址复用总线
存储阵列为 (2K+64)字节*64页*1024块
随机任意读取所需最大时间为25us
顺序读取所需最小时间为30ns
整存储页完整读取所需典型时间为200us
特殊模式:COPY BACK PROGRAM MODE 直接复制
- Fast page copy without external buffering
CACHE PROGRAM 隐藏写录
- Internal (2048+64) Byte buffer to improve the programthroughput
注:为了在大量数据读写时加快速度。不是非常理解。大致好像是一个大小为(2048+64)的BUFFER作为缓冲区
FAST BLOCK ERASE 整块快速清空
- Block erase time: 2ms (Typ.)
状态寄存器:ELECTRONIC SIGNATURE
- 1st cycle: Manufacturer Code
- 2nd cycle: Device Code
- 3rd cycle: Internal chip number, Cell Type, Number of
Simultaneously Programmed Pages.
- 4th cycle: Page size, Block size, Organization, Spare size
注:这个怎么读出来呢?(所谓的一个周期又是多少个CLK呢 8个?32个?)见下图
由上图知 芯片的信息为32位(4字节信息)
8位的: 0XAD 0XF1 0X80 0X1D
16位的:0XAD 0XFA 0X80 0X5D
那么4个字节内每一位都代表什么意思呢?
【第一字节:制造商标号】
【第二字节:器件标识符】
【第三字节:内部晶片数量,存储单元类型,同时编程的页数】
例如:HY27UF081G2A 第三字节为 0x80 = 0b1|0|00|00|00
(1) (0) (00) (00) (00)
支持隐藏写|不支持不同芯片间交替编程(不是很理解,不过不用到)|连续编程页数为1页| 直接单层的|内部晶片数量为1片
【第四字节:页大小(除去剩余区域),剩余区域大小,块大小(除去剩余区域),同时编程的页数】
例如:HY27UF081G2A 第四字节为 0x1D =0b00011101
顺序连续存取时间30ns|X8类型(8位并行IO)|块大小128KB| 每512个字节另有16个字节剩余地址(例:页大小为2K,则还有64字节大小的剩余区域)|页大小2K:(2K/512)*16=64
引脚示意图
注:这里用的是HY27UF081G2A所有并没有IO8-15
CLE是指令使能,高电平有效
ALE是地址使能,高电平有效(ALE与CLE显然不能同时为高)
CE 是片选使能,低电平有效
RE 是读使能, 低电平有效
WE 是写使能, 低电平有效
WP 是写保护, 低电平有效(一般可以直接上拉电阻直接拉高)
R/B是检测引脚,输出高电平为空闲,低电平为忙碌。
I/O口作为输入口时,在WE引脚给予一个电平上升沿后锁存;I/0 BUFFER在片选不使能时或者不使能输出时成高阻态。
心得小记:这里的WE和RE就好比两个开关或者说是时钟。在写入FLASH 数据或者命令时,在WE的上升沿达到将数据或命令锁存入相应的寄存器,而在读出FLASH中的寄存器数值或者数据时,当数据准备好,在RE的下降沿,微控制器就能从I/O上读到数据。因此写操作,就好比是在WE这个“CLK”的上升沿有效的,而读操作则是在RE这个“CLK”下降沿有效的。(这里一个CLK 读取或收入8位并行数据)
1.1、命令输入 Command Input (CLE=1,ALE=0)
ALE(0),CE(0) -> CLE(1) -> WE(0)->Command(输入并保持) ,在Command 保持时拉高WE(1)WE上升沿锁存Command->CE(1)->CLE(0)->ALE(1)
根据时序图所得示意程序伪码
void write_com(uint8 com)
{
ALE=0;
CE=0; delay 20ns;
CLE=1;delay 15ns;
WE=0;delay 15ns;
IO7-0=com;delay 5ns;
WE=1;delay 15ns;
CE=1;
CLE=0;
ALE=1;
}
常用命令表
1.2、地址输入 Address Input(CLE=0,ALE=1)
根据时序图所得示意程序伪码
void Set_Addr(uint32 addr)
{
CLE=0;
CE=0;delay 15ns;
ALE=1;delay 15ns;
WE=0;
IO7-0=(uint8)(addr&0xff);delay 5ns;
WE=1;delay 15ns;
ALE=0;delay 15ns;
ALE=1;delay 15ns;
WE=0;
IO7-0=(uint8)((addr&0xff00)>>8);delay 5ns;
WE=1;delay 15ns;
ALE=0;delay 15ns;
ALE=1;delay 15ns;
WE=0;
IO7-0=(uint8)((addr&0xff0000)>>16);delay 5ns;
WE=1;delay 15ns;
ALE=0;delay 15ns;
ALE=1;delay 15ns;
WE=0;
IO7-0=(uint8)((addr&0xff000000)>>24);delay 5ns;
WE=1;delay 15ns;
ALE=0;delay 15ns;
CE=1;
CLE=1;
}
1.3、数据输入 Data Input (CLE=0,ALE=0)
根据时序图所得示意程序伪码
void Send_Data(uint8 *data_buf,uint32 length)
{
CLE=0;
CE=0;delay 15ns;
ALE=0;delay 15ns;
for(;length>0;length--)
{
WE=0;delay 5ns;
IO7-0=*data_buf++;delay 10ns;
WE=1;delay 5ns;
}
CE=1;
CLE=1;
}
使用时 uint8 writebuf[];
Send_Data(writebuf,length); 笔记:对指针/地址的运用能是程序简洁。这里Send_Date函数中是以个纸箱数组的首地址的指针为变量。
1.4、数据读出 Data Output (CLE=0,ALE=0)
根据时序图所得示意程序伪码
void Read_Data(uint8 *data_buf,uint32 length)
{
CLE=0;
ALE=0;delay 15ns;
WE=1;delay 15ns;
RE=1;delay 15ns;
CE=0;dealy 15ns;
for(;length>0;length--)
{
whlie(R/B==0);
RE=0;delay 20ns;
*data_buf++=IO7-0;delay 10ns;
RE=1;delay 15ns;
}
CE=1;
}
使用时: uint8 readbuf[];
Read_Data(readbuf,length);
2.1、读状态寄存器 (Read Status Register)
根据时序图所得示意程序伪码
uint8 Read_Status()
{
RE=1;
CLE=1;
CE=0;delay 15ns;
WE=0;
IO7-0=0X90;delay 5ns;
WE=1;delay 10ns;
CE=1;
CLE=0;delay 20ns;
CE=0;delay 30ns;
RE=0;delay 20ns;
status=IO7-0;delay 10ns;
RE=1;
CE=1;
}
2.2、页读取 (Page Read)
command 0x00 -> address 4字节(该页首地址) ->command 0x30-> 判别忙delay15ns ->开始读出数据
注意:注意图中的Column Address 对应Dout N的地址
2.3、任意地址数据读取 (Random DATA Output)
command 0x00->address 4字节(该页首地址)-> command 0x30->判别忙信号delay15ns->顺序读取或者command0x05->address 2字节(所要读的数据所在地址)
->开始读出数据
注意:注意图中的Column Address 对应Dout N的地址,0x50后是2字节在该页中的地址
2.4、页写入 (Page Program)
command 0x80 -> address 4字节(该页首地址)->顺序写入最多2112字节->command 0x10结束写->判别忙信号->command 0x70读状态寄存器->IO0为0写成功
2.5、任意地址数据写入 (Random DATA Input)
command 0x80 -> address 4字节(该页首地址)->顺序写入或者command0x85->写入数据->command0x10结束写入->判别忙信号->command0x70读状态->IO0为0写成功
2.7、状态读取(Status Read)
Command 0x70->delay 60ns->RE FALLING->status Output
2.7、复制写入 (Copy-Back Program)
这个模式下,可以不用外部存储介质,直接在芯片内部快速准确地完成数据的复制重写入。因为数据串行输入和re-Loading的时间消耗被去除了,所以系统的效率提高了。在一块数据块中的若干数据块需要更新而该数据块中剩余数据需要复制到新的指定的空闲数据块中时,这种好处就尤为明显的体现出来了。执行复制写入的操作是一种连续的不需要串行存取的页读操作且通过目标页的地址来复制写入。读操作通过“0x35”指令来使得源页中的全部2112字节(X8芯片)/1056字节(X16芯片)数据传入内部数据缓存BUFFER。 一旦设备芯片返回空闲状态,这copy_back指令“0x85”和目标页的地址可以写入。在实际将数据写入目标页签需要写入写指令“0x10”来开始实际写数据操作.
"When there is a program-failure at Copy-Back operation, error is reported by pass/fail status. But, if
Copy-Back operations are accumulated over time, bit error due to charge loss is not checked by external
error detection/correction scheme. For this reason, two bit error correction is recommended for the use
of Copy-Back operation."(大意是如果有写入超时,那么以一次的PASS/FAIL位会丢失,所以在这个Copy_back program模式下需要有两位的PASS/FAIL位来做检测(一般情况下只有一位))
注:page间的复制写入,只允许从奇数地址的页复制到奇数地址的页,或者从偶数地址的页复制的偶数地址的页(不是很明白)
过程:1.先通过指令0X35+4字节地址位找到源页将其2112字节复制到内部BUFFER
2.通过指令0x85+4字节地址设定目标页地址
3.通过指令0X10开始复制数据
2.8、读区ID (Read ID)
Command 0x90->address 0x00 ->读1st:制造商标号->2nd:器件标识符->3rd:内部晶片数量,存储单元类型,同时编程的页数->4th:页大小(除去剩余区域),剩余区域大小,块大小(除去剩余区域),同时编程的页数
2.9、缓冲写入写入 (Cache Program)
注:缓冲写入(0x80+地址+数据+0x15) 一般真实页写入(0x80+地址+数据+0x10)
缓冲区大小为一页(2112字节),缓冲写页只能在一块数据块中使用,如果R/B Pin来检测写入进程,最后一页不能用缓冲写入模式,只能用真实页写入。
随意最多63页缓冲写入+1页真实页写入。
2.10、块擦除 (Block Erase)
指令0x60自动块擦除进入指令->地址只有A27-A18有效(高2字节)->指令0xD0擦除指令->判别忙信号(R/B或者statue寄存器的I/O6)->指令0x70读状态指令->i/o0 =0 成功擦除 =1擦除失败
2.11、复位 (Reset)
3、坏块管理(Bad Block management)
因为数据块都是独立的,所以一块损坏不影响其他块的功能。
一块坏数据块的首页的剩余空间(spare area)的首字节为0xff,如果该块的首页是损坏的,那么其第二页的spare area的首字节为0xff,以此类推。
检测出所有坏块。。。
附录: