nnimo 发表于 2014-5-12 21:29:02

【经验分享】飞思卡尔9s12xs128对Dflash读写代码的解析

1.飞思卡尔9s12xs128有关函数的代码

#include "includes.h"

uint16   Buffer[]={0x1111,0x2222,0x3333,0x4444};//数据缓存区,只能一次写入四个数据
uint16   data_Address = 0x0000;
uint16   date_read;

/***********************************************************
** 名      称: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;
    FCCOBIX_CCOBIX=0x03;//写入第二个数据
    FCCOB=Buffer;
    FCCOBIX_CCOBIX=0x04;//写入第三个数据
    FCCOB=Buffer;
    FCCOBIX_CCOBIX=0x05;//写入第四个数据
    FCCOB=Buffer;   
      
    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);   //等待执行完成
}


2 . 飞思卡尔9s12xs128读写操作的发光管指示


/*****************************************************************
**函数说明:飞思卡尔xs128   DFlash                                                   
**说      明:无                                                            
******************************************************************
**注      意: 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=DFlash_Read(data_Address);   
                date_read=DFlash_Read(data_Address+2);   
                date_read=DFlash_Read(data_Address+4);   
                date_read=DFlash_Read(data_Address+6);   
                //判断读取数据是否正确
                if(date_read==0x1111&&date_read==0x2222&&date_read==0x3333&&date_read==0x4444)//判断数据是否正确
                {
                        PORTB_PB0 = 0;
                }   
    }
   
}

zndz410 发表于 2014-5-13 08:31:42

谢谢分亨,顶一下。

FSL_TICS_ZJJ 发表于 2014-5-13 10:50:57

楼主最好把工程也放上来,这样大家拿到就可以跑了。

kingie2006 发表于 2014-5-22 13:15:07

FSL_TICS_ZJJ 发表于 2014-5-13 10:50
楼主最好把工程也放上来,这样大家拿到就可以跑了。

是的,需要工程文件,因为貌似需要设置prm文件的。

jiang887786 发表于 2014-7-6 22:59:11

呵呵。现在x系列的cpu帖子也多了。

wangkdd 发表于 2014-7-7 09:18:24

{:handshake:} 辛苦辛苦了
页: [1]
查看完整版本: 【经验分享】飞思卡尔9s12xs128对Dflash读写代码的解析