NandFlash读数据方式

1.页读,读出页中主数据区的所有数据,提供页地址(行地址)

2.随机读,读出页中指定的存储单元的数据,提供页地址(行地址)和页内偏移(行地址)

代码编写

1.根据NandFlash中的读时序图写出工作流程,可以通过在芯片手册中搜索operation找到相关描述

2.主要关心的是IO脚上时序的变化

3.初始化闪存分为初始化闪存控制器和闪存芯片

4.对位操作

4.1.清零

x &= ~(y<<z)   对x的z位开始的y清零

4.2.置1

x |= y<<z   对x的z位开始的y置1

4.3.取数

x & y<<z   取出x的第z位开始的y

4.4.置数

x = y

/********************************************************************
*名称:flash
*作者:D
*时间:2015.11.08
*功能:闪存驱动
********************************************************************/ /********************************************************************
* 宏定义
********************************************************************/
#define NFCONF ( *((volatile unsigned long *)0x4E000000) ) //闪存配置寄存器
#define NFCONT ( *((volatile unsigned long *)0x4E000004) ) //闪存控制寄存器
#define NFCMMD ( *((volatile unsigned long *)0x4E000008) ) //闪存命令寄存器
#define NFADDR ( *((volatile unsigned long *)0x4E00000C) ) //闪存地址寄存器
#define NFDATA ( *((volatile unsigned char *)0x4E000010) ) //闪存数据寄存器
#define NFSTAT ( *((volatile unsigned long *)0x4E000020) ) //闪存状态寄存器 #define PAGE_SIZE 2048 //页大小 /********************************************************************
* 函数原型声明
********************************************************************/
void init_flash();
void init_flash_controller();
void reset_flash_chip(); void read_flash(unsigned long src, unsigned long dst, int len);
void read_page_flash(unsigned long page, unsigned char *buf); /********************************************************************
*名称:init_flash
*功能:初始化闪存
*********************************************************************/
void init_flash(){
//初始化闪存控制器
init_flash_controller(); //重置闪存芯片
reset_flash_chip();
} /********************************************************************
*名称:init_flash_controller
*功能:初始化闪存控制器
*********************************************************************/
void init_flash_controller(){
//初始化闪存配置寄存器
NFCONF = (1<<12)|(1<<8)|(1<<4); //设置TACLS:1 TWRPH0:1 TWRPH1:1 //初始化闪存控制寄存器
NFCONT = (1<<1)|(1<<0); //设置Reg_nCE:1 MODE:1
} /********************************************************************
*名称:reset_flash_chip
*功能:重置闪存芯片
*********************************************************************/
void reset_flash_chip(){
//选中闪存芯片
NFCONT &= ~(1<<1); //设置Reg_nCE:0 //清除忙信号
NFSTAT |= (1<<2); //设置RnB_TransDetect:0 //发送重启命令
NFCMMD = 0xFF; //等待忙信号
while( !(NFSTAT&(1<<2)) ); //当RnB_TransDetect等于1时,结束循环 //释放闪存芯片
NFCONT |= 1<<1; //设置Reg_nCE:1
} /********************************************************************
*名称:read_flash
*参数:
* src 源地址
* dst 目的地址
* len 读取长度
*返回:
* null
*功能:读闪存
*********************************************************************/
void read_flash(unsigned long src, unsigned long dst, int len){
unsigned long page; //页号
unsigned char *buf; //页缓存 while(len > 0){
page = src>>11; //设置页号
buf = (unsigned char *)dst; //设置页缓存
read_page_flash(page, buf); src +=PAGE_SIZE;
dst +=PAGE_SIZE;
len -=PAGE_SIZE;
}
} /********************************************************************
*名称:read_page_flash
*参数:
* page 页号
* buf 页缓存,2048字节
*返回:
* none
*功能:页读闪存
*********************************************************************/
void read_page_flash(unsigned long page, unsigned char *buf){
int i; //循环计数器 //选中闪存芯片
NFCONT &= ~(1<<1); //设置Reg_nCE:0 //清除忙信号
NFSTAT |= (1<<2); //设置RnB_TransDetect:0 //发送读命令(0x00)
NFCMMD = 0x00; //发送列地址
NFADDR = 0x00; //Col.Add1
NFADDR = 0x00; //Col.Add2 //发送行地址
NFADDR = (page>>0)&0xFF; //Row.Add1
NFADDR = (page>>8)&0xFF; //Row.Add2
NFADDR = (page>>16)&0xFF; //Row.Add3 //发送读命令(0x30)
NFCMMD = 0x30; //等待忙信号
while( !(NFSTAT&(1<<2)) ); //当RnB_TransDetect等于1时,结束循环 //读取数据
for(i = 0; i < PAGE_SIZE; i++){
buf[i] = NFDATA; //注意,NFDATA寄存器数据类型要和buf匹配,一个读周期读出一个字节
} //释放闪存芯片
NFCONT |= 1<<1; //设置Reg_nCE:1
}

最新文章

  1. POJ 2519
  2. [转]各种移动GPU压缩纹理的使用方法
  3. erlang文章博客推荐
  4. 一些常用的sql语句
  5. Java反射实战
  6. poj 2553 The Bottom of a Graph
  7. 不可不表的OSG智能指针之强指针与弱指针 《转载》
  8. angular启动过程分析
  9. LBA(逻辑区块地址)及PBA(物理区块地址)
  10. 从零搭建DotnetCore2.0
  11. nginx的5个特点
  12. 认识SQL
  13. MongpDB 学习手册 - 索引
  14. apm飞行模式
  15. FunDA(14)- 示范:并行运算,并行数据库读取 - parallel data loading
  16. hdu2147 kiki&amp;#39;s game(博弈)
  17. django cookie and session
  18. CentOS6 安装VNCserver
  19. js 事件阻止传播方法,准确定位事件源
  20. delphi7和XE下 获取路径

热门文章

  1. [数据清洗]-使用 Pandas 清洗“脏”数据
  2. Elasticsearch索引自动删除
  3. template package (godoc 翻译)
  4. fastq,sam文件一些小结(持续补充。。。)
  5. 为什么说Python 是大数据全栈式开发语言
  6. Python学习_10__python2到python3
  7. Java基础day01
  8. CentOS7下安装MySQL并配置远程连接
  9. Windows程序设计学习笔记(五)——菜单资源和加速键的使用
  10. 卸载CentOS7-x64自带的OpenJDK并安装Sun的JDK7的方法