首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

求助:MC9S12P128单片机写DFLASH

求助:MC9S12P128单片机写DFLASH

MC9S12P128单片机写DFLASH时,每次所写的数据都写到0X010A和0x010B两个字节中去了,本意是要写到0x4400为首地址的后续地址空间的,请各位帮帮忙看问题出在哪了


u16 Test;
u16 Buffer[4] = {0x0001,0x0002,0x0003,0x0004} ;
u16 *ptr;
void main(void)
{
  __asm SEI;  //可屏蔽中断禁止
  
  ptr = Buffer;
  
  MCU_GPIO_Init();
   
  MCU_CPMU_Init();
   
  PORTA_PA0 = 1;
  
  PORTA_PA1 = 0;
  
  DFlashInit();
  
  DFlashEraseSector(DFLASH_START);

  
  DFlashWrite(DFLASH_START,4,ptr);
  
  
  Test = DFlashRead(DFLASH_START);
  
  if(Test == 0xFFFF)
  {
      PORTA_PA0 = 0;
  
      PORTA_PA1 = 0;
  }
  else
  {
      PORTA_PA0 = 1;
  
      PORTA_PA1 = 1;
  }

        __asm CLI;  //可屏蔽中断使能


  for(;;)
  {
      
  
    //_FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

void DFlashWrite(u32 u32DFlashAddress,u8 u8DataLen,u16 *pu16tr)
{
    u8 i;
   
    __asm SEI;                                  // 可屏蔽中断禁止
    __RESET_WATCHDOG();                         // 软件喂狗
           
    while((FSTAT & FSTAT_CCIF_MASK) == 0);      // 等待FLASH命令操作完成
    FSTAT = 0x30;                               // 清除ACCERR and PVIOL标识
   
    // Flash存储Data数据长度最长为4个16bit数据
    if (u8DataLen > 4)
    {   
        __asm CLI;                                  // 中断使能
        
        //return FlashProgramError;                 // 本次 Flash Program失败
    }
    else if (u8DataLen == 4)  
    {
        // 存储FCCOB参数
        FCCOBIX = 0x00;
        FCCOB = 0x1100; // FCMD = 0x11rogram D-Flash
        //FCCOB = 0x1100 | ((u32DFlashAddress & 0x00004400)>>16); // FCMD = 0x11rogram D-Flash
        
        FCCOBIX = 0x01;
        FCCOB = (u32DFlashAddress & 0x0000FFFF);
        
        for(i=0; i<u8DataLen; i++)          // 填充4个words给FCCOB寄存器,可能有效数据长度不足4words,这时用0xFFFF进行填充
        {   
            FCCOBIX = i+2;
            FCCOB = *pu16tr;
            pu16tr++;
        }
    }
    else
    {
        // 存储FCCOB参数
        FCCOBIX = 0x00;
        FCCOB = 0x1100; // FCMD = 0x11rogram D-Flash
        //FCCOB = 0x1100 | ((u32DFlashAddress & 0x00004400)>>16); // FCMD = 0x11rogram D-Flash
        
        FCCOBIX = 0x01;
        FCCOB = (u32DFlashAddress & 0x0000FFFF);
        
        for(i=0; i<u8DataLen; i++)         // 填充4个words给FCCOB寄存器,可能有效数据长度不足4words,这时用0xFFFF进行填充
        {
            FCCOBIX = i+2;
            FCCOB = *pu16tr;
            pu16tr++;
        }
        for(i=0; i<4-u8DataLen; i++)       // 可能有效数据长度不足4words,这时用0xFFFF进行填充
        {
            FCCOBIX = i+u8DataLen+2;
            FCCOB = 0xFFFF;
        }
    }
    FSTAT |= FSTAT_CCIF_MASK;                    // CCIF清零
   
    while((FSTAT & FSTAT_CCIF_MASK) == 0);       // 等待Flash command命令完成
   
    // 返回是否成功操作标识
    if ((FSTAT & (FSTAT_ACCERR_MASK|FSTAT_FPVIOL_MASK)) != 0)
    {
        __asm CLI;                                  // 中断使能
        //return FlashProgramError;                 // 本次 Flash Program失败
    }
    else
    {
        __asm CLI;                                  // 中断使能
        //return noErr;                             // 本次 Flash Program成功
    }  
}

void DFlashEraseSector(u32 u32DFlashAddress)
{
    __asm SEI;                                  // 可屏蔽中断禁止
   
    while((FSTAT & FSTAT_CCIF_MASK) == 0);      // 等待FLASH命令操作完成
    FSTAT = 0x30;                               // 清除ACCERR and PVIOL标识
     
     
    FCCOBIX = 0x00;
    if (!(u32DFlashAddress & 0x00004400))
    {
        u32DFlashAddress |= 0x00004400;
    }
    //FCCOB = 0x1200 | ((u32DFlashAddress & 0x00004400)>>16);
    FCCOB = 0x1200;
   
    FCCOBIX = 0x01;
    FCCOB = (u32DFlashAddress & 0x0000FFFF);
   
    FSTAT |= FSTAT_CCIF_MASK;                   // CCIF清零
//   FSTAT = 0x80;                               // 开始执行Flash command命令
    while((FSTAT & FSTAT_CCIF_MASK) == 0);      // 等待Flash command命令完成
   
    if((FSTAT & (FSTAT_ACCERR_MASK | FSTAT_FPVIOL_MASK)) != 0)   
    {
        __asm CLI;                             // 中断使能
        //return FlashEraseError;                // Flash Program失败
    }
    else   
    {   
        __asm CLI;                             // 中断使能                                    
        //return noErr;                          // Flash Program成功
    }
}

void DFlashInit(void)
{   
    while((FSTAT & FSTAT_CCIF_MASK) == 0);      // 等待FLASH命令操作完成
   
    if (FSTAT&0x30)                             // Check to see if FACCERR or PVIOL are set
    {
        FSTAT |= 0x30;                          // 清除ACCERR and PVIOL标识
    }
     
    DFPROT = 0xFF;   
   
   
    FCLKDIV = 0x17;                             // fBus = 24MHz , So set flash prescaler

    if (FSTAT&0x30)                             // Check to see if FACCERR or PVIOL are set
    {
        FSTAT |= 0x30;                          // 清除ACCERR and PVIOL标识
    }
}
返回列表