2911|7

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教一个flash编程的问题 [复制链接]

手头有一块ARM7的开发板,cpu是Samsung S3C44B0X,ROM为AM29LV160,一块1M*16bit的Flash,挂接在BANK0并配置为16位模式。

我的问题是关于对Flash进行编程的。最简单的,比方说读Flash的Manufacturer ID。根据芯片手册,应该先向0x555写入0xAA,接着向0x2AA写入0x55,然后向0x555写入0x90,最后从0x00读它的ID。用代码表示就是这样:

(*(volatile unsigned short*)(0x555)) = 0xAA;

(*(volatile unsigned short*)(0x2AA)) = 0x55;

(*(volatile unsigned short*)(0x555)) = 0x90;



问题是,cpu和flash的地址线不是对应连接的,而是错开了一位,就像下面这样:
------------------------------------------------
cpu地址线                A21  A20 ...  A2  A1  A0
flash地址线        A20  A19 ...  A1  A0
------------------------------------------------
这样,当cpu给出的地址为0x555时,到flash时不就变成0x2AA了么?那上面的代码就不对了啊。。。

一直没弄明白,请各位大虾指点

最新回复

所有一切以flash手册为准,你这个是AMD(spansion)的flash. 一切以最终到达flash接口的数据为准,如果CPU的地址线和flash有错位,那么程序中得调整。  详情 回复 发表于 2008-9-18 12:47
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
flash 芯片手册是从 flash 本身的角度来讲的。也就是说,需要在flash相关地址线上产生需要的模式;如果错开链接,CPU给出的数据需要移位, 但Flash看到的应该不变。供你参考。      
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 zyzhang365 的回复:
flash 芯片手册是从 flash 本身的角度来讲的。也就是说,需要在flash相关地址线上产生需要的模式;如果错开链接,CPU给出的数据需要移位, 但Flash看到的应该不变。供你参考。      


不太明白。
我从flash的芯片手册上发现还有一根地址线A-1,应该是Byte模式时连接到cpu的A0。但是Word模式时,cpu的A0根本没有和flash连接啊,flash怎么知道cpu给出的A0是多少呢?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
Flash 好像有个BYTE选择脚, 选择是否为BYTE模式.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
关于你这个FLASH的地址问题 其实可以用一个映射的慨念来解释
我这里有一个源码是44B0的 你可以参考一下:
#include "..\Target\def.h"
#ifndef __ROMDEF_H__
#define __ROMDEF_H__

int   SST39VF160_WordProg(INT32U addr,INT16U dat);
void  SST39VF160_SectorErase(INT32U SAaddr);
int   SST39VF160_CheckBlank(INT32U addr,INT32U WordSize);

#define  Writeflash(addr,dat)        *((volatile INT16U *)(addr<<1))=(INT16U)dat
#define  Readflash(addr)                (*((volatile INT16U *)(addr<<1)))

#endif  // __ROMDEF_H //

 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
一块1M*16bit的Flash,挂接在BANK0并配置为16位模式。

============================

从你的硬件配置来看,CPU地址线应该与FLASH的地址线错开一位。
CPU的A1对应着FLASH的A0

因为16位的FLASH,每个地址对应着2个BYTE。
而在计算机系统中,每个地址对应着1个BYTE。
所以在错开一位。。

SO,,你在访问FLASH的某个地址时,地址要向左偏移一位。。。。
比如你要访问FLASH地址0X1,可以这样写:

*(volatile unsigned short *)(0x1 << 1) = 0xffff;

注意要使用unsigned short指针,因为你访问的是2个BTYE。

 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
我怎么觉得,既然已经错位连接了,地址还需要进行移位么?
当cpu给出的地址为0x01时,flash看到的已经时0x00了,于是把*(unsigned short*)(0x00)送到数据总线,cpu要到的东西已经在这里面了。
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

8
 
所有一切以flash手册为准,你这个是AMD(spansion)的flash. 一切以最终到达flash接口的数据为准,如果CPU的地址线和flash有错位,那么程序中得调整。
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表