Chinaunix首页 | 论坛 | 博客
  • 博客访问: 187267
  • 博文数量: 38
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 424
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-19 12:41
文章分类

全部博文(38)

文章存档

2017年(2)

2016年(1)

2010年(8)

2009年(27)

我的朋友

分类: 嵌入式

2010-02-25 17:55:37

最近公司要试产一款机,在原来的机型上换了新的flash,把sop封装的改成了BGA封装的,这样可以节约面积,方便加防护罩.然后让我评估驱动是否要做修改.本来我对flash驱动理解不是很深入,正好有这个机会学习nor flash驱动和芯片手册.下面把我的学习心得记录如下:

1.刚开始,很多东西都遗忘了,没办法硬头皮从头看起.首先了解目前我们用的flash型号,找到对应flash手册.只有把这个了解清楚才能找到学习的东西.看的是英文资料,虽然很痛苦,好在以前就对nor flash的特性有一些基本的了解.看文档熟悉了只有就1,2个小时就搞定了,我这次用了1天时间 - -b.
 
2.首先了解一下文档刚开始的Distinctive Characteristics,注意几个特性:
a.read/write buffer size
b.sector数和每个sector的size
 
3.了解flash型号的意义
比如T代表TSOP(Thin Small Outline Package)封装; F代表FBGA(Fortified Ball Grid Array)封装.
 
4.memory map
 
从这个memory表可以看出,这个型号的flash有128个sector, 每个sector的大小是128K.
我当时算Addreess Range,发现一个问题,因为从0000000h~000FFFFh算下来大小是2的16次方64K而不是128K.觉得很奇怪.
原因是flash的1个地址对应的是16bits=2Bytes的数据容量,而不是cpu的1个地址对应1个byte.所以要64K*2=128K.
 
由于flash的这种地址对应关系,在硬件设计的时候往往地址线对接cpu的a0会空出来不用,导致cpu地址右移1位才是flash地址:
                 
cpu接flash addr拉线                  flash add拉线
从左图看出cpu的SA[0]是空出来的,也就是SA[1]接flash的A0以此类推...这样可以实现cpu用2个地址去读取flash一个地址上的2个bytes.
 
因此如下代码,需要在将偏移量*2,也就是左移了一位:
#define F_ADDR1  (FLASH_BASE_ADDR + 0x555*2)
#define F_ADDR2  (FLASH_BASE_ADDR + 0x2AA*2)
F_ADDR1和2代表的是CPU地址,0x555和0x2AA代表的是flash地址偏移量.这样才能对应起来.
 
5.通过手册上读取manufacturer ID来封装flashRead接口
void readFlash(volatile unsigned short *des, uchar *buff, int wlen)
{
    int i;
    volatile ushort *pT;
    volatile uchar *pT2;
    ushort ch1;
 
 
    // First Reset the Chip
    *(uchar *)(FLASH_BASE_ADDR) = 0xF0;//为了确保推出autoselect模式.
 
    pT = des;
    pT2 = buff;
    for(i = 0; i < wlen/2; i++)
    {
       ch1 = *pT;
       *pT2 = ch1 & 0x00FF;
       *(pT2+1) = (ch1 & 0xFF00) >> 8;
       pT++;
       pT2 = pT2 + 2;
    }
}
 
 
阅读(2026) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~