Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97803
  • 博文数量: 24
  • 博客积分: 431
  • 博客等级: 一等列兵
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-24 09:44
文章分类
文章存档

2013年(1)

2012年(23)

分类: 嵌入式

2012-10-05 16:43:15

   一般对于某一类的NAND FLASH,在其内部都会保存自身相关的一些信息,如制造商码,产品码以及产品内部信息(如页大小)等。在一般系统设计过程中,就是根据这些信息来设计驱动程序。例如,先读取产品码,根据不同的产品码调用不同的驱动程序,也就是所谓的支持多种NAND FLASH启动。
   这些信息一般在数据手册上会有相关的数据。基本流程
   (1)发送读ID命令。(2)发送地址0。 (3)延时一会儿。(4)读取5个字节的ID即可。

点击(此处)折叠或打开

  1. void NF_ReadID(unsigned char *buf)
  2. {    
  3.     int i;
  4.     NF_Enable();
  5.     NF_Enable_RB();
  6.     NF_Send_Cmd(CMD_READID);// read id command
  7.     NF_Send_Addr(0x0);
  8.     for ( i = 0; i < 100; i++ );//延时,有个时间tAR    
  9.     *buf     = NF_Read_Byte();
  10.     *(buf+1)= NF_Read_Byte();
  11.     *(buf+2)= NF_Read_Byte();
  12.     *(buf+3)= NF_Read_Byte();
  13.     *(buf+4)= NF_Read_Byte();
  14.      NF_Disable();
  15. }
NAND FLASH的型号K9F2G08U0B就支持随机读写,也就是支持单字节读写。随机写操作基本流程
(1)发送页写入命令0x80。(2)发送页地址。(3)发送随机写发起命令0x85。(4)发送页内地址。(5)发送随机写确认命令0x10,NAND FLASH收到该命令。(6)检测忙信号,等待数据写入完成。
   注意:因为页地址指的是该页距离第0块第0页的绝对地址,所以需要5个地址周期(NAND FLASH 5地址周期)。页的绝对地址的计算方法与前文讲的一致,即页的绝对地址=块号*64+页号,第2次发送地址时,该地址是所写入的数据在该页中的地址,因为每一页大小是2K+64字节,所以,地址线需要A0~A11,因此需要2个地址周期。
   随机读操作基本流程:
 (1)发送页读取命令0x00。
 (2)发送页地址。
 (3)发送页读取确认命令0x30,NAND FLASH会自动将该页数据读取到内部的数据寄存器中。
 (4)发送随机读发起命令0x05。
 (5)发送页内地址。
 (6)发送随机读确认命令0xE0。
  (7) 检测忙信号,等待数据写入完成。
在nand.h中增加随机读,写操作命令的宏定义,同时增加对随机读,写函数的声明:

点击(此处)折叠或打开

  1. #define CMD_RANDOMREAD1    0x05     //随意读命令周期1
  2. #define CMD_RANDOMREAD2     0xE0     //随意读命令周期2
  3. #define CMD_RANDOMWRITE     0x85     //随意写命令
  4. extern unsigned char NF_RamdomRead(unsigned int block,unsigned int page,unsigned int add);
  5. extern unsigned char NF_RamdomWrite(unsigned int block,unsigned int page,unsigned int add,unsigned char dat) ;
在nand.c文件中增加上述两个函数:
 

点击(此处)折叠或打开

  1. unsigned char NF_RamdomRead(unsigned int block, unsigned int page, unsigned int add)
  2. {
  3.     unsigned char buf ;
  4.     unsigned int page_number = (block<<6) + page;
  5.     NF_Reset();            
  6.     NF_Enable();
  7.     NF_Enable_RB();     
  8.     NF_Send_Cmd(CMD_READ1);                
  9.     NF_Send_Addr(0x00);
  10.     NF_Send_Addr(0x00);
  11.     NF_Send_Addr((page_number) & 0xff);
  12.     NF_Send_Addr((page_number >> 8) & 0xff);
  13.    NF_Send_Addr((page_number >> 16) & 0xff);
  14.    NF_Send_Cmd(CMD_READ2); //页读命令周期2:0x30
  15.    NF_Check_Busy();
  16.    NF_Send_Cmd(CMD_RANDOMREAD1);
  17.                 
  18.    NF_Send_Addr((char)(add&0xff));
  19.    NF_Send_Addr((char)((add>>8)&0x0f));     
  20.    NF_Send_Cmd(CMD_RANDOMREAD2);     
  21.    NF_Check_Busy();
  22.    buf = NF_Read_Byte() ;
  23.    NF_Disable(); //关闭片选    
  24.    return buf; //读取数据
  25. }


  26. unsigned char NF_RamdomWrite(unsigned int block,unsigned int page, unsigned int add, unsigned char dat)
  27. {
  28.     unsigned int page_number = (block<<6)+page;//计算页的绝对地址
  29.     NF_Enable();//打开NAND FLASH
  30.     NF_Enable_RB(); //开启忙信号检测功能
  31.     
  32.     NF_Send_Cmd(CMD_WRITE1);//发送页写入命令0x80     
  33.     NF_Send_Addr(0x00); //发送页绝对地址
  34.     NF_Send_Addr(0x00);
  35.     NF_Send_Addr((page_number) & 0xff);
  36.     NF_Send_Addr((page_number >> 8) & 0xff);
  37.    NF_Send_Addr((page_number >> 16) & 0xff);
  38.    NF_Send_Cmd(CMD_RANDOMWRITE);
  39.    NF_Send_Addr((char)(add&0xff));
  40.    NF_Send_Addr((char)((add>>8)&0x0f));
  41.    NF_Send_Data(dat);
  42.    NF_Send_Cmd(CMD_WRITE2);     
  43.    NF_Check_Busy();    
  44.    NF_Disable();
  45. }


  
阅读(8026) | 评论(0) | 转发(0) |
0

上一篇:NAND FLASH原理与实验

下一篇:中断控制系统

给主人留下些什么吧!~~