关键词: 推荐 flash 文件 系统 揭秘 我们 数据 写
共1条
1/1 1 跳转至页
[推荐]51 flash文件系统DIY(4)___FAT揭秘
有了前面的硬件基础,我们来看如何写并行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 文件 系统 揭秘 我们 数据 写
关键词: 推荐 flash 文件 系统 揭秘 我们 数据 写
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动——B站互动赢积分】活动开启啦! | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |