bufan330 发表于 2006-6-5 10:12:30

求助,把程序放在外扩的一片39VF040的flash里,运行时擦写flash后程序就会出错。

我用的ARM AT91 55800,在RAM里运行,擦写flash都没有问题,一旦离线在flash中运行在程序里对flash擦写就会出错。39VF040的手册里说在擦写过程中任何读操作读出的都是随机的数据,请问各位大侠应该如何解决呢?

xnxjf 发表于 2006-6-5 14:08:59

我也正在做这个,但是我不知道该怎样利用单片机对外扩地FLASH读写,我刚接触这个不是很懂,楼主能否把你得代码参考一下啊,谢谢!

bufan330 发表于 2006-6-5 14:33:56

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;       

                }

        }       

}

xnxjf 发表于 2006-6-5 14:43:43

非常感谢,今晚回去研究一下!!

xnxjf 发表于 2006-6-6 10:07:54

大哥,你下面这段是什么意思啊,劳烦解释一下,谢谢

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的控制命令吗?

bufan330 发表于 2006-6-6 15:10:11

你可以参考一下VF040的技术手册,上面都有这些的流程图,只要向它指定的地址写命令就可以了。

gaocen100 发表于 2011-12-7 23:59:18

MARK 学习了

dysxq 发表于 2011-12-10 23:46:46

擦写flash的代码要在ram中执行,在flash里执行,你一擦,下面的指令去哪儿取啊,还有,如果你的中断向量在flash里,那擦写时还要关中断,不然一中断就挂了

HalseyZhong 发表于 2013-8-9 23:45:25

说的很好,必须的在RAM里面执行,否则会自己把自己擦没有了,无法去指令执行。
页: [1]
查看完整版本: 求助,把程序放在外扩的一片39VF040的flash里,运行时擦写flash后程序就会出错。