xs128 D-Flash读写
#include "includes.h" 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); //等待执行完成 }
/***************************************************************** ** 函数说明:飞思卡尔xs128 DFlash ** 版 本: V0.99 ** 修 改: 庞辉 芜湖联大飞思卡尔工作室 ** 修改日期:2011年09月26日 ** ** 说 明:无 ** ** 版本更新:无 ****************************************************************** **注 意: LED PB0 ** BUTTON PM1 ******************************************************************/ #include "includes.h" /*********************************************************** ** 名 称:void main(void) ** 功 能:主函数 ** 入口参数:无 ** 出口参数:无 ** 使用说明:无 ************************************************************/ 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); //判断读取数据是否正确 if(date_read[0]==0x1111&&date_read[1]==0x2222&&date_read[2]==0x3333&&date_read[3]==0x4444) //判断数据是否正确 { PORTB_PB0 = 0; } } }