请教一个flash编程的问题

tuhuo 2008-09-01 11:48:43
手头有一块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了么?那上面的代码就不对了啊。。。

一直没弄明白,请各位大虾指点
...全文
198 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆 2008-09-18
  • 打赏
  • 举报
回复
所有一切以flash手册为准,你这个是AMD(spansion)的flash. 一切以最终到达flash接口的数据为准,如果CPU的地址线和flash有错位,那么程序中得调整。
zyzhang365 2008-09-02
  • 打赏
  • 举报
回复
flash 芯片手册是从 flash 本身的角度来讲的。也就是说,需要在flash相关地址线上产生需要的模式;如果错开链接,CPU给出的数据需要移位, 但Flash看到的应该不变。供你参考。
zyzhang365 2008-09-02
  • 打赏
  • 举报
回复
Flash 好像有个BYTE选择脚, 选择是否为BYTE模式.
tuhuo 2008-09-02
  • 打赏
  • 举报
回复
我怎么觉得,既然已经错位连接了,地址还需要进行移位么?
当cpu给出的地址为0x01时,flash看到的已经时0x00了,于是把*(unsigned short*)(0x00)送到数据总线,cpu要到的东西已经在这里面了。
tuhuo 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zyzhang365 的回复:]
flash 芯片手册是从 flash 本身的角度来讲的。也就是说,需要在flash相关地址线上产生需要的模式;如果错开链接,CPU给出的数据需要移位, 但Flash看到的应该不变。供你参考。
[/Quote]

不太明白。
我从flash的芯片手册上发现还有一根地址线A-1,应该是Byte模式时连接到cpu的A0。但是Word模式时,cpu的A0根本没有和flash连接啊,flash怎么知道cpu给出的A0是多少呢?
newlife_qqk 2008-09-02
  • 打赏
  • 举报
回复
一块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。

wanqilin 2008-09-02
  • 打赏
  • 举报
回复
关于你这个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 //

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧