求助,把程序放在外扩的一片39VF040的flash里,运行时擦写flash后程序就会出错。
我用的ARM AT91 55800,在RAM里运行,擦写flash都没有问题,一旦离线在flash中运行在程序里对flash擦写就会出错。39VF040的手册里说在擦写过程中任何读操作读出的都是随机的数据,请问各位大侠应该如何解决呢? 我也正在做这个,但是我不知道该怎样利用单片机对外扩地FLASH读写,我刚接触这个不是很懂,楼主能否把你得代码参考一下啊,谢谢! void WriteFlash(volatile uchar *addr,unsigned char data){
volatile unsigned char i,t;
//unsigned short j;
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0xa0;
*addr= data;
while(1)
{
i = (*addr)&0x40;
t = (*addr)&0x40;
if(i == t)
{
break;
}
}
//for(j=100;j>0;j--);
}
void BytesWriteFlash(volatile uchar *addr,unsigned char *buffer,unsigned char number)
{
unsigned char n;
volatile unsigned char i,t;
//unsigned short j;
for(n=0;n<number;n++,addr++)
{
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0xa0;
*addr = buffer;
while(1)
{
i = (*addr)&0x40;
t = (*addr)&0x40;
if(i == t)
{
break;
}
}
//for(j=0;j<100;j++);
}
}
void BytesReadFlash(volatile uchar *addr,unsigned char *buffer,unsigned char number)
{
unsigned char n;
for(n=0;n<number;n++)
buffer = *(addr++);
}
//nBlock:0--127
void BlockErase(unsigned char nBlock)
{
volatile unsigned char *block;
unsigned char i,t;
block = (unsigned char *)(BOOT_FLASH_BASE + nBlock*0x1000);
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x80;
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
*block = 0x30;
while(1)
{
i = CMD_ADDR1&0x40;
t = CMD_ADDR1&0x40;
if(i == t)
{
break;
}
}
}
void ChipErase()
{
volatile unsigned char i,t;
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x80;
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x10;
while(1)
{
i = CMD_ADDR0&0x40;
t = CMD_ADDR0&0x40;
if(i == t)
{
break;
}
}
} 非常感谢,今晚回去研究一下!! 大哥,你下面这段是什么意思啊,劳烦解释一下,谢谢
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0xa0;
*addr= data;
while(1)
{
i = (*addr)&0x40; //这是什么意思?
t = (*addr)&0x40;
if(i == t)
{
break;
}
}
尤其
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0xa0;
这是对外扩的39vf040的控制命令吗? 你可以参考一下VF040的技术手册,上面都有这些的流程图,只要向它指定的地址写命令就可以了。 MARK 学习了 擦写flash的代码要在ram中执行,在flash里执行,你一擦,下面的指令去哪儿取啊,还有,如果你的中断向量在flash里,那擦写时还要关中断,不然一中断就挂了 说的很好,必须的在RAM里面执行,否则会自己把自己擦没有了,无法去指令执行。
页:
[1]