有沒有大神指教一下關于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時序:


uj5u.com熱心網友回復:
首先,在寫資料的時候,應該先準備資料,之后寫使能,所以NF_WE = 0;
NF_DATA = 0x90;
對調一下;
其次,雖然51頻率很低,不過適當延時還是必要的,先根據時序要求多加點延時,
調通了再將延時改小
uj5u.com熱心網友回復:
可能不是這個問題呢,我試過了移到前面,延時也試過,都不行。后來看了一下,是接到51的P0口上的,所以,估計應該是P0口不能輸出1。uj5u.com熱心網友回復:
好吧,那看P0有上拉電阻沒轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/12367.html
標籤:單片機/工控
上一篇:esp8266下載問題
下一篇:請問各位大佬 這種時序圖怎么看?
