为什么D_FLASH 无法擦除写入数据

2019-07-15 17:20发布

  • uint16   Buffer[]={0x1111,0x2222,0x3333,0x4444};//数据缓存区,只能一次写入四个数据  
  • uint16   data_Address = 0x0000;  
  • uint16   date_read[4];  
  •   
  • /***********************************************************
  • ** 名      称:void DFlash_Init(void)
  • ** 功      能:DFlash初始化  
  • ** 入口参数:无
  • ** 出口参数:无
  • ** 使用说明:无
  • ************************************************************/  
  • void DFlash_Init(void)  
  • {  
  •         while(FSTAT_CCIF==0);            //等待正在处理的FLASH操作完成  
  •         FCLKDIV=0x4E;                    //外部晶振为16M.FLASH时钟不超过1M,具体参照手册  
  •         FCNFG=0x00;                      //禁止中断  
  •         while(FCLKDIV_FDIVLD==0);        //等待时钟设置成功  
  • }  
  •   
  • /***********************************************************
  • ** 名      称:void DFlash_Write(uint16 ADDR16)
  • ** 功      能:向DFLASH写入数据  
  • ** 入口参数:无
  • ** 出口参数:无
  • ** 使用说明:无
  • ************************************************************/  
  • void DFlash_Write(uint16 ADDR16)  
  • {  
  •     while(FSTAT_CCIF==0);   
  •     if(FSTAT_ACCERR)           //判断并清除标志位;  
  •         FSTAT_ACCERR=1;  
  •     if(FSTAT_FPVIOL)           //判断并清除标志位;  
  •         FSTAT_FPVIOL=1;  
  •     FCCOBIX_CCOBIX=0x00;   
  •     FCCOB=0x1110;         //写入命令和高位地址  
  •     FCCOBIX_CCOBIX=0x01;  //地址后16位  
  •     FCCOB=ADDR16;         //写入低16位地址  
  •     FCCOBIX_CCOBIX=0x02;  //写入第一个数据  
  •     FCCOB=Buffer[0];  
  •     FCCOBIX_CCOBIX=0x03;  //写入第二个数据  
  •     FCCOB=Buffer[1];  
  •     FCCOBIX_CCOBIX=0x04;  //写入第三个数据  
  •     FCCOB=Buffer[2];  
  •     FCCOBIX_CCOBIX=0x05;  //写入第四个数据  
  •     FCCOB=Buffer[3];   
  •         
  •     FSTAT_CCIF=1;         //写入执行命令  
  •     while(FSTAT_CCIF==0); //等待执行完毕  
  • }  
  •   
  • /***********************************************************
  • ** 名      称:uint16 DFlash_Read (uint16 destination)
  • ** 功      能:由DFLASH读取数据
  • ** 入口参数:无
  • ** 出口参数:无
  • ** 使用说明:无
  • ************************************************************/  
  • uint16 DFlash_Read (uint16 destination)  
  • {  
  •     uint8   lastepage;          //用于存储EPAGE的值  
  •     uint8   epage;              //用于计算EPAGE的值  
  •     uint16 data;         //读取出的数据  
  •   
  •     lastepage = EPAGE;   //保存EPAGE的值  
  •   
  •     epage = (byte)((DFLASH_LOWEST_START_PAGE)+(destination >>10));   //计算EPAGE  
  •     EPAGE=epage;                                                     //给EPAGE赋值  
  •    
  •     data = READword((destination & (DFLASH_PAGE_SIZE - 1)) + DFLASH_PAGE_WINDOW_START);  //读取页面窗口中的数据  
  •   
  •     EPAGE= lastepage;       //恢复EPAGE的值  
  •   
  •     return(data);  
  • }  
  •   
  • /***********************************************************
  • ** 名      称:void DFlash_Erase(uint16 ADDR16)
  • ** 功      能:擦除DFLASH的一个分区
  • ** 入口参数:无
  • ** 出口参数:无
  • ** 使用说明:无
  • ************************************************************/  
  • void DFlash_Erase(uint16 ADDR16)  
  • {     
  •   while(FSTAT_CCIF==0);  
  •   if(FSTAT_ACCERR)           //判断并清除标志位;  
  •       FSTAT_ACCERR=1;  
  •   if(FSTAT_FPVIOL)           //判断并清除标志位;  
  •       FSTAT_FPVIOL=1;  
  •    
  •   FCCOBIX_CCOBIX=0x00;  
  •   FCCOB=0x1210;           //写入擦除命令和高位地址  
  •   FCCOBIX_CCOBIX=0x01;     
  •   FCCOB=ADDR16;           //写入低16位的地址  
  •   FSTAT_CCIF=1;           //启动执行命令  
  •   while(FSTAT_CCIF==0);   //等待执行完成  
  • }  
  • void main(void)   
  • {  
  •     Start();  
  •     Start_go();  
  •     EnableInterrupts;  
  •       
  •     //设置PB0口LED灯作为指示,读取DFlash正确则亮,否则不亮  
  •     DDRB_DDRB0 = 1;  
  •     PORTB_PB0 = 1;  
  •       
  •     DDRM_DDRM1 = 0;  
  •       
  •     FOREVER()  
  •     {  
  •                 if(PTM_PTM1 == 0)  
  •                 {  
  •                         //确保先擦除后写入  
  •                         DFlash_Erase(data_Address);      
  •                         DFlash_Write(data_Address);         
  •                 }   
  •                 //读取DFlash数据     
  •                 date_read[0]=DFlash_Read(data_Address);   
  •                 date_read[1]=DFlash_Read(data_Address+2);   
  •                 date_read[2]=DFlash_Read(data_Address+4);   
  •                 date_read[3]=DFlash_Read(data_Address+6);   
  •                 //判断读取数据是否正确  
  •                
  •    
  •     }  
  •    
  • }  
  • 这个程序使用在MC9S12XET256上时,无法将数据写入D_FLASH,请大家指导下为什么?第一次用飞思卡尔的单片机作开发


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。