Board logo

标题: flash问题请教! [打印本页]

作者: fanxing    时间: 2008-3-5 22:22     标题: 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编辑过]


作者: strongchen    时间: 2008-3-6 09:52

0x8000为分页地址区的地址,对这个地址的操作要小心,因为与PPAGE寄存器的值有关。还是把整个PROJECT打包贴出来看看吧。
作者: fanxing    时间: 2008-3-6 13:07

http://bbs.chinaecnet.com/uploadImages/flash.rar

这是PROJECT,斑竹帮看看吧,好像不怎么能用,刚刚学习接触,请斑竹多多指教,谢谢。
作者: strongchen    时间: 2008-3-6 16:15

看过你的PROJECT了,发现主要有两个问题。
第一个问题,必须了解DP256的FLASH是分成4个块的(BANK或BLOCK,参见S12FTS256KV2.pdf的第16页)。程序只能在一个块中对另一个FLASH块进行擦或写的操作,而不能对程序所在的块自身进行擦或写的操作。你要对7000这个地址进行操作,同时你又将程序放入了NON_BANKED区,它们都是处于BLOCK 0中的,这样就有问题了。解决这个问题的办法,只要将程序放入分页区即可。有些应用是将FLASH擦写程序放入RAM中执行,这样就可以对所有的FLASH区进行操作了。
作者: strongchen    时间: 2008-3-6 16:20

第二个问题,还是与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;

作者: fanxing    时间: 2008-3-7 14:23

恩,多谢斑竹,我在好好看看分页,再次感谢斑竹!




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0