这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [推荐]51 flash文件系统DIY(4)___FAT揭秘

共1条 1/1 1 跳转至

[推荐]51 flash文件系统DIY(4)___FAT揭秘

菜鸟
2002-10-22 22:20:04     打赏
有了前面的硬件基础,我们来看如何写并行flash,写并行flash就好像我们写RAM一样,只不过并行flash操作比起RAM来要慢很多,需要注意片子为了防止flash上电和平时意外被改写,都有数据软件保护功能,在写之前需要送出几条特殊的指令才能将数据写入flash, flash的写入也是以扇区为单位进行的。我们不知到软件保护功能是否打开,干脆就在每次 写之前都执行一次软件保护写。 假设我们在译码时为29C040分配的地址为0x6800为起始的4K地址空间,373页面寄存器的 地址为0x6300。芯片如果数据保护是打开的datasheet上要求在写入数据前先要将 0xaa写入地址0x5555 0x55写入地址0x2aaa 0xa0写入地址0x5555 由于我们高位地址是用74373锁存的,而flash地址又以0x6800为起始的地方所以我们怎么送 出指令呢?以第一条指令为例:要保证29C040的地址线为0x5555则 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 0x5555 二进制: 0 0 0 0 1 0 1 0 1 0 1 373锁存高八位故应为: 0 0 0 0 1 0 1 0 29C040的低11位地址: X X X X X X X X 1 0 1 又要保证地址落在0x6800起始的4K空间中所以A15 A14 A13 A12 A11应为 0 1 1 0 1 和低11位地址合成16位地址就是 0 1 1 0 1 1 0 1 所以我们先要向373页面寄存器写入00001010B(0AH),然后向(01101101 01010101B)(6D55H) 写入0xaa; 我们分析了第一条指令的操作方法,另外两条怎么操作你就自己分析吧。 送出上面的三条指令后就可以送入数据了,一次需要送入一个扇区的数据,在这里为 256个字节,256个字节必须一次性写入,字节之间间隔不能超过150us,否则后面的数据就写 不进去,为了防止其他中断函数的干扰,所以在送数据期间要禁止中断。数据送完后,延时 10ms数据就被写进flash中。今天(2002.10.16)论坛有人问用检测DQ7的方法,来检查是否已 经写完,这个我没有做过试验,这里就不好说什么了,也欢迎那位兄弟一起来讨论,有了结 果后告诉大家。 我们的flash低11位有2K的空间。高8位地址由页面寄存器锁存,所以先要将地址高位送 到页面寄存器。为了方便flash的编程,我们先来定义一些宏,把它放到flash.h里面。 #ifndef _FLASH #define _FLASH #define FILE_PAGE_PORT XBYTE[0x6300] /*页面寄存器地址 */ #define FILE_PAGE_SIZE 2048 /*页面大小 */ /*flash读写端口指针*/ #define FILE_DATA_PTR ((unsigned char xdata *)(0x6800)) #define SECTOR_SIZE 256 /*扇区大小 */ #define WRITE_CYCLE_TIME 10 /*flash写入延时10ms*/ void WriteSector(uchar * buf,uint sector,uint len); void ReadSector(uchar * buf,uint sector); #endif 再新建一个flash.c文件,在其中添加WriteSector函数 #include "general.h" #include "flash.h" #include "i2c.h" #ifndef USE_I2C_FLASH /***********************************************/ 将uchar *buf中的长度为uint len的数据写入flash 的uint sector扇区 ,超出扇区长度的数据将会被忽略 /***********************************************/ void WriteSector(uchar * buf,uint sector,uint len) { uint i,n,offset; /********下面的指令为了防止SDP被打开过导致无法写入**********/ FILE_PAGE_PORT=0x0a; *((uchar xdata *)0x6d55)=0xaa; FILE_PAGE_PORT=0x05; *((uchar xdata *)0x6aaa)=0x55; FILE_PAGE_PORT=0x0a; *((uchar xdata *)0x6d55)=0xa0; /***********************************************************/ FILE_PAGE_PORT=sector/(FILE_PAGE_SIZE/SECTOR_SIZE); /*计算页面寄存器的值*/ offset=(sector%(FILE_PAGE_SIZE/SECTOR_SIZE))*SECTOR_SIZE; /*计算写入扇区页面偏 移*/ n=(len>SECTOR_SIZE)?SECTOR_SIZE:len; EA=0; for(i=0;i



关键词: 推荐     flash     文件     系统     揭秘     我们     数据         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]