Mini210S 開発キット詳細URL
第XIV章 NAND Flashの読み取り・書き込み・消去
第一節 NAND Flashについて
S5PV210 の NAND Flash コントロールは下記の特徴があります:
1) 512byte、2k、4k、8k ページをサーポート
2) 各種ソフトを通じて、 NAND Flash読み取り・書き込み・消去機能を実現します
3) 8bitのバス
4) SLC 、 MCL NAND Flashをサポート
5) 1/4/8/12/16bit の ECCをサポート
6) レジスタバイト/ハーフワード/ワード単位でデータ/ ECCレジスタバイト/ハーフワード/ワードをアクセスや他のレジスタユニットにアクセスすることをサポートします。
注:ここで使用したのは Mini210S の NAND Flash: タイプ SLC、容量 1G、番号 K9K8G08U0A。本章の内容はSLC NAND Flashに対するもので( 256M/512M/1GB など)、 MLC NANDFlashでは適用しません。
第二節 プログラム説明
完全なコードは、ディレクトリ14.nandご参照ください。前章と比べったら、nand.cファイルが追加し、NAND Flashに対しての操作が加えます。
1. nand.c
<1> NAND Flash 初期化関数 nand_init()、コードは下記の通りです:
void nand_init(void)
{
// 1. NAND Flashコンフィグレーション
NFCONF
= (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0);
NFCONT
=(0<<18)|(0<<17)|(0<<16)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0x3<<1)|(1<<0);
// 2. ピン・コンフィグレーション
MP0_1CON = 0x22333322;
MP0_2CON = 0x00002222;
MP0_3CON = 0x22222222;
// 3. リセット
nand_reset();
}
三つの手順があります:
ステップ 1 NAND Flashコンフィグレーション
NFCONF と NFCONT 2つのレジスタのNAND Flashコンフィグレーション
NFCONF レジスタ
• AddrCycle = 1、When page size is 2K or 4K、 1 = 5 address cycle、Mini210S の NAND Flashのページは 2k、アドレス•サイクルは5つで;
• PageSize = 0、When MLCFlash is 0、 the value of PageSize is as follows: 0 = 2048
Bytes/page、Mini210S は SLC NAND Flashを使用します、そしてページは 2k;
• MLCFlash = 0、ここでは SLC NAND Flashを使用します;
• TWRPH1/TWRPH0/TACLS はアクセスタイミングの設定、 NAND Flashチップマニュアルをご参照ください値は下記のと同じです。 TWRPH1=1、TWRPH0=4、TACLS=1;
• ECCType0/MsgLength、ベアメタル•コードでは ECCを使わないため、ここではグラフを設定しません。
NFCONT レジスタ
• MODE = 1、 NAND Flash コントロールをオンにする;
• Reg_nCE0 = 1、チップセレクトを中止し、 NAND Flash操作時にまたチップセレクトする
• Reg_nCE1 = 1、チップセレクトを中止し、 NAND Flash操作時にまたチップセレクトする
• InitMECC/InitSECC/SECCLock/MECCLock、ベアメタル•コードでは ECCを使わないため、ここでは4つのグラフを任意設定します;
• RnB_TransMode = 0、Detect rising edge、RnB は NAND Flashステータス・プローブ・ピンで、立ち上がりエッジでトリガします;
• EnbRnBINT = 0 、RnB 割り込みを禁止;
• EnbIllegalAccINT = 0、Illegal access割り込みを禁止;
• EnbMLCDecInt/EnbMLCEncInt は MCL 関連、設定する必要はありません;
• LOCK = 0、Soft Lockを使わないため、 Soft Lockを禁止します;
• LockTight = 0、Lock-tightを使わないため、すべての Lock-tightを禁止します;
• MLCEccDirection、MLC関連、設定する必要はありません;
ステップ 2 ピン・コンフィグレーション
NAND Flash 関連機能;
ステップ 3 リセット
リセット関数 nand_reset 関連コード:
static void nand_reset(void)
{
nand_select_chip();
nand_send_cmd(NAND_CMD_RES);
nand_wait_idle();
nand_deselect_chip();
}
NAND Flash のリセット操作は4つの手順があります:
1) チップセレクト送信、実際は NFCONT &= ~(1<<1); NFCONT の bit[1]に 0を書き込みます;
2) リセット・コマンド NAND_CMD_RES (0xff)を送信;実際はNFCMMD = cmd; NFCMMD レジスタにコマンドを書き込みます;
完全な NAND Flash コマンドは下記図ご参照ください:
3) NAND Flash 待ち;実際は while( !(NFSTAT & (BUSY<<4)) )、 NFSTAT の bit[4]を読み取り、NAND Flash の状態を確認します;
4) チップセレクトを中止、実際は NFCONT |= (1<<1); NFCONT のbit[1]に 1を書き込みます;
<2> NAND Flash で ID 関数 nand_read_id()を呼び出します、コードは:
void nand_read_id(void)
{
nand_id_info nand_id;
// 1. チップセレクト送信
nand_select_chip();
// 2. ID読み取り
nand_send_cmd(NAND_CMD_READ_ID);
nand_send_addr(0x00);
nand_wait_idle();
nand_id.IDm = nand_read();
nand_id.IDd = nand_read();
nand_id.ID3rd = nand_read();
nand_id.ID4th = nand_read();
nand_id.ID5th = nand_read();
printf("NANDFlash: makercode = %x、devicecode = %x\r\n"、nand_id.IDm、nand_id.IDd);
nand_deselect_chip();
}
NAND Flash ID 読み取り
上記図のように、NAND Flash の ID読み取り操作は5つの手順があります:
ステップ 1 チップセレクト送信;
ステップ 2 ID 読み取りコマンド送信、コマンド NAND_CMD_READ_ID(0x90);
ステップ 3 アドレス 0x00を送信;関数 nand_send_addr()を呼び出し;
ステップ 4 NAND Flashレディ待つ;
ステップ 5 ID読み取りには、nand_read()関数を使用します、実際はNFDATAレジスタを読み取ります;
次は関数 nand_send_addr()を説明します、コアコードは:
{
//カラムアドレス、すなわち ページ内アドレス
col = addr % NAND_PAGE_SIZE;
//行アドレス、すなわちページアドレス
row = addr / NAND_PAGE_SIZE;
// Column Address A0~A7
NFADDR = col & 0xff;
for(i=0; i<10; i++);
// Column Address A8~A11
NFADDR = (col >> 8) & 0x0f;
for(i=0; i<10; i++);
// Row Address A12~A19
NFADDR = row & 0xff;
for(i=0; i<10; i++);
// Row Address A20~A27
NFADDR = (row >> 8) & 0xff;
for(i=0; i<10; i++);
// Row Address A28~A30
NFADDR = (row >> 16) & 0xff;
for(i=0; i<10; i++);
}
---続く