Chinaunix首页 | 论坛 | 博客
  • 博客访问: 541345
  • 博文数量: 150
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 1861
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-17 00:19
文章分类

全部博文(150)

文章存档

2011年(1)

2009年(14)

2008年(135)

我的朋友

分类:

2008-03-23 23:43:48

转载的!!!
同时要联想阅读:http://blog.chinaunix.net/u1/58640/showart_459199.html

很好的资料:

文件:S3C44B0X存储控制器功能及应用.pdf
大小:1849KB
下载:下载

1

29LV160TE芯片具有3种擦除方式:整片擦除、扇区擦除和快擦除。主要来看进行扇区擦除。
 参考表中扇区擦除的操作流程,由此我们得到扇区擦除子程序的主体如下:


void F29LV160_EraseSector(int targetAddr)
{
    Uart_Printf("Sector Erase is started!\n");
    _RESET( );               //芯片复位
    _WR(0x555,0xaa);
    _WR(0x2aa,0x55);
    _WR(0x555,0x80);
    _WR(0x555,0xaa);
    _WR(0x2aa,0x55);
    _WR(BADDR2WADDR(targetAddr),0x30);
    _WAIT( );                 //等待擦除结束
    _RESET( );              //芯片复位
}
其中 _WR(addr,data)是写入一个字函数。addr 为写入数据的目标地址,由于 data 为 16 位字而不是字节,addr 也是字地址。对处理器而言地址是以字节为单位的,因此,addr 必须加以调整,左移 1 位。
_ WR(addr,data) 函数:
    #define _WR(addr,data)  *((U16 *)(addr<<1))=(U16)data
BADDR2WADDR(Addr)函数:
#define BADDAZWADDR(Addr)  (Addr>>1)

2

整片擦除之后,就能够在 flash 的任意地址中进行写入操作了。参考表,得到字写入子程序的主体如下:

int F29LV160_ProgFlash(U32 realAddr,U16 data)
{
    volatile U16 *tempPt;
    int temp,count=0;
    tempPt=(volatile U16 *)realAddr;
    _WR(0x555,0xaa);
    _WR(0x2aa,0x55);
    _WR(0x555,0xa0);
    *tempPt=data;
    return _WAIT( );
}


3不会这里,有人知道吗?

在写入操作的最后,有一个判断写入是否完成的_WAIT()的过程。
         在这里我们采用 Toggle bit(翻转位)的方法检测 DQ6 脚的输出,若翻转停止则表示写入完成:



int _WAIT(void) //检测DQ6输出是否停止翻转

{
      volatile U16 flashStatus,old;
      old=*((volatile U16 *)0x0);
      while(1)
      {
        flashStatus=*((volatile U16 *)0x0);
        if( (old&0x40) == (flashStatus&0x40))
            break;
if( flashStatus&0x20 ) //测试超时标志位DQ5

        {
            old=*((volatile U16 *)0x0);
            flashStatus=*((volatile U16 *)0x0);
            if( (old&0x40) == (flashStatus&0x40) ) return 1; //无翻转

            else return 0; //翻转

        }
        old=flashStatus;
    }
    return 1;
}


存储器组设计和控制
    S3C44B0X 有 6 组 ROM/SRAM(ROM0 组为 Boot ROM)和 2 组 ROM/SRAM/FP/EDO/SDRAM. S3C44B0X 中的系统管理能够通过 S/W 控制每组的访问时间、数据总线宽度,ROM/SRAM 组的访问时间和 FP/EDO/SDRAM 组被系统管理寄存器中的 BANKCON0-7 和 BANKCON6-7 控制。组 6-7 的类型需要相同.(例如 ROM&ROM,SDRAM&SDRAM)每组 ROM/SRAM/DRAM 的数据宽度受 BWSCON 控制寄存器控制。   ROM 组 0 用于 Boot ROM 组,因此组 0 受 H/W 控制,OM[1:0]用于这个目的的。 当系统复位时,通过专用的命令,LDMIA和STMIA对 BWSCON,BANKCON0-7,BANKSIZE, MRSRB6/7实施控制。例如下面代码用来配置特殊功能寄存器。

对特定地址的写入和读出操作:
 #define _WR(addr,data)    *((U16 )(addr<<1))=(U16)data

#define _RD(addr) ( *((U16 *)(addr<<1)) )

阅读(785) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~