U盘的存储介质用三星的NandFlash K9F5608U0B,由于C8051F320自身没有Nandfalsh的驱动接口,只能用单片机的通用IO口来模拟Nandflash的时序. 数据线IO0-IO7 接单片机的P1口. 数据线是双向的,一定要用OD方式, 320 IO 口内部有上拉电阻, 根据C8051F320的 DATASHEET , 上拉使能时输入漏电流为25-40uA, 估计其上拉电阻只有3V/30uA = 100Kohm. 又根据K9F5608U0B的DATASHEET, 当K9F5608U0B输出低电平VoL为0.1V时吸收灌电流的典型值是2mA. 在3.3V的电源电压下,取上拉为3.3k即可满足要求. 其他信号线: CLE(命令锁存使能), ALE(地质锁存使能), CE(片选), WE(读选), RE(写选), WP(写保护), R/B(忙)分别接在P2口和P0口. WP 用来防止上电或掉电瞬间,Flash内部数据被改写,通常在监测到电源的波动后使能WP, 正常工作条件下禁止WP.
NandFlash的特点是数据与地址复用一条总线, 节省了控制器的IO 接口. 它的Memory Arry的组织方式是Block 和page, 一个block 包含32个page,一个page 内有512字节memory cell 和16字节spare area. 对于K9F5608U0B来说,它是32MB的容量,那么它将对应25条地址线 A0 to A24, A0 to A7 确定page内的地址,A9 to A24确定block地址,为了压缩发送地址的周期, 把地址线的第9为A8编入命令字,发不同的命令字操作A8是0的低存储区或A8是1的高存储区。这样在ALE的使能下3个cycle的操作就可选中要访问的存储区。NandFlash的读操作比较灵活,可以读任意page中的任意字节,地址在读命令中给出。而写操作是基于Page进行的,由于Flash的特性,只能把1拉低为0 ,而不能把0拉高为1,所以在写Page 之前一定要对Page 所在的block进行整块的擦除操作使整个block都为0xFF。除读操作以外的所有的操作在完成后都必须发送读状态命令通过判断IO0的状态确定操作是否正确。
对nandFlash的操作函数介绍如下:
extern void Read_ID(void); //读Flash ID
extern void write_cmd(uchar); //写命令
extern void write_addr(uchar); //写地址
extern void write_addr_2byte(uchar, uchar);
extern void write_addr_3byte(uchar, uchar, uchar);
extern uchar read_dat(void); //读字节
extern void write_dat(uchar); //写字节
extern uchar read_status(void); //读状态
extern uchar block_erase(uchar,uchar); //块擦除
extern uchar page_program(uchar *,uchar, uchar, uchar, uint); //页编程
extern uchar copy_back(uchar ,uchar , uchar , uchar , uchar , uchar); //块复制
extern void page_read(uchar ,uchar , uchar) ; //页读
用户377235 2012-12-13 20:49
用户99239 2008-1-15 16:14
你好!我看过你发表的使用F320芯片实现U盘的文章,非常感谢!我在其中学到了一些东西,谢谢!不过我有个问题想请教一下,DBR是程序中固化的,如果通过PC改变分区及相关信息是怎样实现的?mcudata@hotmail.com