裸机——Nand
1.首先需要知道Nand的基础知识
从Nand的芯片手册可以获得
我使用的芯片手册是 K9F2G08
首先从芯片手册的名称可以获得信息:
K9F:三星
2G : 2Gb (256MB)
08 : 8位数据线
下面列出芯片手册中对编程有用的部分

上面这张图就是Nand存储颗粒的排列方式,
对Nand存储单元的管理方式如下:
Nand的存储单元和DDR一样按照字节编址,但是读写和擦除的最小单位不同。
Page是最小的读写单位
Block是最小的擦除单位
Page Register 之后的 64 Bytes 为带外数据区,用于 ECC 校验 和 坏块管理。
ECC 校验:由于Nand的物理性质导致可能发生位反转,即存的是1,却自动翻转成0,所以为了防止位反转的危害,数据写入时,会计算出ECC校验,存入带外区,将来读数据时,需要再次计算ECC校验,并对比带外区中的校验。
坏块管理:Nand的块可能坏掉,对于坏块的处理是标记为坏块,不再使用,标记坏块就需要确定坏块,确定的方法是:擦除块(Nand擦除后,所以数据成1),然后读出,比较数据是否每一位都为1,如果不是就标记为坏块。(这通常由文件系统处理)。

上面这张图进行对Nand传地址,
首先由于我这个芯片只有8根数据线(注意Nand的数据线负责传输:数据、地址、命令),所以地址信息分为5个周期传输,
前两个周期为 Col ,后3个为Row,
注意,由于Nand读写擦除都是以Page对齐的,所以Col其实都为0。

这张图是命令,也是编程。
这时需要了解 SoC和Nand之间是怎么通信的。
如下

CPU通过控制 SFR 控制 Nand控制器, Nand控制器按照时序与Nand芯片上的主控IC进行通信,
Nand芯片上的主控IC根据Nand控制器传来的命令等数据直接操作存储单元。
为什么CPU不直接操作Nand上的控制电路呢?
理论上是可以的,单片机上就是这么做的,但是太复杂,比如CPU需要完成这样的时序操作。

CLE、CE。。。这些是什么呢?
查看原理图可以晓得

原理图告诉我们,数据线有 I/O0-7一共8根,其他几乎都是时序线(有上滑线的表示低电压有效)。
所以结合上面的时序图,我们晓得了,时序控制就是按照时序拉高拉低这些时序线,显然这是否困难。
所以Nand控制器出现,Nand控制器的工作就是完成这些时序控制,SoC就只需要控制Nand控制器的SFR。
既然Nand控制器这么厉害,那他的逻辑结构是什么样的呢?
由于Nand控制器是SoC上的,所以在SoC的数据手册可以找到。

可以控制器工作在 HCLK,并且带有硬件实现的 ECC 模块,我们通过控制SFR,使用 ECC 和 Control & State Machine。
下面就是使用Nand控制器后,与Nand主控IC进行通信的流程

如何实现这些流程呢?按照前面的分析就是设置Nand控制器的SFR
// 从sdram中写数据到nand
int copy_sdram_to_nand(unsigned char *sdram_addr, unsigned long nand_addr, unsigned long length)
{
unsigned ;
// 1. 发出片选信号
nand_select_chip();
// 2. 从sdram读数据到nand,第一周期发命令0x80,第二周期发地址nand_addr,第三个周期写一页(2k)数据,第四周期发0x10
while(length)
{
nand_send_cmd(NAND_CMD_WRITE_PAGE_1st);
nand_send_addr(nand_addr);
// 列地址,即页内地址
unsigned long col = nand_addr % NAND_PAGE_SIZE;
i = col;
// 写一页数据,每次拷1byte,共拷2048次(2k),直到长度为length的数据拷贝完毕
; i++,length--)
{
nand_write8(*sdram_addr);
sdram_addr++;
nand_addr++;
}
rNFSTAT = (rNFSTAT)|(<<);
nand_send_cmd(NAND_CMD_WRITE_PAGE_2st);
nand_wait_idle();
}
// 3. 读状态
unsigned char status = nand_read_status();
)
{
// 取消片选信号
nand_deselect_chip();
printf("copy sdram to nand fail\r\n");
;
}
else
{
nand_deselect_chip();
;
}
}
这样就知道了Nand的编程和相关的基础知识。
接下来要做的就是结合芯片手册的工作流程和SoC手册的寄存器解释理解源码。
当然还需要结合Nand的基础知识理解源码的有些操作,
如:
每次发送数据后,都需要短暂的等待,以保证Nand主控IC完成操作。
对于Nand进行读写操作的地址应该Page对齐,擦除操作的地址应该Block对齐。
Nand操作前后需要先选片,后释放。
每次长时间的操作,如写Nand后,需要轮询的读状态寄存器,确定Nand主控IC已经完成写操作。
对于写操作,写之前需要擦除。
裸机——Nand的更多相关文章
- mini2440 裸机程序,下载到nand 里面,复制到 sdram 中不运行
按照韦东山的视频中 sdram的裸机代码,写了一份,通过 minitools 下载到 0x30000000,然后烧录到 nand中,接过不能正常运行. 尝试过多种方法后,只有一种解决方法,就是不要用 ...
- Nand Flash 裸机程序
硬件平台 :JZ2440 实现功能:初始化 Nand Flash 和 sdram,并将代码从 Nand Flash 拷贝到 sdram. start.s --> 上电初始化 nand ...
- JZ2440 裸机驱动 第8章 NAND Flash控制器
本章目标 了解NAND Flash 芯片的接口 掌握通过NAND Flash控制器访问NAND Flash的方法 8.1 NAND Flash介绍和NAND Flash控制器使用 NAND ...
- s3c2440 lcd 显示图片裸机程序
因为前面的裸机程序非常的简单,就不写博了. 程序的流程: 1,初始化C SP 2,关看门狗 3,初始化SDRAM 4,读出 NAND FLASH 中的 包含图片的程式放到SDRAM里面 5,跳转到SD ...
- tiny210裸机第1课(启动原理)
软硬件环境 宿主机系统:ubuntu 板子芯片:S5PV210(Contex-A8),512M DDR2,512M SLC Nand 交叉编译器:arm-linux-gcc-4.5.1 手册:S5PV ...
- 1_jz2440在linux下烧写裸机程序
常用的烧写方法有: 1.使用并口工具烧写:接线(参考百问网JZ2440V2开发板使用手册),使用oflash烧写(速度比较慢),可烧写.bin文件,从新上电观察效果.可烧写u_boot. 2.使用op ...
- S5PV210(TQ210)裸机编程
本文很多其它的是教会大家怎样学习. 4.1 汇编学习 4.1.1 基础知识 4.1.2 ARM模拟器 4.2 S5PV210启动流程 4.3 点亮一个LED 4.4 串 ...
- uboot启动后在内存中运行裸机程序hello
如题,实现过程中发现3额问题,先写下来,待解答: 1.uboot启动后再dnw上打印许多信息,我想改变其中的打印信息或加上自己的打印信息以证明程序运行到何处.修改完后重新编译uboot.bin. 在D ...
- ARM入门实践(一)----Mini6410上最简单的LED点灯裸机程序
Mini6410上最简单的LED点灯裸机程序 : 实验环境: 根据友善教程,要用ADS,据说现在都不用这个了,但是为了打开友善给的mcp工程,就下了一个,Win7下弄上兼容模式和管理员权限,再下一个S ...
随机推荐
- maven课程 项目管理利器-maven 1-2maven介绍和环境搭建
maven简介: Maven是基于项目对象模型(POM),通过一小段描述信息来管理项目的构建.报告和文档的软件项目管理工具. 1.1 Maven安装文件夹的结构 bin 目录放置包含mvn的运行脚本 ...
- vos限制客户呼出时间
问题: 公司希望自己的卡线晚上 21:00-24:00 早上00:00-7:30不能打出电话,以防遭投拆, 那么如何设置? 方法: 找到客户使用的落地网关, 落地网关——补充设置——
- C#获取农历的日期(转)
//C# 获取农历日期 ///<summary> /// 实例化一个 ChineseLunisolarCalendar ///</summary> private static ...
- May 7th 2017 Week 19th Sunday
A chain is no stronger than its weakest link. 链条的坚固程度取决于它最薄弱的环节. The same as the well-known buckets ...
- 将TIMESTAMP类型的差值转化为秒的方法
两个TIMESTAMP之差得到的是INTERVAL类型,而有时我们只需要得到两个时间相差的秒数,如果变成INTERVAL之后,想要获取这个值会非常麻烦. 比较常见的方法是使用EXTRACT来抽取获得的 ...
- Oracle 日期加减运算
-- Start 我们都知道数字可以进行加.减.乘.除等运算.那么,日期可不可以呢?答案是,日期只能进行加.减运算. 在开始操作日期之前,我们先了解一下 Oracle 支持哪些日期数据类型,如下所示: ...
- Android(java)学习笔记67:Android Studio新建工程中的build.gradle、settings.gradle
随着信息化的快速发展,IT项目变得越来越复杂,通常都是由多个子系统共同协作完成.对于这种多系统.多项目的情况,很多构建工具都已经提供了不错的支持,像maven.ant.Gradle除了借鉴了ant或者 ...
- 在线文本编辑器cheditor应用实例
CKEditor 即 FCKEDITOR . FCKeditor是眼下最棒的可见就可以得网页编辑器之中的一个,它採用JavaScript编写.具备功能强大.配置easy.跨浏览器.支持多种编程语言.开 ...
- HDU 1532
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 题意: 三叶草是这个人的最喜欢的植物,结果下雨淹没了他家里,要排水,一个点到一个点的排水速度已知 ...
- 种类并查集,TOJ(1706)
题目链接:http://acm.tju.edu.cn/toj/showp1706.html 很类似Poj的一道帮派的问题,记得找到的可疑的关系,不要将集合刷新就可以了. 1706. A Bug's ...