首页>>论坛 >>技术社区 >>飞思卡尔社区论坛 >>16位MCU
|
我要发帖  | 我要投票  | 我要回复  | 收藏
1

求救关于 D Flash操作

版主: 南京老练   
求救关于 D Flash操作
 

公司用S12HY64M开发仪表盘

我在操作D-Flash的时候无法写数据,请各位大侠给我看一下啊,舍命感激!我的代码如下,

如果我函数传入参数为

addr = 0x4400 (data flah起始地址)

data = 0x3456

但是地址0x4400空间始终为0xFFFF也即全部为1 ,没有写成功


      /**********************************************************
*
*
*  VCOCLK - 64MHz, Core Clk - 16MHz, Bus Clk - 8MHz
*

**********************************************************/


void flash_init(void)
{
  if (0x17 == FCLKDIV)
  {
    while (0 == FSTAT_CCIF);
  }
  else
  {
    while (0 == FSTAT_CCIF); 
    FCLKDIV_FDIVLCK = 0;
    FCLKDIV_FDIV = 0x07;
 
  }
 
}


int write_D_flash_word(unsigned int addr, unsigned int data)
{
  
  if(FCLKDIV_FDIVLD ==0)
    FCLKDIV_FDIV = 0x07;
 
  FSTAT_ACCERR = 1;
  //Delay_100us();
  FSTAT_FPVIOL = 1;
 
  FCCOBIX_CCOBIX = 0x00;
  FCCOBHI = 0x11;//Program D-Flash Command
  FCCOBLO = 0x00;//0x00;

    
  FCCOBIX_CCOBIX = 0x01;
  FCCOB = addr;

 
  FCCOBIX_CCOBIX = 0x02;  //word0
  FCCOB = data;

  /*

  FCCOBIX_CCOBIX = 0x03;  //word1
  FCCOB = data;
 
  FCCOBIX_CCOBIX = 0x04;  //word2
  FCCOB = data;
 
   
  FCCOBIX_CCOBIX = 0x05;  //word3
  FCCOB = data;

*/
 
  FSTAT_CCIF = 1;//launch command

  while (FSTAT_CCIF == 0);
   
  if (FSTAT_ACCERR || FSTAT_FPVIOL || FSTAT_MGSTAT)
  {
    FSTAT_ACCERR = 1;
    FSTAT_FPVIOL = 1;
    return -1;
  }
  
   return 1;
}

int erase_D_flash_sector(unsigned int addr)
{
  if(FCLKDIV_FDIVLD ==0)
    FCLKDIV_FDIV = 0x07;
 
  FSTAT_ACCERR = 1;
  //Delay_100us();
  FSTAT_FPVIOL = 1;
 
  FCCOBIX_CCOBIX = 0x00;
  FCCOBHI = 0x12;
  FCCOBLO = 0x00;
 
  FCCOBIX_CCOBIX = 0x01;
  FCCOB = addr;
 
  FSTAT_CCIF = 1;
 
  while (0 == FSTAT_CCIF);
 
   
  if (FSTAT_ACCERR || FSTAT_FPVIOL || FSTAT_MGSTAT)
  {
    FSTAT_ACCERR = 1;
    FSTAT_FPVIOL = 1;
    return -1;
  }
  
   return 1;
 
}


int erase_verify_D_flash_sector(unsigned int addr)
{
  if(FCLKDIV_FDIVLD ==0)
    FCLKDIV_FDIV = 0x07;
 
  FSTAT_ACCERR = 1;
  //Delay_100us();
  FSTAT_FPVIOL = 1;
 
  FCCOBIX_CCOBIX =0x00;
  FCCOBHI = 0x10;
  FCCOBLO = 0x00;
 
  FCCOBIX_CCOBIX = 0x01;
  FCCOB = addr;
 
  FCCOBIX_CCOBIX = 0x02;
  FCCOB = 0x04;
 
  FSTAT_CCIF = 1;
 
  while (FSTAT_CCIF == 0);
   
  if (FSTAT_ACCERR || FSTAT_FPVIOL || FSTAT_MGSTAT)
  {
    FSTAT_ACCERR = 1;
    FSTAT_FPVIOL = 1;
    return -1;
  }
  
   return 1;
 
}

赠送者积分不足,暂停赠送1积分。
此主题悬赏3积分[未解决]。
 
相关主题
回复 链接 收藏
 
RE:求救关于 D Flash操作
 
我自己给解决掉了,呵呵
我如果对0x4400写数据的话,在程序中需要用*(unsigned int*)0x400来读取,或者*(unsigned int *far)0x10400来读取,而不是用*(unsigned int*)0x4400来读取,那是因为要考虑到PPAGE寄存器的分页机制。
但是我尝试了一下,如果PPAGE = 0x01或者 PPAGE = 0x0C,好像都不对D-FLASH的地址读写都不影响,也即不影响0x400或者0x10400的值,这两个地址中的值都是我写入的Data,不知道为什么PPAGE没有影响这两个值
假如我不设置PPAGE的值,这两个地址中读出的值也是我写入的data,所以还是有点不清楚PPAGE的作用!
请高手指点一下!
 
回复 链接 收藏
 
RE:求救关于 D Flash操作
 
请问写进去D_flash里面的数据怎么读出来啊??请高手指导一下!!
 
回复 链接 收藏
 
回复:求救关于 D Flash操作
 

我也在研究关于DFLASH的读取问题,网络上大多数程序时XS、XP的,都用EPAGE这个寄存器,但是HY的没有EPAGE啊,那怎么读取呢?正在研究,有哪位高手可以接楼下阐述一下。不胜感激。

 
“成功41”的理论——1代表性格,其他4个分别代表:勤奋、激情、机遇和智慧。
回复 链接 收藏
 
RE:求救关于 D Flash操作
 
我觉得可以用全局地址来读写用__far指针,应该是可以的。
 
回复 链接 收藏
 
RE:求救关于 D Flash操作
 
我是来学习的
 
回复 链接 收藏
 
我要发帖  | 我要投票  | 我要回复  | 收藏
1