51单片机读取不到Nand Flash ID
有没有大神指教一下关于51单片机读取Nand Flash ID,我下面的代码怎么都读取到ID,晶振12M,麻烦指正一下:
// 发送命令如下:
void NF_Command(unsigned char command)
{
NF_CE = 0;
NF_ALE = 0;
NF_CLE = 1;
// SIGNAL_SETUP(10);
NF_WE = 0;
NF_DATA = command;
// SIGNAL_SETUP(130);
NF_WE = 1;
while(!NF_R_B);
// SIGNAL_HOLD(65);
NF_CLE = 0;
NF_ALE = 1;
NF_CE = 1;
NF_WE = 1;
}
// 发送地址如下
void NF_AddrSet(uint addr)
{
NF_CLE = 1;
NF_CE = 1;
NF_WE = 1;
NF_ALE = 0;
NF_DATA = 0xFF;
SIGNAL_SETUP(130);
NF_CE = 0;
NF_CLE = 0;
NF_ALE = 1;
SIGNAL_SETUP(10);
NF_WE = 0;
NF_DATA = (uchar)(addr&0xff); // 输出列地址1
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(5);
NF_ALE = 1;
SIGNAL_SETUP(65);
NF_WE = 0;
NF_DATA = (uchar)((addr&0xff00)>>8); // 输出行地址1
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(5);
NF_ALE = 1;
SIGNAL_SETUP(65);
NF_WE = 0;
NF_DATA = (uchar)((addr&0xff0000)>>16); // 行地址2
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(5);
NF_ALE = 1;
SIGNAL_SETUP(65);
NF_WE = 0;
NF_DATA = (uchar)((addr&0xff000000)>>24);// 列地址2
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(65);
}
unsigned char NF_ReadID()
{
unsigned char makerCode=0x00,deviceCode=0x00;
NF_CE = 1;
NF_CLE = 0;
NF_WE = 1;
NF_ALE = 0;
NF_RE = 1;
NF_CE = 0;
NF_CLE = 1;
NF_WE = 0;
NF_DATA = 0x90;
NF_WE = 1;
NF_CLE = 0;
NF_ALE = 1;
NF_WE = 0;
NF_DATA = 0x00;
// SIGNAL_SETUP(5);
NF_WE = 1;
// SIGNAL_SETUP(5);
NF_ALE = 0;
// SIGNAL_SETUP(5);
NF_RE = 0;
makerCode = 0xff&NF_DATA; // ADH
// SIGNAL_SETUP(5);
NF_RE = 1;
// SIGNAL_SETUP(5);
NF_RE = 0;
NF_DATA = 0xff;
deviceCode = 0xff&NF_DATA; // 76H
// SIGNAL_SETUP(5);
NF_RE = 1;
// SIGNAL_SETUP(5);
return makerCode;
}
命令时序:

地址时序:

读取ID时序:


// 发送命令如下:
void NF_Command(unsigned char command)
{
NF_CE = 0;
NF_ALE = 0;
NF_CLE = 1;
// SIGNAL_SETUP(10);
NF_WE = 0;
NF_DATA = command;
// SIGNAL_SETUP(130);
NF_WE = 1;
while(!NF_R_B);
// SIGNAL_HOLD(65);
NF_CLE = 0;
NF_ALE = 1;
NF_CE = 1;
NF_WE = 1;
}
// 发送地址如下
void NF_AddrSet(uint addr)
{
NF_CLE = 1;
NF_CE = 1;
NF_WE = 1;
NF_ALE = 0;
NF_DATA = 0xFF;
SIGNAL_SETUP(130);
NF_CE = 0;
NF_CLE = 0;
NF_ALE = 1;
SIGNAL_SETUP(10);
NF_WE = 0;
NF_DATA = (uchar)(addr&0xff); // 输出列地址1
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(5);
NF_ALE = 1;
SIGNAL_SETUP(65);
NF_WE = 0;
NF_DATA = (uchar)((addr&0xff00)>>8); // 输出行地址1
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(5);
NF_ALE = 1;
SIGNAL_SETUP(65);
NF_WE = 0;
NF_DATA = (uchar)((addr&0xff0000)>>16); // 行地址2
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(5);
NF_ALE = 1;
SIGNAL_SETUP(65);
NF_WE = 0;
NF_DATA = (uchar)((addr&0xff000000)>>24);// 列地址2
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(65);
}
unsigned char NF_ReadID()
{
unsigned char makerCode=0x00,deviceCode=0x00;
NF_CE = 1;
NF_CLE = 0;
NF_WE = 1;
NF_ALE = 0;
NF_RE = 1;
NF_CE = 0;
NF_CLE = 1;
NF_WE = 0;
NF_DATA = 0x90;
NF_WE = 1;
NF_CLE = 0;
NF_ALE = 1;
NF_WE = 0;
NF_DATA = 0x00;
// SIGNAL_SETUP(5);
NF_WE = 1;
// SIGNAL_SETUP(5);
NF_ALE = 0;
// SIGNAL_SETUP(5);
NF_RE = 0;
makerCode = 0xff&NF_DATA; // ADH
// SIGNAL_SETUP(5);
NF_RE = 1;
// SIGNAL_SETUP(5);
NF_RE = 0;
NF_DATA = 0xff;
deviceCode = 0xff&NF_DATA; // 76H
// SIGNAL_SETUP(5);
NF_RE = 1;
// SIGNAL_SETUP(5);
return makerCode;
}
命令时序:

地址时序:

读取ID时序:


...全文
相关推荐
51nand flash.txt
### NAND Flash 与 51 单片机交互的关键知识点#### 1.
基于单片机的FIash存储器坏块自动检测
由于51单片机采用的是TTL电平标准,而NAND型Flash存储器通常采用CMOS电平标准,两者在电平上的不匹配需要通过电平转换器来实现适配。
基于DSP的Flash存储器坏块自动检测系统
系统的硬件设计以51系列单片机为核心,该单片机具备强大的处理能力和丰富的接口资源,适合于复杂的数据处理任务。
B16A_fortis_die_256gb_nand_datasheet 20170313revD.pdf
原始ID读取和ZQC:NAND闪存可以读取存储在芯片内部的原始ID信息,而ZQC可能是对存储器进行质量检测的机制。
Keil下SST25VF016B SPI Flash驱动开发与实战
SPI Flash是嵌入式系统中常用的外部存储器件,因其接口简单、读写灵活,广泛应用于程序存储、参数保存和固件升级。其核心原理是通过SPI总线发送指令与地址,配合状态寄存器轮询完成擦除、编程等操作。与NAND Flash相比,NOR Flash具有字节随机读取、命令简洁、无需坏块管理等特点,特别适合中小容量、高可靠性的场景。在实际工程中,驱动编写的关键在于理解页编程的边界限制、扇区擦除的时序以及写使能流程。以一份Keil工程中的SST25VF016B驱动源码为实例,详细解析SPI Flash驱动设计要点,包


单片机/工控
