专题3-NandFlash变硬盘

第1课-NandFlash原理解析

  1. 角色分析

在电脑中有硬盘,它是用来存储文件的。嵌入式系统是防电脑的系统,在嵌入式系统中,NandFlash就相当于硬盘的存在。

  1. NandFlash的分类

2.1 根据物理结构上的区别,NandFlash主要分为如下两类:

l  SLC(Single Level Cell):单层式存储

l  MLC(Muti Level Cell):多层式存储

SLC在存储格上只存一位数据,而MLC则存放两位数据

2.2 MLC对比SLC

价格:由于MLC采用了更高密度的存储方式,因此同容量的MLC价格上远低于SLC

访问速度:SLC的访问速度一般要比MLC快3倍以上

使用寿命:SLC能进行10万次的擦写,MLC能进行1万次

功耗:MLC功耗比SLC高15%左右

  1. 访问方式

(1)       对比内存与NandFlash的编址区别

CPU内部有NandFlash控制,负责NandFlash与CPU之间的通信,通过地址、命令和数据三个寄存器来完成这一系列的通信。

(2)       NandFlash地址构成

一块NandFlash划分成多个Block,一个Block划分成多个page,一个page划分成两个部分。

(3)       信号引脚

CLE(Command Latch Enable): 命令锁存允许

ALE(Address Lactch Enable): 地址锁存允许

CE:芯片选择

RE:读允许

WE:写允许

WE:写允许

WP:在写或擦除期间,提供写保护

R/B:读/忙

第2课-NandFlash驱动设计~读

#define NFCONF (*(volatile unsigned long*)0x4E000000)

#define NFCONT (*(volatile unsigned long*)0x4E000004)

#define NFSTAT (*(volatile unsigned char*)0x4E000020)

#define NFCMD  (*(volatile unsigned char*)0x4E000008)

#define NFADDR (*(volatile unsigned char*)0x4E00000C)

#define NFDATA (*(volatile unsigned char*)0x4E000010)

#define TACLS 1

#define TWRPH0 2

#define TWRPH1 1

void select_chip()

{

NFCONT &= ~(1<<1);

}

void deselect_chip()

{

NFCONT |= (1<<1);

}

void clear_RnB()

{

NFSTAT |= (1<<2);

}

void send_cmd(unsigned cmd)

{

NFCMD = cmd;

}

void send_addr(unsigned addr)

{

NFADDR = addr;

}

void wait_RnB()

{

while (!(NFSTAT&(1<<2)))

{

;

}

}

void nand_reset()

{

//选中flash

select_chip();

//清除RnB

clear_RnB();

//发送0xff命令

send_cmd(0xff);

//等待RnB

wait_RnB();

//取消选中flash

deselect_chip();

}

void nand_init()

{

//初始化NFCONF

NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);

//初始化NFCONT

NFCONT = (1<<0) | (1<<1);

//复位

nand_reset();

}

void NF_PageRead(unsigned long addr,unsigned char* buff)

{

int i;

//选中nandflash芯片

select_chip();

//清除RnB

clear_RnB();

//发送命令0x00

send_cmd(0x00);

//发送列地址

send_addr(0x00);

send_addr(0x00);

//发送行地址

send_addr(addr&0xff);

send_addr((addr>>8)&0xff);

send_addr((addr>>16)&0xff);

//发送命令0x30

send_cmd(0x30);

//等待RnB

wait_RnB();

//读取数据

for(i=0;i<2048;i++)

{

buff[i] = NFDATA;

}

//取消选中nandflash芯片

deselect_chip();

}

void nand_to_ram(unsigned long start_addr, unsigned char* sdram_addr, int size)

{

int i;

for( i=(start_addr >>11); size>0;)

{

NF_PageRead(i,sdram_addr);

size -= 2048;

sdram_addr += 2048;

i++;

}

}

第3课-NandFlash驱动设计~写

#define NFCONF (*(volatile unsigned long*)0x4E000000)

#define NFCONT (*(volatile unsigned long*)0x4E000004)

#define NFSTAT (*(volatile unsigned char*)0x4E000020)

#define NFCMD  (*(volatile unsigned char*)0x4E000008)

#define NFADDR (*(volatile unsigned char*)0x4E00000C)

#define NFDATA (*(volatile unsigned char*)0x4E000010)

#define TACLS 1

#define TWRPH0 2

#define TWRPH1 1

void select_chip()

{

NFCONT &= ~(1<<1);

}

void deselect_chip()

{

NFCONT |= (1<<1);

}

void clear_RnB()

{

NFSTAT |= (1<<2);

}

void send_cmd(unsigned cmd)

{

NFCMD = cmd;

}

void send_addr(unsigned addr)

{

NFADDR = addr;

}

void wait_RnB()

{

while (!(NFSTAT&(1<<2)))

{

;

}

}

void nand_reset()

{

//选中flash

select_chip();

//清除RnB

clear_RnB();

//发送0xff命令

send_cmd(0xff);

//等待RnB

wait_RnB();

//取消选中flash

deselect_chip();

}

void nand_init()

{

//初始化NFCONF

NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);

//初始化NFCONT

NFCONT = (1<<0) | (1<<1);

//复位

nand_reset();

}

void NF_PageRead(unsigned long addr,unsigned char* buff)

{

int i;

//选中nandflash芯片

select_chip();

//清除RnB

clear_RnB();

//发送命令0x00

send_cmd(0x00);

//发送列地址

send_addr(0x00);

send_addr(0x00);

//发送行地址

send_addr(addr&0xff);

send_addr((addr>>8)&0xff);

send_addr((addr>>16)&0xff);

//发送命令0x30

send_cmd(0x30);

//等待RnB

wait_RnB();

//读取数据

for(i=0;i<2048;i++)

{

buff[i] = NFDATA;

}

//取消选中nandflash芯片

deselect_chip();

}

void nand_to_ram(unsigned long start_addr, unsigned char* sdram_addr, int size)

{

int i;

for( i=(start_addr >>11); size>0;)

{

NF_PageRead(i,sdram_addr);

size -= 2048;

sdram_addr += 2048;

i++;

}

}

int NF_WritePage(unsigned long addr, unsigned char* buff)

{

int ret;

int i;

//选中flash芯片

select_chip();

//清除RnB

clear_RnB();

//发送命令0x80

send_cmd(0x80);

//发送列地址

send_addr(0x00);

send_addr(0x00);

//发送行地址

send_addr(addr&0xff);

send_addr((addr>>8)&0xff);

send_addr((addr>>16)&0xff);

//写入数据

for(i=0;i<2048;i++)

{

NFDATA = buff[i];

}

//发送命令0x10

send_cmd(0x10);

//等待RnB

wait_RnB();

//发送命令0x70

send_cmd(0x70);

//读取写入结果

ret = NFDATA;

//取消选中flash芯片

deselect_chip();

return ret;

}

转载于:https://www.cnblogs.com/free-1122/p/11452183.html

第二季-专题13-NandFlash变硬盘相关推荐

  1. godspeed机器人_来自深渊第二季剧情

    来自深渊第二季第1-3集剧情 电视动画<来自深渊>改编自土笔章人原作的同名漫画,动画由KINEMA CITRUS负责制作.于2016年12月21日宣布动画化.2017年7月7日起每周五20 ...

  2. 越狱第一和第二季(免费在线视频)

    在网上发现的资源,经过测试,是可以看的,而且是SWF文件,所以看起来还算是比较舒服的(对网速不太快的人来讲).最近听说这个电影是相当的流行的啊!所以,大家都赶紧来看哦~ 第一季第1集:[url]htt ...

  3. 第二季:9.生产环境服务器变慢,诊断思路和性能评估谈谈?【Java面试题】

    第二季:9.生产环境服务器变慢,诊断思路和性能评估谈谈? [Java面试题] 前言 推荐 9.生产环境服务器变慢,诊断思路和性能评估谈谈? Linux诊断原因 命令集合 整机:top,查看整机系统新能 ...

  4. Python可以这样学(第二季:tkinter案例精选)-董付国-专题视频课程

    Python可以这样学(第二季:tkinter案例精选)-3592人已学习 课程介绍         董付国老师系列教材<Python程序设计基础>(ISBN:9787302410584) ...

  5. 火星人敏捷开发1001问(第二季)-陈勇-专题视频课程

    火星人敏捷开发1001问(第二季)-17497人已学习 课程介绍         此课程为敏捷开发的课程,聚焦于敏捷开发中似是而非的各种问题.每个问题都会有分析与解决的环节,从而令学员不但得到可行的答 ...

  6. 跟着王进老师学开发C#篇第二季:面向对象-王进-专题视频课程

    跟着王进老师学开发C#篇第二季:面向对象-9471人已学习 课程介绍         面向对象的思想在现在程序开发中非常重要,很多刚入门的程序员没有真正理解面向对象的思想而被挡在在软件开发的门外,本次 ...

  7. ​快手第二季营收217亿:同比增13% 国内业务实现单季盈利

    雷递网 雷建平 8月23日报道 快手今日发布截至2022年6月30日的财报.财报显示,快手2022年上半年营收为427.62亿元,较上年同期的361.58亿元增长18.3%. 快手2022年上半年经调 ...

  8. 血腥大地-第二季(资源破解与管理)-张立铜-专题视频课程

    血腥大地-第二季(资源破解与管理)-2426人已学习 课程介绍         课程继承<血腥大地>游戏内容 1.主要完成游戏资源的获取,从原血腥大地游戏中获取(不涉及任何商业利益,不能将 ...

  9. Android自动化测试第二季(提高篇)-金阳光-专题视频课程

    Android自动化测试第二季(提高篇)-17804人已学习 课程介绍         [金阳光测试]是由金阳光等创办的国内个人免费培训测试.欢迎喜欢测试的朋友来观看学习,提意见. 课程收益      ...

  10. 尚硅谷面试第二季(周阳主讲)

    尚硅谷面试第二季 1.volatile关键字 volatile是什么 volatile的作用 1.保证可见性 2.不保证原子性 3.禁止指令重排 DCL(单例模式双重锁) JMM模型 JMM是什么 J ...

最新文章

  1. 我是这样给阿里面试官吹 ConcurrentHashMap的
  2. CIKM 2020 | 如何更为合适地评测推荐算法? Top-N物品推荐算法评测设置回顾
  3. mysql 删除重复索引_如何检查mysql的重复索引
  4. 埋点、数仓到中台:数据体系的从0到1
  5. feign一个接口多个方法_spring cloud 建一个服务消费者client-feign(最好用这种方式)...
  6. linux git 修改文件,关于linux:Git删除所有未修改的文件
  7. 用于Elasticsearch成绩单的Java客户端
  8. 个人计算机有控制器和运算器吗,cpu是由控制器和运算器组成的对还是错
  9. [原创]解决某物流企业二维码打印问题
  10. “舌尖上的安全”:基于区块链构建四位一体的食品安全社会共治体系
  11. 思普linux安装教程,思普产品全生命周期管理系统_全生命周期管理_云市场-华为云...
  12. 通用-描述文件找不到
  13. 掌握企业邮箱3个好用的技巧,商务沟通安全又轻松!
  14. java cap_【Java】分布式CAP原则
  15. [转]oracle性能调优之--Oracle 10g AWR 配置
  16. SLAM:一:产品经理眼中的SLAM技术学习路径
  17. 理性的赌徒-SSD写带宽保持恒稳的秘密
  18. 每天学一个 Linux 命令(115):accton
  19. MySQL权限系统(三).权限表 Grant Tables
  20. java httpclient cdn_Java 11`HttpClient`下载但不是吗? (负内容长度)

热门文章

  1. 实习成长之路:Redis为什么快?为什么Redis同样也是String字符串,但是要比Java性能好?SDS数据结构是什么?什么是紧凑型编程技巧?
  2. Java 线程池 Executor浅入浅出
  3. python标准库——sys模块
  4. 北邮有高考日语学计算机专业的吗,学计算机去北邮好还是去成电好呢?没有最好只有最合适...
  5. linux .net环境变量,Linux编程 系统环境变量位置, 环境变量持久化
  6. 安卓如何让listview在上下两个按钮之间充满_如何提高超声波塑胶焊接机生产效率...
  7. docker常用功能操作记录5
  8. python-学生管理系统--2录入学生信息内容以及代码
  9. 请求的资源不可用html,“HTTP状态404请求的资源不可用”
  10. java改变人物动作_Java创建对象的动作分析