上一节讲了 设置 nand时序
存储类芯片操作步骤:
1、初始化 主控芯片对的nand flash 控制器
2、识别 读取id (判断芯片是否正常)
3、读 写 擦除
nand flash 芯片手册读取ID截图:
【分析】:
1、肯定先发出片选信号 选中芯片 >>>>>>>>> CE拉低
2、我们发出写命令 :
1) we 拉低 CLE 拉高 保持
2)I/O 发出 0x90
3) we拉高 CLE 拉低
上面等于发送了一个命令到 nand flash 上;
3、发地址
1) ALE 拉高
2) I/O 发送地址
一个周期地址0x00h 然后经过TWHR + TREA时间段后,就可以读取数据了;
代码编写:
s3c2440 芯片手册:
1控制寄存器
用来控制 片选使能, nand flash芯片使能 控制锁操作等.
2 命令寄存器
用来发送命令的寄存器;
3地址寄存器:
发送地址的寄存器, 可以到这个地址是只有8bit可用,剩下的是保留,所以芯片手册才会有按周期发送地址.
4数据寄存器:
用来读写或者写入数据
因此:
#define NFCONT (*(volatile unsigned int *)(0x4E000004))
#define NFCCMD (*(volatile unsigned int *)(0x4E000008))
#define NFADDR (*(volatile unsigned int *)(0x4E00000C))
#define NFDATA (*(volatile unsigned int *)(0x4E000010))
void nand_read_id(void)
{
int i = 0;
unsigned char cmd = 0X90;
unsigned char addr = 0x00;
char nand_id [5]= {0};
//设置片选
NFCONT &=~(1<<1);
//发送0x90命令
NFCCMD = cmd;
//发送0x00地址
NFADDR = addr;
for (i=0; i<5; i++)
{
nand_id[i] = NFDATA;
}
//取消片选
NFCONT |= (1<<1);
//打印处nand flash信息
printf("maker id = 0x%x\n\r",buf[0]);
printf("device id = 0x%x\n\r",buf[1]);
printf("3rd byte = 0x%x\n\r",buf[2]);
printf("4th byte = 0x%x\n\r",buf[3]);
printf("page size = %d kb\n\r",1 << (buf[3] & 0x03));
printf("block size = %d kb\n\r",64 << ((buf[3] >> 4) & 0x03));
printf("5th byte = 0x%x\n\r",buf[4]);
}