3.3闪存接口
闪存的存取有特殊的时序,闪存的内部结构也和具体应用要求有很大的不同。因此闪存的接口需要仔细设计。
K9F4008闪存芯片的存储结构组织如图2所示。
K9F4008存储组织
K9F4008闪存的存储以块为单位,每个芯片共有128块。每块有32行,每行有4个帧,每帧含有32B.全部芯片为512KB。
闪存接口提供的闪存初始化函数中就包括对这样情况的处理。初始化函数要从闪存的第一个块中读出一个块映射表,该表下标是逻辑扇区,表内每项存储的是该逻辑扇区对应的物理块编号。初始化函数在必要时对闪存进行读写校验,然后将坏块从表中删除。再寻找新的良好块,将其编号填入到对应逻辑扇区的表项中。这样对应用来说,只见到连续的扇区编号,而不知道扇区究竟对应到那个块。
闪存的接口头文件Flash.h如下:
#ifndef_K9F4008_H_
#define_K9F4008_H_
voidread_log_page(u8sector,u8page,u8xdata*buf);
u8prog_log_page(u8sector,u8page,u8xdata*buf);
voiderase_log_blk(u8sector);
bitflash_init(void);
#endif
实现闪存的接口,首先就是依据说明书的时序定义闪存的基本操作。这里是以宏定义实现基本操作的。
#defineW_CMD(cmd_)\
bCLE=1;bWE=0;P2=(cmd_);bWE=1;bCLE=0
#defineW_ADDR(addr1_,addr2_,addr3_)\
bALE=1;bWE=0;P2=(addr1_);bWE=1;\
bWE=0;P2=(addr2_);bWE=1;\
bWE=0;P2=(addr3_);bWE=1;\
bALE=0
#defineW_DAT(dat_)bWE=0;P2=(dat_);bWE=1
#definewait_RBwhile(!bRB)
#definel2p(x_)fat_tbl[(x_)]
3.4EEPROM
内部集成的EEPROM是与程序空间分开的,利用ISP/IAP技术可将内部DATAFLASH当EEPROM,擦写次数10万次以上。EEPROM可分为若干个扇区,每个扇区包含512B.使用时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。
sfrIAP_DATA=0xC2;//Flashdataregister
sfrIAP_ADDRH=0xC3;//FlashaddressHIGH
sfrIAP_ADDRL=0xC4;//FlashaddressLOW
sfrIAP_CMD=0xC5;//Flashcommandregister
sfrIAP_TRIG=0xC6;//Flashcommandtrigger
sfrIAP_CONTR=0xC7;//Flashcontrolregister
根据使用说明对EEPROM的寄存器进行定义。
(编辑:daisy)
价格面议
[查看详情]