Mini210S 開発キット詳細URL
第XIV章 NAND Flashの読み取り・書き込み・消去
第二節 プログラム説明
まず、ページの大きさに応じてページ•アドレスとページオフセット•アドレスを取得して、そして5つのサイクルを介してアドレスを送信します。実際はNFADDRレジスタを書き込み、各サイクルの送信方法はNAND Flash のチップマニュアルをご参照ください。詳細は下記図のように:
アドレスが送信された後、ID 5を読み出すことができます、一番目は MAKDER CODE、2番目はDEVICE CODEです。
<3> NAND Flash 消去関数 nand_erase()、コアコードは:
{
// rowアドレス、ページのアドレス取得
unsigned long row = block_num * NAND_BLOCK_SIZE;
// 1. チップセレクトシグナル送信
nand_select_chip();
// 2. 消去:第1サイクルコマンド 0x60を送信、第2サイクルは•ブロック•アドレスを送信、第3サイクルはコマンド 0xd0nand_send_cmd(NAND_CMD_BLOCK_ERASE_1st)を送信;
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;
NFSTAT = (NFSTAT)|(1<<4);
nand_send_cmd(NAND_CMD_BLOCK_ERASE_2st);
for(i=0; i<10; i++);
// 3. 準備完了を待ち
nand_wait_idle();
// 4. ステータスを読み取り
unsigned char status = read_nand_status();
}
上記図によって、NAND Flash の消去操作は6つの手順があります:
ステップ 1 チップセレクト送信;
ステップ 2 消去コマンド 1 NAND_CMD_BLOCK_ERASE_1(0x60) 送信;
ステップ 3 ページアドレスを送信;
ステップ 4 消去コマンド 2 NAND_CMD_BLOCK_ERASE_2st(0xD0) 送信;
ステップ 5 NAND Flash準備完了を待ち;
ステップ 6 ステータスを読み取り、消去状態を確認します。消去に失敗した場合、不良ブロックをプリントアウトして、チップセレクトをキャンセルします、それ以外の場合は直接チップセレクトをキャンセルできます。 ステータス読み取りにはread_nand_status()を使用します、実際はnand_send_cmd(NAND_CMD_READ_STATUS);ch=nand_read();ステータス状態読み取り、NAND_CMD_READ_STATUS、続いて値を読み取ります。
<4> NAND Flash関数 copy_nand_to_sdram()、 NAND Flash からデータを DRAMに読み取ります、コアコードは:
{
// 1. チップセレクト送信
nand_select_chip();
// 2. Nandからsdramにデータを読み取り、第1サイクルコマンド0x00を送信、第2サイクルは•アドレスnand_addrを送信、第3サイクルはコマンド0x30を送信、1ページ(2K)のデータを読み取ります
while(length)
{
nand_send_cmd(NAND_CMD_READ_1st);
nand_send_addr(nand_addr);
NFSTAT = (NFSTAT)|(1<<4);
nand_send_cmd(NAND_CMD_READ_2st);
nand_wait_idle();
// カラムアドレス、ページ内アドレス
unsigned long col = nand_addr % NAND_PAGE_SIZE;
i = col;
// 1ページのデータを読み取り、毎回は 1byteコピーして、データの長さ lengthが完了するまで合計2048回の(2K)コピーします。
for(; i<NAND_PAGE_SIZE && length!=0; i++、length--)
{
*sdram_addr = nand_read();
sdram_addr++;
nand_addr++;
}
}
// 3. ステータス読み取り
unsigned char status = read_nand_status();
}
NAND Flash読み取り操作
上記図によって、NAND Flash の読み取り操作は7 つの手順があります:
ステップ 1 チップセレクト送信;
ステップ 2 読み取りコマンド 1 NAND_CMD_READ_1st(0x00)を送信;
ステップ 3 アドレス読み取り関数nand_send_cmd()を呼び出し、5つのアドレス・サイクルを送信します;
ステップ 4 読み取りコマンド 2 NAND_CMD_READ_2st(0xD0) を送信;
ステップ 5 NAND Flash準備完了を待ち;
ステップ 6 ページ内のオフセットから読み始め、ページの最後を読んで、毎回1byteを読み取ります;
ステップ 7 ステータスを読み取り、成功するかどうかを判決します。
<5> NAND Flash 書き込み関数 copy_sdram_to_nand ()、DRAMから NAND Flashにデータを書き込みます、コアコードは下記の通りです:
{
// 1. チップセレクトシグナル送信
nand_select_chip();
// 2. Sdramから nandにデータを読み取り、第1サイクルコマンド0x80を送信、第2サイクルはアドレスnand_addrを送信、第3サイクルは1ページ(2K)のデータを書き込み、第4サイクルはコマンド 0x10を送信;
while(length)
{
nand_send_cmd(NAND_CMD_WRITE_PAGE_1st);
nand_send_addr(nand_addr);
//カラムアドレス、ページ内アドレス
unsigned long col = nand_addr % NAND_PAGE_SIZE;
i = col;
// 1ページのデータを書き込み、毎回は 1byteコピーして、データの長さlengthが完了するまで合計2048回の(2K)コピーします。
for(; i<NAND_PAGE_SIZE && length!=0; i++、length--)
{
nand_write(*sdram_addr);
sdram_addr++;
nand_addr++;
}
NFSTAT = (NFSTAT)|(1<<4);
nand_send_cmd(NAND_CMD_WRITE_PAGE_2st);
nand_wait_idle();
}
// 3. ステータス読み取り
unsigned char status = read_nand_status();
上記図によって、NAND Flash の書き込み操作は7つの手順があります:
ステップ 1 チップセレクト送信;
ステップ 2 書き込みコマンド 1 NAND_CMD_WRITE_PAGE_1st (0x80)を送信;
ステップ 3 アドレスを送信、関数nand_send_cmd()を呼び出し、 5つのアドレス・サイクルを送信します;
ステップ 4 読み取りコマンド 2 NAND_CMD_WRITE_PAGE_2st (0x10) を送信;
ステップ 5 NAND Flash準備完了を待ち;
ステップ 6 ページ内のオフセットから書き込み、ページの最後まで書き込み、毎回1byteを書き込みます;
ステップ 7 ステータスを読み取り、成功するかどうかを判決します。
2. main.c
main.c 中、まず関数 nand_init()を呼び出しNAND Flashを初期化します、続いてメニューをプリントアウトして、4種のオプションがあります:
NAND Flashテスト:
ID 読み取り機能(nand_read_id());
消去機能(nand_erase());
読み取り機能(copy_nand_to_sdram());
書き込み機能(copy_sdram_to_nand());
第三節 コードコンパイルとプログラミングの実行
コードをコンパイルし、Fedora端末で下記のコマンドを実行します:
# cd 14.nand
# make
14.nandのディレクトリ下にnand.binを生成し、それを開発ボードにプログラムします。
第四節 実験現象
先ずは数字 1、2、3、4...、をプリントアウトし続き、 KEY1 を押すと外部割り込み EINT16_31 は発生し、IRQ_handlerにジャンプします。最後にirq_handler()と割り込みハンドラ関数isr_key()を呼び出します。当関数は先ず゜we get company:EINT16_31゜をプリントアウトします、そして割り込みをクリアします。テスト結果は次のとおりです:
---続く