查看: 4517|回复: 2

S08DZ FlASH擦除、写入通过,读出的Flash 数据还是0xFF?

[复制链接]

该用户从未签到

13

主题

23

帖子

0

新手上路

Rank: 1

积分
69
最后登录
1970-1-1
发表于 2013-11-26 23:35:10 | 显示全部楼层 |阅读模式
 
S08DZ FlASH擦除、写入通过,读出的Flash 数据还是0xFF?下面是代码

<span style="font-size: medium">/*---------------------------------------------------------*/
#include       /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */


typedef unsigned char uint8;
typedef unsigned int  uint16;
uint8 test[2]={7,8};
/*************************************************************/
/*                  初始化总线时钟PEE模式                    */
/*              外部晶振频率为4MHz,总线频率16MHz            */
/*************************************************************/
void INIT_MCG(void)
{
  MCGC2=0x36; //0011 0110   
  while(!MCGSC_OSCINIT);     
  MCGC1=0xb8;
  while(MCGSC_IREFST);
  while(MCGSC_CLKST!=0b10);
  MCGC2_LP = 1;
  MCGC1 = 0x90;
//  MCGC3 = 0x48;  //0100 1000 Fbus=16MHz
   MCGC3 = 0x44;  //0100 1000 Fbus=8MHz
  MCGC2_LP = 0;
  while(!MCGSC_PLLST);
  while(!MCGSC_LOCK);
  MCGC1 = 0x10;  //0001 0000
  while(MCGSC_CLKST!=0b11);
  //FCDIV=0x4A;  Fbus=16MHz-- 180kz
   FCDIV=0x39;   //
}

void INIT_SCI(void)
{
  SCI1BDH = 0x00;
  SCI1BDL = 0x68;       //设置SCI1波特率为9600
  SCI1C1 = 0x00;        //设置SCI1为正常模式,八位数据位,无奇偶校验
  SCI1C2 = 0x0c;        //允许接收和发送数据,禁止中断功能
}


void SCI_send(unsigned char data)
{
  while(!SCI1S1_TDRE);         //等待发送数据寄存器(缓冲器)为空
  SCI1D = data;
}

//-------------------------------------------------------------------------*
//函数名: ErasePage
//功  能: Flash页擦除  
//参  数: addr:页内任意地址
//        data:任意1数据
//返  回: 1 - 失败,0 - 成功
//说  明: 无
//-------------------------------------------------------------------------*
uint8 ErasePage(uint16 addr)
{
    if (FSTAT_FACCERR)//检查FACCERR位,若为1则清除该位                     
        //FSTAT = FSTAT | 0x10;                     //向FACCERR写入1,来清除FACCERR
        FSTAT_FACCERR=1;
  
    (*((volatile unsigned char *)(addr))) = 0x00; //向Flash地址中写入1字节数据
    FCMD = 0x40;                                  //页擦除指令
   
    if(FSTAT_FCBEF==0)
      FSTAT_FCBEF=1;  //置FCBEF为1
   
   
    //等待至少4个总线周期
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
   // asm("NOP");
   // asm("NOP");
   // asm("NOP");
    //检查FACCERR或FVIOL位是否为1
    if (FSTAT_FPVIOL|FSTAT_FACCERR)
        return 1;           //出错
   
    //等命令完成
    while (!FSTAT_FCCF);  
     return 0;
}


//-------------------------------------------------------------------------*
//函数名: WriteFlash
//功  能: Flash字节写入  
//参  数: buff:源数据缓冲区地址
//        flashaddr:要写入的Flash起始地址
//        len:写入字节数
//返  回: 1 - 失败,0 - 成功
//说  明: 无
//-------------------------------------------------------------------------*
uint8 WriteFlash(uint8 *buff,uint16 flashaddr,uint16 len)
{
    uint16 i;
    uint8 Ret;
    for(i=0; i
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2013-11-27 10:15:18 | 显示全部楼层

    RE:S08DZ FlASH擦除、写入通过,读出的Flash 数据还是0xFF?

    1、写FLASH的时候请把中断全部关闭
    2、请把FLASH代码拷贝到RAM中执行
    使用代码例子:
    #pragma DATA_SEG MySeg
    static char foo(void) {
      static char i = 0; /* place this variable into MySeg */
      return i++;
    }
    #pragma DATA_SEG DEFAULT
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13

    主题

    23

    帖子

    0

    新手上路

    Rank: 1

    积分
    69
    最后登录
    1970-1-1
     楼主| 发表于 2013-11-27 15:23:14 | 显示全部楼层

    回复:S08DZ FlASH擦除、写入通过,读出的Flash 数据还是0xFF?

     你提到的两点我都进行了处理,读出还是0xff.我移植官方的FLASH例程也是一样的情况,难道是文件配置或硬件问题?
    下面是我移植官方例程的代码




    /*---------------------------------------------------------*/
    #include       /* common defines and macros */
    #include "derivative.h"      /* derivative-specific definitions */


     #pragma MESSAGE DISABLE C1805


    #define Page_Erase   PGM[21]=0x40; temp = ((unsigned char(*)(unsigned int))(PGM))
    #define Program_Byte PGM[21]=0x20; temp =((unsigned char(*)(unsigned int, unsigned char))(PGM))


     volatile unsigned char PGM[59]  = {  
    0x87,0xC6,0x18,0x25,0xA5,0x10,0x27,0x08,0xC6,0x18,0x25,0xAA,0x10,0xC7,0x18,0x25,
    0x9E,0xE6,0x01,0xF7,0xA6,0x20,0xC7,0x18,0x26,0x45,0x18,0x25,0xF6,0xAA,0x80,0xF7,
    0x9D,0x9D,0x9D,0x9D,0x45,0x18,0x25,0xF6,0xF7,0xF6,0xA5,0x30,0x27,0x04,0xA6,0xFF,
    0x20,0x07,0xC6,0x18,0x25,0xA5,0x40,0x27,0xF9,0x8A,0x81};


    /*************************************************************/
    /*                  初始化总线时钟PEE模式                    */
    /*              外部晶振频率为4MHz,总线频率16MHz            */
    /*************************************************************/
    void INIT_MCG(void) 
    {
      MCGC2=0x36;        
      while(!MCGSC_OSCINIT);     
      MCGC1=0xb8;
      while(MCGSC_IREFST);
      while(MCGSC_CLKST!=0b10);
      MCGC2_LP = 1;
      MCGC1 = 0x90;
      MCGC3 = 0x48;     
      MCGC2_LP = 0;
      while(!MCGSC_PLLST);
      while(!MCGSC_LOCK);
      MCGC1 = 0x10;
      while(MCGSC_CLKST!=0b11);


      FCDIV=0x4A;



     void INIT_SCI(void) 
    {
      SCI1BDH = 0x00;
      SCI1BDL = 0x68;       //设置SCI1波特率为9600
      SCI1C1 = 0x00;        //设置SCI1为正常模式,八位数据位,无奇偶校验
      SCI1C2 = 0x0c;        //允许接收和发送数据,禁止中断功能 
    }




     void SCI_send(unsigned char data) 
    {
      while(!SCI1S1_TDRE);         //等待发送数据寄存器(缓冲器)为空
      SCI1D = data;
    }


     unsigned char Flash_Read(unsigned int addr)
     {
       return*(unsigned char*)addr;
     }


    /*************************************************************/
    /*                         主函数                            */
    /*************************************************************/
    void main(void) { 
    unsigned char temp,dat_buffer;
            DisableInterrupts;//屏蔽中断
      INIT_MCG();
      INIT_SCI();
      SOPT1=0;     //关闭看门狗
      PTDDD_PTDDD0=1;
      PTDD_PTDD0=1;
      //EnableInterrupts;
       SCI_send('O');
     
      temp = Page_Erase(0xF000);       //execute Erase routine
      if(temp==0xFF)   PTDD_PTDD0=~PTDD_PTDD0;         //an error occurred erase routine
     
       temp = Program_Byte(0xF000,7);
        if(temp==0xFF)  PTDD_PTDD0=~PTDD_PTDD0;
     
           dat_buffer=Flash_Read(0xF000);//读FALSH地址数据
          SCI_send(dat_buffer);


      for(;;) 
      {
         
         
      } 
    }
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-3 12:48 , Processed in 0.085346 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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