5416|11

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

试着对flash写点内容,现在只写入了一个字节,请帮忙看看 [复制链接]

SST的flash,main函数中定义了一个字符数组:char txt[]="This is a example";然后用此语句  Program(0,txt); 调用下面的函数。

uint8  Program(uint16 Addr, char *Data)
{  volatile uint16  *ip;
   uint16  temp1,temp2;
   
   ip = GetAddr(0x5555);
   ip[0] = 0xaaaa;            
   ip = GetAddr(0x2aaa);
   ip[0] = 0x5555;            
   ip = GetAddr(0x5555);
   ip[0] = 0xa0a0;            
   ip = GetAddr(Addr);  

   while(Data!='\0')
   {
     *ip++ = *Data++;   
   }

现在只能写入第一个字母 T ,其它的就无法再写入,但是在内存中监视这个addr和Data是有变化的。我现在分析有如下原因:
1、现在只对flash的地址0 (ip[0])进行了“初始化”,也就只能对这个地址写入,所以其它的均无法写入。
2、Program(0,txt);这句话也只是针对了flash的0地址,所以只能写入一个字节。
3、暂时这个判断while(Data!='\0')也有问题,见笑了。是个死循环,跳不出来,因为内存里的内容不只有这个数组。我现在关注的是如何将内存里的东西写到flash里,一步一步来吧。

针对上两个疑问,我把Program(0,txt); 中的0地址改用了指针代替,把写入函数改为了:uint8  Program(uint16 *Addr, char *Data) ,出了很多问题。
现在把这些问题写出来,也许对你们来说肯定是很简单的问题,我以前基本没接触到嵌入式编程,希望能得到大家的帮助。谢谢。

最新回复

能调好就行,这么一番折腾下来,你对其工作原来也是了解的很清晰了吧。互相交流学习,MSN不常用,QQ 7617260,长时间在。  详情 回复 发表于 2008-5-30 11:26
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
SST的flash,写操作是多步骤的,不是简单的向某个地址写一下就行的。
具体:(0x5555, 0xaaaa), (0x2aaa, 0x5555), (0x5555, 0xa0a0), (pa, pd)
你的程序中,因为在写0x0之前,有前面4个操作语句,所以可以写入,后面的在循环里面,就没有这些操作,所以失败。

把while( )放到前面
while(Data!='\0')
{
  ip = GetAddr(0x5555);
  ip[0] = 0xaaaa;            
  ip = GetAddr(0x2aaa);
  ip[0] = 0x5555;            
  ip = GetAddr(0x5555);
  ip[0] = 0xa0a0;            
  ip = GetAddr(Addr);  

   *ip++ = *Data++;   
}
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
仔细读datasheet吧
应该是每写入一个字节都要重新走一次时序的
你的代码只走了一次时序  所以只写入了一个字节

另外 注意每次进行块设备的写操作之前要先格式化哦
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 Heaven_Redsky 的回复:
仔细读datasheet吧
应该是每写入一个字节都要重新走一次时序的
你的代码只走了一次时序  所以只写入了一个字节

另外 注意每次进行块设备的写操作之前要先格式化哦


我是把整片全格式化了才开始写的,这样应该没问题吧?
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
(0x5555, 0xaaaa), (0x2aaa, 0x5555), (0x5555, 0xa0a0), (pa, pd)

先别用循环,数组什么的,直接调用下面的函数,向0x0,0x1,0x2...0x10,分别写一个数,然后再读,看看能不能成功。
void WriteOnce(unsigned int addr, unsigned int data)
{
    *((volatile unsigned int*)0x5555) = 0xaaaa;
    *((volatile unsigned int*)0x2aaa) = 0x5555;
    *((volatile unsigned int*)0x5555) = 0xa0a0;

    *((volatile unsigned int*)addr) = data;
}
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢楼上大哥,总算找到一点点希望。
while(Data!='\0')
{
  ip = GetAddr(0x5555);
  *ip = 0xaaaa;            
  ip = GetAddr(0x2aaa);
  *ip = 0x5555;            
  ip = GetAddr(0x5555);
  *ip = 0xa0a0;            
  ip = GetAddr(Addr);  

  *ip++ = *Data++;   
}

果然是那个问题,ip【0】只有第一个地址的时序,现在改为*ip后可以对后面的地址做时序,所以现在可以写进去东西了。

出现的问题是现在我定义的数组是:static char  txt[]="This is an example"; 8位的,可是现在cpu都是按字16位操作的,这个矛盾怎么解决? 现在写入flash的内容都是有一个字节的空格的:T h i s ……
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
把数据指针付值给16位的无符号型指针再试试看
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
这样改
while(Data!='\0')
{
  ip = GetAddr(0x5555);
  *ip = 0xaaaa;            
  ip = GetAddr(0x2aaa);
  *ip = 0x5555;            
  ip = GetAddr(0x5555);
  *ip = 0xa0a0;            
  ip = GetAddr(Addr);  


// 主要是要将addr转换成8bit的,也就是一个字节,这样加操作时才会+1,之前的16bit, 加操作事实上是+2字节
  *((unsigned char*)ip)++ = (unsigned char)(*Data)++;
}
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 8 楼 shuiyan 的回复:
这样改
while(Data!='\0')
{
  ip = GetAddr(0x5555);
  *ip = 0xaaaa;            
  ip = GetAddr(0x2aaa);
  *ip = 0x5555;            
  ip = GetAddr(0x5555);
  *ip = 0xa0a0;            
  ip = GetAddr(Addr);  


// 主要是要将addr转换成8bit的,也就是一个字节,这样加操作时才会+1,之前的16bit, 加操作事实上是+2字节
  *((unsigned char*)ip)++ = (unsigned char)(*Data)++;
}


这样不行,写进去的是乱码。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

10
 
哦,我没地方验证,写的随手了点,sorry。

不过意思就是这样,你只要注意把对16位地址操作的语句,改成对8位地址的操作就行。
16bit的地址加减一次都是2个字节,8bit的地址加减一次是1个字节。

This 这些都是一个字节的ASCII码。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

11
 
试了下把调用函数的data改为了16位的,uint8  Program(uint16 Addr, uint16 *Data) ,使之和地址位数对齐,这样让字符串的指针也一次加一个字,对应就没问题了。
感谢shuiyan大哥提醒。如果有机会希望能交个朋友,帮了我很多。我的msn:showluck@hotmail.com
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

12
 
能调好就行,这么一番折腾下来,你对其工作原来也是了解的很清晰了吧。互相交流学习,MSN不常用,QQ 7617260,长时间在。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表