首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

flash问题请教!

flash问题请教!

我用的是DP256,写flash在0x6000可以,但地址换成0x8000就不行了为什么呢?
还有就是编了个擦除程序,不好使,不知道是什么问题,请斑竹指教。谢谢!


byte EraseSectorInternal(dword Addr)
{ _asm SEI;
FSTAT= 0x30;
while(FSTAT_CBEIF==0){ i++;
}
//*(volatile word *) (Addr&0xFFFF) = 0x10;
ldata=0x1234;
add= (word *)Addr;

*add= ldata;
FCMD = 0x40; // Word program command命令寄存器,flash擦除512操作
FSTAT_CBEIF =1; // Clear flag command buffer empty

while(FSTAT_CBEIF==0);
//while(FCNFG_CCIE == 1); // Enable interrupt
//FSTAT;
while(FSTAT_CCIF==0);
ERR_OK=1;
return ERR_OK;
//err=*add; // OK
_asm CLI;
}

[此贴子已经被作者于2008-3-5 22:22:04编辑过]

忙起来了!
0x8000为分页地址区的地址,对这个地址的操作要小心,因为与PPAGE寄存器的值有关。还是把整个PROJECT打包贴出来看看吧。
海纳百川  有容乃大
http://bbs.chinaecnet.com/uploadImages/flash.rar

这是PROJECT,斑竹帮看看吧,好像不怎么能用,刚刚学习接触,请斑竹多多指教,谢谢。
忙起来了!
看过你的PROJECT了,发现主要有两个问题。
第一个问题,必须了解DP256的FLASH是分成4个块的(BANK或BLOCK,参见S12FTS256KV2.pdf的第16页)。程序只能在一个块中对另一个FLASH块进行擦或写的操作,而不能对程序所在的块自身进行擦或写的操作。你要对7000这个地址进行操作,同时你又将程序放入了NON_BANKED区,它们都是处于BLOCK 0中的,这样就有问题了。解决这个问题的办法,只要将程序放入分页区即可。有些应用是将FLASH擦写程序放入RAM中执行,这样就可以对所有的FLASH区进行操作了。
海纳百川  有容乃大
第二个问题,还是与FLASH的分块有关。DP256的FLASH分为4块,那么它的控制和状态寄存器也相应地分成4组,需要通过FCNFG中的BKSEL位来选择对哪一块进行操作。而且,如果其中任意一组的状态寄存器中有错误,都无法对FLASH进行操作。所以在擦写操作之前,要加这么一段代码,对所有4组状态寄存器进行检测和清零:
FCNFG_BKSEL = 0;
while(FSTAT & 0x30) FSTAT |= 0x30;
FCNFG_BKSEL = 1;
while(FSTAT & 0x30) FSTAT |= 0x30;
FCNFG_BKSEL = 2;
while(FSTAT & 0x30) FSTAT |= 0x30;
FCNFG_BKSEL = 3;
while(FSTAT & 0x30) FSTAT |= 0x30;

FCNFG_BKSEL = 0;
海纳百川  有容乃大
恩,多谢斑竹,我在好好看看分页,再次感谢斑竹!
忙起来了!
返回列表