TQ210 —— NandFlash

TQ210 —— nandflash

    TQ210 开发板板载一片 1Gbyte 的 NAND FLASH——K9K8G08U0B,通过查询K9K8G08U0B 芯片手册可以得到如下信息:(理论知识不再介绍)
K9K8G08U0B : (1G + 32M) x 8bit 总大小
Data Register : (2K + 64) x 8bit 数据寄存器
Page Program : (2K + 64)Byte 页编程
Block Erase : (128K + 4K)Byte 块擦除
Page Read: (2K + 64)Byte 页读
 
我们需要按上面这个地址周期表来发地址。
对NFDATA 寄存器的定义(参考 S5PV210 芯片手册 4.3.1.1 8-bit NAND Flash Memory Interface)   
 #define NFDATA (*(volatile unsigned char *)0xB0E00010)
NFCONF 寄存器中 3 个时间参数稍微比计算的值大些(大 1 就可以),否则会出现读写不稳定
下面几种操作流程中对于发送地址的周期数:有的是 5 个周期,有的是 3 个周期,有的是 1 个周期。
1、 擦除流程
(1)片选
(2)发命令 0x60
(3)发页地址(块对齐,3 个周期)
(4)发命令 0xD0
(5)等待 NAND 空闲
(6)取消片选

2、 写数据
(1)片选
(2)发命令 0x80
(3)发地址(页对齐, 5 个周期)
(4)连续发送一页数据
(5)发命令 0x10
(6)等待 NAND 空闲
(7)取消片选

3、 读数据
1) 片选
2) 发命令 0x00
3) 发地址(页对齐, 5 个周期)
4) 发命令 0x30
5) 等待 NAND 空闲
6) 连续读一页数据
7) 取消片选

4、 读ID
1) 片选
2) 发命令 0x90
3) 发 0 地址( 1 个周期)
4) 连续读 5 个字节的 ID
5) 取消片选
#include "types.h"#define	NFCONF  (*(volatile u32 *)0xB0E00000) 
#define	NFCONT  (*(volatile u32 *)0xB0E00004) 	
#define	NFCMMD  (*(volatile u32 *)0xB0E00008) 
#define	NFADDR  (*(volatile u32 *)0xB0E0000C)
#define	NFDATA  (*(volatile u8 *)0xB0E00010)
#define	NFSTAT  (*(volatile u32 *)0xB0E00028)#define MP0_1CON  (*(volatile u32 *)0xE02002E0)
#define	MP0_3CON  (*(volatile u32 *)0xE0200320)
#define	MP0_6CON  (*(volatile u32 *)0xE0200380)#define PAGE_SIZE	2048
#define BLOCK_SIZE	(PAGE_SIZE * 64)/* 等待NAND准备好 */
static void inline nand_wait_ready()
{while(!(NFSTAT & (1 << 0)));
}/* 片选 */
static void inline nand_select_chip()
{NFCONT &= ~(1 << 1);
}/* 取消片选 */
static void inline nand_deselect_chip()
{NFCONT |= (1 << 1);
}/* 发命令 */
static void inline nand_cmd(u32 cmd)
{NFCMMD = cmd;
}/* 发地址(5个周期) */
static void nand_addr(u32 addr)
{u32 col = addr % PAGE_SIZE;	/* 页内偏移 */u32 row = addr / PAGE_SIZE;	/* 页地址 */NFADDR = col & 0xFF;NFADDR = (col >> 8) & 0x7;NFADDR = row & 0xFF;NFADDR = (row >> 8) & 0xFF;NFADDR = (row >> 16) & 0x07;
}/* 读1byte数据 */
static u8 inline nand_read()
{return NFDATA;
}/* 写1byte数据 */
static void inline nand_write(u8 data)
{NFDATA = data;
}/* 复位NAND */
static void nand_reset()
{nand_select_chip();nand_cmd(0xFF);nand_wait_ready();nand_deselect_chip();
}/* NAND初始化 */
void nand_init()
{/* HCLK_PSYS=133MHz(7.5ns) */NFCONF =	(0x1 << 23) |	/* Disable 1-bit and 4-bit ECC *//* 下面3个时间参数稍微比计算出的值大些(我这里依次加1),否则读写不稳定 */(0x3 << 12) |	/* 7.5ns * 2 > 12ns tALS tCLS */(0x2 << 8) | 	/* (1+1) * 7.5ns > 12ns (tWP) */(0x1 << 4) | 	/* (0+1) * 7.5 > 5ns (tCLH/tALH) */(0x0 << 3) | 	/* SLC NAND Flash */(0x0 << 2) |	/* 2KBytes/Page */(0x1 << 1);		/* 5 address cycle *//* ** The setting all nCE[3:0] zero can not be allowed. Only ** one nCE can be asserted to enable external NAND flash ** memory. The lower bit has more priority when user set all ** nCE[3:0] zeros. */NFCONT =	(0x1 << 1) |	/* Disable chip select */(0x1 << 0);		/* Enable NAND Flash Controller *//*** Port Map** CE1->Xm0CSn2-> MP01_2** CE2->Xm0CSn3-> MP01_3** CE3->Xm0CSn4-> MP01_4** CE4->Xm0CSn5-> MP01_5** CLE->Xm0FCLE-> MP03_0** ALE->Xm0FALE-> MP03_1** WE->Xm0FWEn->  MP03_2** RE->Xm0FREn->  MP03_3** RB1->Xm0FRnB0->MP03_4** RB2->Xm0FRnB1->MP03_5** RB3->Xm0FRnB2->MP03_6** RB4->Xm0FRnB3->MP03_7** IO[7:0]->Xm0DATA[7:0]->MP0_6[7:0]*/MP0_1CON &= ~(0xFFFF << 8);MP0_1CON |= (0x3333 << 8);MP0_3CON = 0x22222222;MP0_6CON = 0x22222222;nand_reset();
}/* 读NAND ID */
void nand_read_id(u8 id[])
{int i;nand_select_chip();nand_cmd(0x90);NFADDR = 0x00;for (i = 0; i < 5; i++)id[i] = nand_read();nand_deselect_chip();
}/* 擦除一个块 */
void nand_erase(u32 addr)
{	if (addr & (BLOCK_SIZE - 1)){printf("not block align\n");return;}u32 row = addr / PAGE_SIZE;nand_select_chip();nand_cmd(0x60);NFADDR = row & 0xff;			NFADDR = (row >> 8) & 0xff;NFADDR = (row >> 16) & 0x07;nand_cmd(0xD0);nand_wait_ready();nand_deselect_chip();
}/* 读一页数据 */
void nand_read_page(u8 *buf, u32 addr)
{if (addr & (PAGE_SIZE - 1)){printf("not page align\n");return;}int i;nand_select_chip();nand_cmd(0);nand_addr(addr);nand_cmd(0x30);nand_wait_ready();for(i = 0; i < PAGE_SIZE; i++){*buf++ = nand_read();}nand_deselect_chip();
}/* 随机读:从任意地址读任意字节的数据 */
void nand_read_random(u8 *buf, u32 addr, u32 size)
{	nand_select_chip();nand_cmd(0);nand_addr(addr);nand_cmd(0x30);nand_wait_ready();int i;u32 col = addr % PAGE_SIZE;	/* 页内偏移 */for(i = col; i < size + col; i++){nand_cmd(0x05);NFADDR = i & 0xFF;NFADDR = (i >> 8) & 0x7;nand_cmd(0xE0);*buf++ = nand_read();}nand_deselect_chip();
}/* 写一页数据 */
void nand_write_page(u8 *buf, u32 addr)
{if (addr & (PAGE_SIZE - 1)){printf("not page align\n");return;}int i;nand_select_chip();nand_cmd(0x80);nand_addr(addr);nand_wait_ready();for(i = 0; i < PAGE_SIZE; i++){nand_write(*buf++);}nand_cmd(0x10);nand_wait_ready();nand_deselect_chip();
}
#include "types.h"
#include "uart.h" // 这个文件前面UART串口博客有void bzero(u8 *s, int size)
{int i = 0;for (; i < size; i++)s[i] = 0;
}void main()
{	u8 buf[2048];int i;bzero(buf, 2048);nand_read_id(buf);printf("\nID:");for (i = 0; i < 5; i++){printf("%X ", buf[i]);}putchar('\n');nand_erase(0x80000);			/* 擦除以0x80000地址开始的一个块 */for (i = 0; i < 2048; i++)buf[i] = i % 255;nand_write_page(buf, 0x80000);	/* 写入1页数据到0x80000地址 */bzero(buf, 2048);nand_read_page(buf, 0x80000);	/* 从0x80000地址读取一页数据 *//* 打印读取到的数据,与写入的数据一致 */for (i = 0; i < 100; i++){if (i % 16 == 0)putchar('\n');printf("%X ", buf[i]);}
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

涂鸦赞助的500个开发套件,先到先得

来源 | 涂鸦跟涂鸦申请的福利&#xff0c;给喜欢开发的同学发放开发套件&#xff0c;只要是不是专门白嫖党&#xff0c;数量可以不做限制。去年疫情突发&#xff0c;封城、封小区以及人员隔离&#xff0c;让原本享受千般宠爱的主子们变成了靠吃猫砂、塑料袋度日的小可怜&#x…

Linux-C 编程 / 网络 / 超迷你的 web server

一、为生活寻找固定的支撑点1. 什么是生活的支撑点&#xff1f;让自己感到些许痛苦&#xff0c;但却会带来实实在在的充实感和成就感的事情。举个栗子&#xff0c;我的支点是运动、看书、研究技术。2. 固定的支撑点很重要&#xff1a;三个固定的要素&#xff1a;时间 / 空间 / …

20165326 java第四周学习笔记

第四周学习笔记 ch5 子类和父类子类只能有一个父类使用关键字extendsyclass 子类 extends 父类系统默认的祖先类Object&#xff08;java.lang包中&#xff09;继承&#xff1a;子类继承父类的方法可以直接作为实例方法调用&#xff0c;继承的成员变量和方法的访问权限不变&…

用VSTS进行网站压力测试

VSTS提供了一个丰富、强大的工具平台&#xff0c;融合了软件开发领域的各个角色&#xff0c;涵盖软件开发生命周期的各个阶段&#xff0c;包括设计&#xff0c;开发&#xff0c;测试&#xff0c;管理&#xff0c;而这一整套构件的融会贯通&#xff0c;让它可以有效地改善软件开…

第四周选做作业

相关知识点的总结 通过命令行引入参数递归循环课上内容的补做&#xff0c;结果截图 未完成内容:递归与循环 补做教材第二章&#xff0c;第三章编程题目 参考资料 2016-2017-2 《Java 程序设计》课堂实践项目编写一个Java应用程序,输出全部的希腊字母。_百度知道[]转载于:https:…

数据结构和算法,也就那么回事儿

金三银四来了&#xff0c;各大厂动静不小&#xff0c;都在储备人才&#xff0c;绝对是程序员面试的黄金时间了&#xff0c;不少同学也在后台反馈面试中遇到的一些问题&#xff0c;所以今天想跟大家说说算法。说起算法&#xff0c;那大厂面试是绝对必考的&#xff0c;可以说是一…

SecureCRT护眼设置

SecureCRT护眼设置Option —— Global Options —— Terminal —— Appearance —— ANSI COlor从左至右&#xff0c;从上至下值分别为&#xff08;RGB元组&#xff09;&#xff1a; 1&#xff1a;(0,43,53) (128,128,0) (0,160,0) (160,160,0) (255,128,128) (…

北美暴风雨,Linux5.12被延迟6天发布

上个月中旬&#xff0c;因为罕见的严寒天气和暴风雪&#xff0c;美国得州和俄勒冈州波特兰遭遇了持续多天的停电。Linux 创始人 Linus Torvalds 就生活在波特兰&#xff0c;多年来他一直在家中远程工作&#xff0c;并负责新内核的最终发布。之前我们报道过&#xff0c;内核社区…

C#复习笔记(3)--C#2:解决C#1的问题(可空值类型)

可空值类型 C#2推出可空类型来表示可以为null的值类型。这是一个呼声很高的需求&#xff0c;因为在常用的数据库中都是允许某些值类型可为空的。那么为什么值类型就不能为空呢&#xff1f;内存中用一个全0的值来表示null&#xff0c;但是全0的地址说明了这个内存空间是被清除了…

ISA之三种客户端访问

我们已经懂得怎么搭建ISA2006.我们今天来利用ISA访问外网&#xff01;顺便说声如果你IP&#xff0c;网关&#xff0c;DNS什么都没问题。那么你可以看看你的NAT处理&#xff01;下面我们看看我们的试验拓扑&#xff01;我们在ISA的服务器上做访问规则&#xff01;来允许我们可以…

面试官不讲武德,居然让我讲讲蠕虫和金丝雀!

1. 蠕虫病毒简介2. 缓冲区溢出3. 缓冲区溢出举例4. 缓冲区溢出的危害5. 内存在计算机中的排布方式6. 计算机中越界访问的后果7. 避免缓冲区溢出的三种方法7.1 栈随机化7.2 检测栈是否被破坏7.3 限制可执行代码区域8. 总结蠕虫病毒是一种常见的利用Unix系统中的缺点来进行攻击的…

asp.net core 拦击器制作的权限管理系统DEMO

效果图 没有登陆不会执行请求日期的方法&#xff0c;不管是否登陆都不允许访问请求时间方法 验证不通过是会进行转发到Home/error方法中&#xff0c; 代码附上&#xff1a; [Route("[controller]/[action]")]public class HomeController : BaseController{/// <s…

工程师姓什么很重要!别再叫我“X工”!!!

工程师之间都是这么互相打招呼的——“高工&#xff0c;你设计图通过了么&#xff1f;”“李工&#xff0c;工程画完了吗&#xff1f;”“王工&#xff0c;你真是越来越漂亮了&#xff01;”"张工&#xff0c;你的DFM整完了吗"“周公&#xff0c;Schedule 该更新了”…

说一下NFC,手机有NFC功能却不能模拟门禁卡?

img1、NFC是什么&#xff1f;NFC&#xff08;Near Field Communication&#xff09; 技术由Philips、Nokia和Sony主推的一种近距离无线通信技术&#xff08;NFCIP-1&#xff09;&#xff0c;是一种短距离非接触式的通信方式&#xff0c;通常有效通讯距离为4厘米以内。工作频率为…

小程序员的大梦想 与盖茨像哥们儿

小程序员的大梦想 与盖茨像哥们儿以10亿的天价转会新华都&#xff0c;让唐骏有机会开创其职业经理人生涯的新局面&#xff0c;但在此之前&#xff0c;他的成功已得到证明面前的唐骏温和得令人吃惊。仿佛“前微软中国区总裁”、“打工皇帝”、“10亿转会身价”这样的光环带给他的…

动态规划详解

个人见解&#xff1a;1.动态规划实现了把问题拆分成多个子问题&#xff0c;然后求解&#xff0c;子问题有解后&#xff0c;问题自然迎刃而解&#xff1b;2.动态规划实现了子问题的状态的迁移&#xff0c;保存每个状态值&#xff0c;递推出答案&#xff0c;但不记录每种状态的求…

我的奶奶

突然想起我奶奶&#xff0c;是突然发现&#xff0c;距离奶奶去世已经有快十年&#xff0c;这十年时间&#xff0c;我也再也没有见过奶奶。奶奶刚去世的前几年&#xff0c;有时候会梦到奶奶跟我说话&#xff0c;她总是会很耐心的告诉我很多道理。奶奶从小到大都没有指责过我&…

WPF应用程序内存泄漏的一些原因

原文&#xff1a;Finding Memory Leaks in WPF-based applications There are numbers of blogs that folks wrote about memory leaks in Microsoft .Net Framework managed code and unmanaged code based applications. In this blog I wanted to: Show coding practices th…

[转]Eclipse RCP应用系统开发方法与实战2-- 定制应用程序窗口属性

5.1.4 定制应用程序窗口属性 向导生成的应用程序主界面并不能满足要求&#xff0c;存在很多问题&#xff0c;例如&#xff0c;主界面运行时没有自动居中&#xff0c;主界面大小没有固 定&#xff0c;主窗口标题栏文字应该是“高校经费测算系统”。再看看图5-3、图5-4的标题栏有…

赢在中国 - 史玉柱经典语录

1.要重视建立销售手册2.凡是先做试点&#xff0c;风险才低。3.找到自己的细分市场。4.不要总想着同竞争对手对立&#xff0c;而是要想办法让自己弥补竞争对手的不足。5. 如果没有价格上的优势与技术上的绝对优势&#xff0c;千万不要进入红海市场&#xff0c;否则你会必输无疑&…