Mini210S 開発キットOSなしのプログラム開発手順連載(18)

Mini210S/Tiny210等開発ボード関連のフォラーム

Mini210S 開発キットOSなしのプログラム開発手順連載(18)

投稿記事by dwtechadm » 金 5 10, 2013 4:13 pm

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++);
}




---続く
dwtechadm
 
記事: 60
登録日時: 月 2 25, 2013 1:35 pm

Return to Cortex-A8関連

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[0人]