搜索
bottom↓
回复: 0

C8051F120的flash读写测试,写入不了求解

[复制链接]

出0入0汤圆

发表于 2022-1-27 18:28:28 | 显示全部楼层 |阅读模式
这三个是读写擦除的程序。从文档中下载的。
void FLASH_ByteWrite(FLADDR addr,char byte,bit SFLE)
{
        char SFRPAGE_SAVE = SFRPAGE;
        bit EA_SAVE = EA;
        char PSBANK_SAVE=PSBANK;
        char xdata *data pwrite;
        EA = 0;

    SFRPAGE = LEGACY_PAGE;
   
        if( addr < 0x8000)                                          //bank 0   64KB linear address
        {       
          pwrite = (char xdata *)addr;
          PSBANK &= ~0x30;                 // COBANK = 0x0
      PSBANK |=  0x00;
        } else if(addr < 0x10000)       //bank2  COBANK = 0x1
        {
                addr |= 0x8000;
                pwrite = (char xdata *)addr;
                PSBANK &= ~0x30;//0011 0000
                PSBANK |= 0X10; //0010 0000  
        }else if(addr < 0x18000)       //bank 2
        {
                addr |= 0x8000;
                pwrite = (char xdata *)addr;
                PSBANK &= ~0x30;//0011 0000
                PSBANK |= 0x20; //0010 0000   COBANK = 0x2
        }else {                          //bank 3
                pwrite = (char xdata *)addr;   
                PSBANK &= ~0x30;//0011 0000
                PSBANK |=  0X30; //0010 0000   COBANK = 0x3
        }

       
        FLSCL |= 0x01;  //  鍏佽鐢ㄦ埛鍐欏叆/鎿﹂櫎flash 0:flwe 鍏佽鍐?鎿﹂櫎
        //浣跨敤MOVX鍛戒护鎸囦护鍐檉lash
        PSCTL |= 0x01;  //PSCTL 0:PSWE绋嬪簭瀛樺偍鍣ㄥ啓鍏佽= 1鎸囧悜鍐呴儴flash  1绋嬪簭瀛樺偍鎿﹂櫎鍏佽锛? 2 鍐檉lash璁剧疆浣?
       
        if(SFLE)
        {
                PSCTL |=0x04; // 鍐欎复鏃跺尯
        }
        RSTSRC = 0x02;//RSTSRC 閫夋嫨VDD鐩戣鍣ㄤ綅澶嶄綅婧?
        *pwrite = byte; //浣跨敤MOVX鎸囦护寰€鏈熸湜鐨勫湴鍧€鍐欏叆涓€涓暟鎹瓧鑺?
       
        if(SFLE)
        {
                PSCTL &= ~0x04; //// 鍐欎复鏃跺尯
        }
        PSCTL &= ~0x01;  // MOVX 0锛歅SWE  浣垮緱MOVX鎸囧悜xram鏁版嵁绌洪棿
        FLSCL &= ~0x01;  //FLASH FLWE 绂佹flash鍐欐摝闄?
       
        PSBANK  = PSBANK_SAVE;
        SFRPAGE = SFRPAGE_SAVE;
        EA=EA_SAVE ;              //RESTORE
       
}

unsigned char FLASH_ByteRead(FLADDR addr,bit SFLE)
{
        char SFRPAGE_SAVE = SFRPAGE;
        bit EA_SAVE = EA;
        char PSBANK_SAVE=PSBANK;
        char code *data pread;  //flash read pointer
        unsigned char byte;
    EA=0;
        SFRPAGE = LEGACY_PAGE;
       
   if (addr < 0x8000) {               // 64K linear address
      pread = (char code *) addr;
      PSBANK &= ~0x30;                 // COBANK = 0x0
      PSBANK |=  0x00;
   } else if (addr < 0x10000) {        // BANK 1
      addr |= 0x8000;
      pread = (char code *) addr;
      PSBANK &= ~0x30;                 // COBANK = 0x1
      PSBANK |=  0x10;
   } else if (addr < 0x18000) {        // BANK 2
      addr |= 0x8000;
      pread = (char code *) addr;
      PSBANK &= ~0x30;                 // COBANK = 0x2
      PSBANK |=  0x20;
   } else {                            // BANK 3
      pread = (char code *) addr;
      PSBANK &= ~0x30;                 // COBANK = 0x3
      PSBANK |=  0x30;
   }
       
        if(SFLE)
        {
                PSCTL |= 0x04;
        }
       
        byte = *pread;

        if(SFLE)
        {
                PSCTL &= ~0x04;
        }

        PSBANK  = PSBANK_SAVE;
        SFRPAGE = SFRPAGE_SAVE;
        EA=EA_SAVE ;              //RESTORE
       
        return byte;
}

void Page_Erase(FLADDR addr,bit SFLE)
{
        char SFRPAGE_SAVE = SFRPAGE;
        bit EA_SAVE = EA;
        char PSBANK_SAVE=PSBANK;
        char xdata* data pwrite; //flash write pointer
        EA = 0;
        SFRPAGE = LEGACY_PAGE;

   if (addr < 0x8000) {               // 64K linear address
      pwrite = (char xdata *) addr;
      PSBANK &= ~0x30;                 // COBANK = 0x0
      PSBANK |=  0x00;
   } else if (addr < 0x10000) {        // BANK 2
      addr |= 0x8000;
      pwrite = (char xdata *) addr;
      PSBANK &= ~0x30;                 // COBANK = 0x1
      PSBANK |=  0x10;
   } else if (addr < 0x18000) {        // BANK 2
      addr |= 0x8000;
      pwrite = (char xdata *) addr;
      PSBANK &= ~0x30;                 // COBANK = 0x2
      PSBANK |=  0x20;
   } else {                            // BANK 3
      pwrite = (char xdata *) addr;
      PSBANK &= ~0x30;                 // COBANK = 0x3
      PSBANK |=  0x30;
   }

       
        FLSCL |= 0x01;  // 缃綅FLWE 鍏佽杞欢鍐欐摝闄lash  0
        PSCTL |= 0x03;  // PSEE 鍏佽鎿﹂櫎鎵囧尯0 1
       
        if(SFLE){
                PSCTL |= 0x04;
        }
        RSTSRC = 0x02;//0000 0010
        *pwrite=0;
       
        if(SFLE){
                PSCTL &= ~0x04;
        }
       
        PSCTL &= ~0X03; // PSEE PSWE
        FLSCL &= ~0x01; // FLWE 娓呴櫎

        PSBANK  = PSBANK_SAVE;
        SFRPAGE = SFRPAGE_SAVE;
        EA=EA_SAVE ;              //RESTORE
}

FLADDR start_address = 0x08000;  

void main()
{
        ulong Rd;
   uchar temp_byte = 0x00;


  bit error_flag = 0;


  WDTCN = 0xde;                       // Disable watchdog timer
  WDTCN = 0xad;
        EA=0;
        SYSCLK_Init ();
        PORT_Init();
        UART0_Init();
       ms=40000;
       
       
         Page_Erase (start_address,0);  //1

   FLASH_ByteWrite (start_address, 0xA5,0); //2

   temp_byte = FLASH_ByteRead (start_address,0);//3

   if (temp_byte != 0xA5)//4
   {
      error_flag = 1;
   }
}

//主程序中 1.2.3.4用来测试 结果temp_byte 读出来是0XFF,说明没有写入成功。请教下是什么原因呢

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-16 17:30

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

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