查看: 4721|回复: 5

[其他] 求救关于 D Flash操作

[复制链接]

该用户从未签到

1

主题

4

帖子

0

新手上路

Rank: 1

积分
9
最后登录
1970-1-1
发表于 2009-11-13 13:46:32 | 显示全部楼层 |阅读模式
公司用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;
 
}
我知道答案 目前已有4人回答
回复

使用道具 举报

该用户从未签到

1

主题

4

帖子

0

新手上路

Rank: 1

积分
9
最后登录
1970-1-1
 楼主| 发表于 2009-11-14 11:27:21 | 显示全部楼层

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的作用!
请高手指点一下!

该用户从未签到

0

主题

6

帖子

0

新手上路

Rank: 1

积分
5
最后登录
1970-1-1
发表于 2009-11-23 22:37:18 | 显示全部楼层

RE:求救关于 D Flash操作

请问写进去D_flash里面的数据怎么读出来啊??请高手指导一下!!

该用户从未签到

12

主题

79

帖子

0

中级会员

Rank: 3Rank: 3

积分
264
最后登录
2020-9-23
发表于 2011-11-5 10:41:08 | 显示全部楼层

回复:求救关于 D Flash操作

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

该用户从未签到

2

主题

33

帖子

0

注册会员

Rank: 2

积分
95
最后登录
1970-1-1
发表于 2012-1-5 09:39:32 | 显示全部楼层

RE:求救关于 D Flash操作

我觉得可以用全局地址来读写用__far指针,应该是可以的。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

38

帖子

0

注册会员

Rank: 2

积分
91
最后登录
1970-1-1
发表于 2012-1-14 15:28:07 | 显示全部楼层

RE:求救关于 D Flash操作

我是来学习的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-8-25 03:46 , Processed in 0.095560 second(s), 25 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表