anshaoyuan 发表于 2022-1-27 18:28:28

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

这三个是读写擦除的程序。从文档中下载的。
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)       //bank2COBANK = 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鎸囧悜鍐呴儴flash1绋嬪簭瀛樺偍鎿﹂櫎鍏佽锛? 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 鍏佽杞欢鍐欐摝闄lash0
        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,说明没有写入成功。请教下是什么原因呢
页: [1]
查看完整版本: C8051F120的flash读写测试,写入不了求解