历史上的今天
今天是:2024年10月11日(星期五)
2021年10月11日 | S3C2440裸机------NandFlash编程_芯片id读取
2021-10-11 来源:eefocus
1.芯片id读取时序图
我们先看一下NandFlash芯片手册中读取id的时序图,后面我们要根据这个时序图去写代码。

2.使能芯片
从前面的时序图我们可以看出,我们首先要发出片选信号,我们通过设置下图寄存器的Reg_nCE位来进行设置,

void nand_select(void)
{
/*使能片选*/
NFCONT &=~(1<<1);
}
void nand_deselect(void)
{
/*禁止片选*/
NFCONT |= (1<<1);
}
3.发送命令函数
我们从最前面的时序图可以看到,要想读取设备id,首先要向NandFlash发送90命令,然后相应的CLE和WE信号要使能,这里的时序不需要我们管,我们只需要往命令寄存器写值即可,NandFlash控制器会为我们做好相应的时序。
void nand_cmd(unsigned char cmd)
{
volatile int i;
NFCCMD = cmd;
for(i=0; i<10; i++);
}
4.发送地址函数
void nand_addr_byte(unsigned char addr)
{
volatile int i;
NFADDR = addr;
for(i=0; i<10; i++);
}
5.读数据函数
unsigned char nand_data(void)
{
return NFDATA;
}
6.完整代码
#include "s3c2440_soc.h"
#include "my_printf.h"
void nand_init(void)
{
#define TACLS 0
#define TWRPH0 1
#define TWRPH1 0
/*设置NAND FLASH的时序*/
NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
/*使能NAND FLASH控制器,初始化ECC,禁止片选*/
NFCONT = (1<<4) | (1<<1) | (1<<0);
}
void nand_select(void)
{
/*使能片选*/
NFCONT &=~(1<<1);
}
void nand_deselect(void)
{
/*禁止片选*/
NFCONT |= (1<<1);
}
void nand_cmd(unsigned char cmd)
{
volatile int i;
NFCCMD = cmd;
for(i=0; i<10; i++);
}
void nand_addr_byte(unsigned char addr)
{
volatile int i;
NFADDR = addr;
for(i=0; i<10; i++);
}
unsigned char nand_data(void)
{
return NFDATA;
}
void nand_chip_id(void)
{
unsigned char buf[5]={0};
nand_select();
nand_cmd(0x90);
nand_addr_byte(0x00);
buf[0] = nand_data();
buf[1] = nand_data();
buf[2] = nand_data();
buf[3] = nand_data();
buf[4] = nand_data();
nand_deselect();
printf("maker id = 0x%xnr",buf[0]);
printf("device id = 0x%xnr",buf[1]);
printf("3rd byte = 0x%xnr",buf[2]);
printf("4th byte = 0x%xnr",buf[3]);
printf("page size = %d kbnr",1 << (buf[3] & 0x03));
printf("block size = %d kbnr",64 << ((buf[3] >> 4) & 0x03));
printf("5th byte = 0x%xnr",buf[4]);
}
void nand_flash_test(void)
{
char c;
while (1)
{
/* 打印菜单, 供我们选择测试内容 */
printf("[s] Scan nand flashnr");
printf("[e] Erase nand flashnr");
printf("[w] Write nand flashnr");
printf("[r] Read nand flashnr");
printf("[q] quitnr");
printf("Enter selection: ");
c = getchar();
printf("%cnr", c);
/* 测试内容:
* 1. 识别nand flash
* 2. 擦除nand flash某个扇区
* 3. 编写某个地址
* 4. 读某个地址
*/
switch (c)
{
case 'q':
case 'Q':
return;
break;
case 's':
case 'S':
nand_chip_id();
break;
case 'e':
case 'E':
break;
case 'w':
case 'W':
break;
case 'r':
case 'R':
break;
default:
break;
}
}
}
史海拾趣
|
1.4 深度睡眠模式设置步骤 处理通过调用WFI 指令即可进入睡眠模式,但要进入深度睡眠实现最低的功耗需要正确配置,其步骤如下: 1. 使能ACG 自动时钟门控。这样睡眠模式和深度睡眠模式的外设时钟可以单独控制。 2. 配置寄存器DCGC0、 DCGC1 和DC ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 请问广州哪里有零售漆包线、绝缘纸和绝缘漆的地方?? 昨天下午走了一下午,传说中有这些东西的解放中,都没看见有卖忘各位朋友指出哪里有得买 … 查看全部问答> |
|
FLASH锁死了这是为什么,有没有办法解锁。为什么会有类似下面这几种报错: Read status value 0x0001 from symbol PRG_status(24x系列) ADC Calibration not complete, check if device is unlocked and recalibrate.(2833x系列) 答:FL ...… 查看全部问答> |
|
想问一下各位大侠,施密特触发器对于直流信号是怎么处理的?(我仿真过,发现如果输入一个电压介于两个门限电压之间,那输出电压和输入电压是成比例的,谁能告诉我为什么啊?)… 查看全部问答> |
|
富士通DIY工业控制板原理图及PCB发布 已经1周多了,当初就打算写个硬件说明什么的,让大家使用“富士通DIY工业控制板” 时更加方便。也能让大家明白电路当初那么做的一些意图。上一周基本上已经写好,为了让大家看起 ...… 查看全部问答> |
|
STM3210B--电机控制入门套件 FOC 程序库(sensorless) 附件中的库已经验证在demo板上,运行正常。 [ 本帖最后由 安_然 于 2013-1-30 16:02 编辑 ]… 查看全部问答> |




