搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2006-6-5 10:12:30 | 显示全部楼层 |阅读模式
我用的ARM AT91 55800,在RAM里运行,擦写flash都没有问题,一旦离线在flash中运行在程序里对flash擦写就会出错。39VF040的手册里说在擦写过程中任何读操作读出的都是随机的数据,请问各位大侠应该如何解决呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2006-6-5 14:08:59 | 显示全部楼层
我也正在做这个,但是我不知道该怎样利用单片机对外扩地FLASH读写,我刚接触这个不是很懂,楼主能否把你得代码参考一下啊,谢谢!

出0入0汤圆

 楼主| 发表于 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[n];

               

                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[n] = *(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;       

                }

        }       

}

出0入0汤圆

发表于 2006-6-5 14:43:43 | 显示全部楼层
非常感谢,今晚回去研究一下!!

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2006-6-6 15:10:11 | 显示全部楼层
你可以参考一下VF040的技术手册,上面都有这些的流程图,只要向它指定的地址写命令就可以了。

出0入0汤圆

发表于 2011-12-7 23:59:18 | 显示全部楼层
MARK 学习了

出0入0汤圆

发表于 2011-12-10 23:46:46 | 显示全部楼层
擦写flash的代码要在ram中执行,在flash里执行,你一擦,下面的指令去哪儿取啊,还有,如果你的中断向量在flash里,那擦写时还要关中断,不然一中断就挂了

出0入0汤圆

发表于 2013-8-9 23:45:25 | 显示全部楼层
说的很好,必须的在RAM里面执行,否则会自己把自己擦没有了,无法去指令执行。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 23:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表