JZ2440的NandFlash控制器
【点此回顾上课学习内容] 芯片的型号:K9F2G08U0C 摘要: 本文以S3C2440为例来讲解NAND FLASH控制器的使用方法. 例程中故意将一部分代码放置到 nand 的4k 字节之后,因无法自动拷贝到steppingstone,所以需要读取nand中的内容到sdram,本例程重点关注nand的初始化和读取.
1. 硬件部分:1.1 简介:
1.2 内部存储单元的组织结构:
K9F2G08U0C共有2048个Block(块),每个Block含有64 Page(页),每个Page含有2k byte的正常存储空间以及64 byte的校验空间 . 总空间 = 2048 * 64 * (2 * 1024 + 64) ?byte = 264MB 实际存储空间 = 2048 * 64 * 2 * 1024 byte = 256MB
对 nandflash 的结构的几点说明:
1.3寻址方式:
???NAND的读写的最小单位为Page:
小页:
大页:(K9F2G08U0C共有2048个Block(块),每个Block含有?64 Page(页),所以我们这款芯片为大页读写) 列地址: 进行 Block 和 Page 寻址 行地址: 进行 Page 内寻址 如何区分Nandflash读写是大页还是小页点我! |
寄存器 |
地址 |
R/W |
描述 |
复位值 |
NFCONF | 0x4E000000 |
Nandflash?的配置寄存器 |
0x0000100X |
?
Bit 初始值
Reserved [15:14] 保留 - TACLS [13:12] CLE & ALE duration setting value (0~3) Duration = ?HCLK x TACLS
01 ... ... TWRPH0 [10:8] TWRPH0 duration setting value (0~7) Duration = ?HCLK x ( TWRPH0 + 1 )
000 TWRPH1 [6:4] TWRPH1 duration setting value (0~7) Duration = ?HCLK x ( TWRPH1 + 1 )
000 从这里之后的几个都是由硬件决定(就是上下拉)的不需要软件来管。
?原理图中的这个地方设置的是上表中 TWRPH1 之后的位:
- 我们假设 HCLK 为 最大值 136MHz?,稍作分析可得,我们实际的HCLK肯定要小很多,但是如果最大值满足那么小一点的HCLK肯定满足条件!则 HCLK 的周期是 1/136MHz = 7.4ns<flash时钟来自于HCLK后面讲时钟会提到>
- 查看 nandflash 的数据手册,找到跟时间相关的时序图和时间:
2.2 芯片的选择和禁止(让芯片操作 CE 引脚):
2.3 写命令和写地址:
对程序的解释:
2.4 读数据:
- #define?NFSTAT?(*((volatile?unsigned?char?*)0x4E000020))??
- #define?NFDATA?(*((volatile?unsigned?char?*)0x4E000010))??
- void?nand_wait_teady(void)??
- {??
- ????while(!(NFSTAT?&?1))??
- ?????????for(i?=?0;?i?<?10;?i++);??
- }??
- ??
- unsigned?char?nand_data(return?NFDATA;??
- }??
- /*?
- *?参数的含义: 从NAND Flash位置start_addr开始,将数据复制到SDRAM地址buf处,共复制size字节
- */??
- void?nand_read(unsignedchar*?buf,?unsignedlong start_addr,int size)
- {??
- ????int?i,j;??
- ? if((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)){
- return;
- ? ?}
- ????
- ? ?nand_select_chip(); //选中芯片??
- ???
- ? ?for(i=start_addr; i < (start_addr + size);)?
- ????{??
- ? ? ? ? write_cmd(0x00);?//?发出读命令?00h??
- ? ? ? ? write_addr(i);?//?发送读的地址??
- ? ? ? ? write_cmd(0x30);?//?发出读命令?30h??
- ? ? ? ? nand_wait_ready();?//?等待不忙??
- ????????for(j=0; j < NAND_SECTOR_SIZE; j++,i++)??
- ????????{??
- ? ? ? ? ? ? *buf = read_data();?//?读数据????
- ? ? ? ? ? ? buf++;??
- ????????} ???
- ????}??
- ????nand_deselect_ship();?//?取消片选
- ? ? return ; ?
- }??
总结一下:
(1)选中芯片
(2)发送00h
(3)发出地址
(4)发30h
(5)等待就绪
(6)读一页数据
2.5 复位 flash 芯片:
3.NandFlash操作实例
?
篇幅有限,点击跳转NandFlash 控制器操作实例:读Flash
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!