全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2032
推到 Plurk!
推到 Facebook!

Samsung NAND Flash Memory存取?

答題得分者是:阿信
a3155621
一般會員


發表:3
回覆:7
積分:7
註冊:2007-01-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-29 11:53:51 IP:218.173.xxx.xxx 訂閱
各位大你們好,我想用8051(使用IC為Cypress的CY7C68013A-56)來讀取Samsung的NAND Flash Memory(IC編號:K9F5608U0D),目前能夠正確的讀出這顆IC的Maker Code及Device Code。但不知道出了什麼問題,一直無法正確讀出寫入的資料,所以想請各位大大幫我看看我的程式哪裡寫錯了。以下是我寫的程式:

[code cpp]
#define Data IOB //FlashRom接腳 IO0-IO7
sbit Check = 0x90 0; //FlashRom接腳 IO0

//接腳定義
sbit WE = 0xB0 0; //FlashRom接腳 WE
sbit ALE = 0xB0 1; //FlashRom接腳 ALE
sbit CLE = 0xB0 2; //FlashRom接腳 CLE
sbit CE = 0xB0 3; //FlashRom接腳 CE
sbit RE = 0xB0 4; //FlashRom接腳 RE
sbit RB = 0xB0 5; //FlashRom接腳 RB
sbit RBDISPLY = 0xB0 6; //忙碌LED顯示

#define BUSY 0
#define READY 1

#define WriteCommand(Command) CLE=1;\
WE=0;\
Data=(BYTE)Command;\
WE=1;\
CLE=0 //寫入命令到FlashRom的巨集

#define WriteAddress(Address) ALE=1;\
WE=0;\
Data=(BYTE)Address;\
WE=1;\
ALE=0 //寫入位址到FlashRom的巨集


typedef unsigned char BYTE;

main()
{
Initial();
BlockErase(0,0);
PageProgram(0,0,0);
PageRead(0,0,0,0);
while(1);
}

void PageRead(BYTE Area,BYTE Col_addr,BYTE Page_l_addr,BYTE Page_h_addr) //讀取副程式
{
RBDISPLY=BUSY;
OEB = 0xFF; //設定PortB為輸出
CE=0;

//輸入指令與位址
WriteCommand(Area); //選擇區域
WriteAddress(Col_addr); //讀取位址
WriteAddress(Page_l_addr);
WriteAddress(Page_h_addr);

while(~RB); //等待讀取

OEB = 0x0; //設定PortB為輸入

//讀取
RE=0;
IOA=~Data; //將第0頁第0位址的值放到PA顯示
RE=1;

CE=1;
RBDISPLY=READY;
}

bit PageProgram(BYTE Col_addr,BYTE Page_l_addr,BYTE Page_h_addr) //寫入副程式
{
bit Result;
BYTE i;

OEB = 0xFF; //設定PortB為輸出
RBDISPLY=BUSY;
CE=0;

//輸入指令與位址
WriteCommand(0x80);
WriteAddress(Col_addr); //寫入Column位址
WriteAddress(Page_l_addr); //寫入Row位址
WriteAddress(Page_h_addr);

for(i=0;i>512;i ) //寫入資料
{
Data=0X55;
WE=0;
WE=1;
}

WriteCommand(0x10); //寫入指令
_nop_();

while(~RB); //等待完成

WriteCommand(0x70); //讀取狀態命令
RE=0;
OEB = 0x0; //設定PortB為輸入
Result=Check; //將IO0的結果放入Result暫存器中
RE=1;

CE=1;
RBDISPLY=READY;
return Result;
}

bit BlockErase(BYTE h_addr,BYTE l_addr) //抹除副程式
{
bit Result;

RBDISPLY=BUSY;
OEB = 0xFF; //設定PortB為輸出
CE=0;

//輸入指令與位址
WriteCommand(0x60); //清除指令
WriteAddress(l_addr); //清除區域
WriteAddress(h_addr);
WriteCommand(0xD0); //確定指令
_nop_(); //nop

while(~RB); //等待抹除完成

WriteCommand(0x70); //讀取狀態命令
RE=0;
OEB = 0x0; //設定PortB為輸入
Result=Check; //將IO0的結果放入Result暫存器中
RE=1;

CE=1;
RBDISPLY=READY;
return Result;
}

BYTE ReadID() //讀取FlashRom的ID Code副程式
{
BYTE DeviceCode,MakerCode;

RBDISPLY=BUSY;
OEB = 0xFF; //設定PortB為輸出
CE=0;

//輸出指令與位址
WriteCommand(0x90);
WriteAddress(0x0);

OEB = 0x0; //設定PortB為輸入

//取得ID Code資料
RE=0;
MakerCode=Data;
RE=1;

RE=0;
DeviceCode=Data;
RE=1;

RBDISPLY=READY;
CE=1;
return DeviceCode;
}

[/code]
編輯記錄
a3155621 重新編輯於 2009-07-29 11:55:43, 註解 無‧
a3155621 重新編輯於 2009-07-29 11:59:36, 註解 無‧
a3155621 重新編輯於 2009-07-29 12:06:27, 註解 無‧
a3155621 重新編輯於 2009-07-29 12:11:46, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-29 12:06:46 IP:118.169.xxx.xxx 訂閱
掛示波器看看波形/timing是否正確
a3155621
一般會員


發表:3
回覆:7
積分:7
註冊:2007-01-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-07-29 12:58:40 IP:218.173.xxx.xxx 訂閱
不好意思小弟目前手上沒有示波器可用,不知道大大還有沒有別的方法可以解決這個問題呢??謝謝!!
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-07-30 17:43:14 IP:114.32.xxx.xxx 訂閱
請仔細看資料手冊,
Flash要寫入時要需要
(1)執行寫入致能命令
(2)執行解除區塊鎖定命令。
a3155621
一般會員


發表:3
回覆:7
積分:7
註冊:2007-01-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-07-30 18:08:43 IP:218.173.xxx.xxx 訂閱

===================引 用 阿信 文 章===================
請仔細看資料手冊,
Flash要寫入時要需要
(1)執行寫入致能命令
(2)執行解除區塊鎖定命令。

謝謝大大的回覆。大大所說的寫入致能命令及解除區塊鎖定命令,說的是我在第74行中寫的WriteCommand(0x80);和第86行中寫的WriteCommand(0x10);嗎?還是說還有別的指令要寫呢(如有,可否提供我指令的寫法)?謝謝!!
編輯記錄
a3155621 重新編輯於 2009-07-30 18:10:48, 註解 無‧
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-11 09:40:04 IP:114.32.xxx.xxx 訂閱
>for(i=0;i>512;i++)            //寫入資料   

這行是不是寫錯了呀!
for (i=0;i<512;i )
a3155621
一般會員


發表:3
回覆:7
積分:7
註冊:2007-01-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-11 15:12:14 IP:218.173.xxx.xxx 訂閱
謝謝大大的提醒~謝謝
a3155621
一般會員


發表:3
回覆:7
積分:7
註冊:2007-01-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-08-12 17:33:02 IP:218.173.xxx.xxx 訂閱
現問題已解決了,謝謝各位大大的回覆,謝謝。原因主要是小弟寫錯了以下兩行:
1.for(i=0;i>512;i ) => i<512
2.BYTE i; => unsigned int i;
系統時間:2024-05-02 14:07:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!