为什么D_FLASH 无法擦除写入数据
时间:10-02
整理:3721RD
点击:
- 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,请大家指导下为什么?第一次用飞思卡尔的单片机作开发
哎,手机看代码就是一坨,没办法,有电脑帮你看看
好好学习13213131313213
** 名 称:void DFlash_Init(void)
** 功 能:DFlash初始化
你在操作前没有初始化
初始化了啊把这个例程烧写到XEP100上可以正常擦除写入
初始化就可以了
DFALSH写之前要解锁
怎么连续读写?
在debug调试模式下codewarrior不会自己更新,小编是怎么确定数据没有正确写入的?
要同时初始化Pflsah
DFALSH跟EEPROM有什么区别啊?