ARM第六天(Nand Flash 上)
1,什么是Nand fash? 存储设备,用于存储整个系统(引导程序、内核、文件系统),相当于PC中的硬盘。 2,TPAD采用了什么Nand Flash 3,如何才能操作Nand Flash,主要是对它进行写操作,读操作,校验操作 4,Nand Flash能用特性 5,K9K8G08U0B Nand Flash的主要指标参数 Nand Flash共有48个管脚,并不是每个管脚都使用了。 Nand Flash芯片上的各个管脚实际上与S5PV210处理器中的Nand Falsh控制器相连(所谓Nand flash控制器从表现形式上看,也就是一引起S5PV210上管脚,只是部分管理的主要功能是用来控制Nand Flash),因此,我们不用直接去操作Nand flash的管脚,而是通过操作Nand Flash控制器中的寄存器来实现对Nand Flash的操作。 Nand Flash控制器的寄存器的地址范围: SFRS特殊功能寄存器 Nand Flash的内部结构图: 1,页:构成Nand Flashr的基本单位,页大小固定 1 page = (2K + 64)bytes = (2048(main) + 64(spare))bytes 每一页又分为main区和spare区 main区:用于正常数据的存储 spare区:用于存储一些附加信息,如坏块的标志,块的逻辑地址,ECC校验信息 2,块:由若干页构成,64页构成一块,块大小固定 1 block = (2K+64)bytes * 64 page = (128K(main)+4K(spare))bytes 3,device:由若干块构成,8192块 1 device = (128K + 4K)*8192 = (1G + 32M)bytes = (1024M+32M)bytes=(1056M)bytes = 8448Mbits Nand Flash:(1G+32M)bytes 块号:8192块,0~8191块 表示Nand Flash地址,需要多少bit来表示一个字节的地址? 31bit地址如何发送? 案例: 如何发送? 由Nand Flash的Datasheet可知,Nand Flash是通过命令来操作的: Nand Flash不一样,对应的命令集不一样。 Nand Flash: Nand Flash管脚: Nand Flash 控制器: 寄存器 如何通过软件编程的方式操作Nand Flash(P695) NFCONF 配置寄存器 HCLK = 133MHZ = 7 ns; TACLS:表征的是从CLE(命令锁存信号)/ALE (地址锁存信号)有效,到nWE写使能信号有效经过的时间Druation1. NFCONT 控制寄存器 NFCMMD命令寄存器 NFADDR地址寄存器 NFDATA数据寄存器 NFSTAT状态寄存器 读时序图: read Nand Flash 的ID案例 #define __NAND_H__
#define __NAND_H__
//定义寄存器
#define NFCONF (*((volatile unsigned int*)0xBOE00000));
#define NFCONT (*((volatile unsigned int*)0xBOE00004));
#define NFCMMD (*((volatile unsigned int*)0xBOE00008));
#define NFADDR (*((volatile unsigned int*)0xBOE0000C));
#define NFDATA (*((volatile unsigned int*)0xBOE00010));
#define NFSTAT (*((volatile unsigned int*)0xBOE00028));
//声明函数原型
extern void nand_init(void);
extern void nand_read_id(void);
#endif
nand.c文件: #include "nand.h"
#include "uart.h"
#include "itoa.h"
void nand_init(void)
{
//nand flash 控制器使用的管脚配置,
//因为我们使用的nand flash启动方式,所以关于GPIO管脚功能配置可以不做
//如果使用的不是nand flash启动,将需要配置
NFCONF = (0xF<<12) | (0xF<<8) |(0xF<<4) | (1<<1);
NFCONT = (3<<12) | (3<<8) | 7;
}
void nand_read_id(void)
{
//1,nand falsh片选信号拉低,使能nand falsh芯片
//操作 NFCONT bit[1] = 0;
NFCONT &= ~(1<<1);// 1<<1 ==> 10
//2,向NFCMMD寄存器写入0x90
NFCMMD = 0x90;
//3,向NFADDR寄存器写入0x0
NFADDR = 0x0;
//4,延时
int i;
for(i = 0;i < 256; i++)
{
;
}
//5,读NFDATA 寄存器(字)ID
//读5个字节的ID号
unsigned int id1;
unsigned int id2;
id1 = NFDATA;
id2 = (NFDATA & 0xFF);//只要低八位
//6,Nand flash片选信号拉高
//操作 NFCONT bit[1] = 1;
NFCONT |= (1<<1) ;
//7,显示读出来的nand flash的ID号
char buf[16];
uart0_puts("n ID1 = ");
itoa(buf,id1);//转换(整型无法直接打印,打印前转换成字符串)
uart0_puts(buf);//输出
uart0_puts("n ID2 = ");
itoa(buf2,id2);//转换
uart0_puts(buf2);//输出
}
说明: cmd.c #include "cmd.h"
#include "led.h"
#include "nand.h"
void cmd_ledon(void)
{
//调用开灯函数
led_on();
}
void cmd_nid(void)
{
//调用读nand flash Id函数
nand_read_id();
}
void cmd_ledoff(void)
{
//调用关灯函数
led_off();
}
const cmd_t cmd_tb1[] =
{
{"ledon",cmd_ledon},{"ledoff",cmd_ledoff},{"nid",cmd_nid},};
int cmd_tab1_num = sizeof(cmd_tb1)/sizeof(cmd_tb1[0]);
cmd_t *find_cmd(const char *name)
{
for(int i=0;i<cmd_tab1_num;i++)
{
if(name == cmd_tb1[i].name)
{
return cmd_tb1[i];
}
}
return NULL;
}
main.c #include "uart.h"
#include "strcmp.h"
#include "led.h"
#include "nand.h"
#define int BUF_LEN = 10;
#define char buf[BUF_LEN];
void main(void)
{
char ch;
//1,初始化串口
uart0_init();
led_init();
nand_init();
//2,发送一个字符串
while(1){
uart0_puts("n Shell#");
}
}
makefile 略 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |