SDカードの操作コマンド
mmc7144.c プログラムで実行できるSDカードコマンド。CMD0 をはじめ、CMD1 CMD9 CMD10 CMD17 CMD24 ACMD41 CMD58 CMD8 などをコマンドライン形式でSDカードに送ることができます。CMD55 も、内部で ACMD41 で使用しています。
最初は、CMD0 CMD1 のカードを使えるようにします。この方法は、2GB以下のSDカードなら使えます。

SDカードの操作コマンドで、カードをREDY状態にする

電源ONで以下のようにターミナルに表示します。ここで、SH2-Bug>の右の" " はターミナルのカーソルです。
SH7144 monitor
SH2-Bug> この状態で、SDカード操作のコマンドを受付ます。

最初に、SDカードの電源OFF、ONのシーケンスをスタートさせ、カードにコマンドを出せる状態にします。"mmcinit" は、一度カードを取り出して、ソケットにカードを入れた直後の状態を作り出します。
SH2-Bug>mmcinit ここで Enter キーを押します

2GBまでのSDHCでないカードを、CMD0、 CMD1、 でカードにアクセスできる状態である "ready" にする手順を説明します。
最初にSDカードに CMD0 コマンドを出します。"cmd 0" Enter と、"cmd" と "1" の間は1個のスペースで区切ります。
SH2-Bug>cmd 0 ここで Enter キーを押します
response = 01 SDカードが応答すると、そのレスポンスを表示します
SH2-Bug>

次にSDカードに CMD1 コマンドを出します。"cmd 1" Enter
SH2-Bug>cmd 1 ここで Enter キーを押します
response = 01 SDカードが応答すると、そのレスポンスを表示します
SH2-Bug>
レスポンスが01なので、まだカードは使えません。何回か CMD1 をだしますが、そのたびにコマンドをだすのは面倒なので、モニタのコマンド記憶機能を使います。モニタのコマンド入力は、1回前のコマンドを記憶しており、それを呼び出すのは、コマンドラインに何も入力せず、Enter のみ入力すると、前回のコマンドが入力されて、まだ実行されてない状態が再現されます。
SH2-Bug> ここで Enter キーを押すと、以下のようになります。
SH2-Bug>cmd 1 ここまで入力された状態が再現されます。ここで Enter を押します
response = 01 SDカードが応答すると、そのレスポンスを表示します
SH2-Bug> ここで、再び Enter のみ入力します。
SH2-Bug>cmd 1
response = 00 SDカードが00を応答すると、カードのリード、ライトなどができます。
SH2-Bug>


SDカードのID情報を読み出す

カードが ready になると、リード、ライトができますが、その前にSDカードのID情報を読み出して、カード容量、カードの種類を確かめます。IDは、 CMD9 コマンドの128ビットのレスポンスに含まれます。
SH2-Bug>cmd 9 ここで Enter キーを押します。
CSD = 00 FF FE 00 7F FF 32 5F 5A 83 CD 76 DB DF FF 96 80 00 ED 12 5C FF
CSD Version 1.0 C_SIZE = 0x0F36 x 0200 kB 1993728 kB
SH2-Bug>

CSDの情報バージョンが1で、このカードは、約2GBの容量があることが判ります。
また、CSD = 00 FF FE .... で、 CMD9 に対するレスポンスが、00 で、続いて FF はCSDレスポンス待ち、そして FE が、次から CSD が続いていることを示すスタートバイトです。CSDは、区切りの悪いビット列なので、バイト境界で区切って表示すると、内容を読むのは困難です。
FE の後、00 のMSB2ビットが、CSD Version を表します。MSBが00なら、Version 1.0 になります。MSBが01なら、SDHCの、Version 2.0 になります。00 から、16バイトがCSDで、16バイト目の ED は、crc7 を含んでいます。その後2バイトの、12 5C は、スタートバイトの FE から ED までの 17バイトの crc16 になっています。

SDカードの任意のセクタのデータを1セクタ(512バイト)読み出す

読み出しコマンドは、CMD17 で、"cmd 17,0" などと、コマンド番号に、"," に続いて読み出しアドレスを追加します。0では、先頭アドレスになります。このコマンドでは、アドレス値がそのまま CMD17 の argument になります。SDHCでは、読み出しアドレスは、セクタ番号になりますから、SDHCでない場合とは異なります。
SH2-Bug>cmd 17,0 ここで Enter キーを押します。
read buffer address =FFFFE000
return crc16 = C803 calc crc16 = C803
response = 00FE
SH2-Bug>
read buffer address = FFFFE000 は、SH2の内臓RAMの先頭で、ここに1セクタ512バイト読みます。
return crc16 = C803 は、カードから読み出したCRC値、calc crc16 = C803 は 読み出したデータから計算で求めたCRC値となっています。一致しているのが判ります。
response = 00FE は、00 が、CMD17 コマンドのレスポンス、FE は、データが始まるというレスポンス。

SDカードの任意のセクタに、SH2のメモリの内容を1セクタ(512バイト)書く

ライトコマンドは、CMD24 で、"cmd 24,4000000" などと、コマンド番号に、"," に続いてライトする場所を指示するカードアドレを追加します。このコマンドでは、カードアドレスがそのまま CMD24 の argument になります。SDHCでは、カードアドレスは、セクタ番号になりますから、SDHCでない場合とは異なります。書くデータは、SH2の内臓SRAMの、0xFFFFE000 番地から512バイトが対象です。
SH2-Bug>cmd 24,4000000 ここで Enter キーを押します。
write buffer address =FFFFE000
command response = 00 wait ready count = 0x0000005F write response = E5
SH2-Bug>
ライトの場合は、コマンドレスポンスが 00 のとき、書き込み準備ができたということで、データの始まりを示す、0xFEを出して、続いて512バイトを出します。この後、CRC16を出して、レスポンスを待ちます。0xFFでないレスポンスがあると、LSB4ビットを調べ、0x5だとCRC16を含めて正常にデータが転送されたことを示します。

SDカードへのライトで、誤ったCRC16を送って動作を確かめる

SPIモードでは、CRC16のチェックをしないので、データ個数に間違いが無ければ0x5以外のレスポンスが返ることはありません。 このことを確かめられるように、モニタには、意図的に、CMD24 で誤ったCRC16を出す機能があります。 それは、以下のように、cmd 24,4000000,1 などと、コマンド引数に1を追加します。
SH2-Bug>cmd 24,4000000,1 ここで Enter キーを押します。
write buffer address =FFFFE000
command response = 00 wait ready count = 0x0000005F write response = E5
correct crc16 = 960E send crc16 = 69F1
SH2-Bug>
correct crc16 = 960E send crc16 = 69F1 という行が追加され、誤ったCRC16でも、0xE5のレスポンスが返っているのが判ります。書いたあと、cmd 17,4000000 で同じアドレスを読むと、CRC16も表示されますから、960E が正しいCRC16だと判ります。


SDカードへの個々のコマンドをまとめて発行し、リード、ライトの操作性を向上したコマンド

いままで解説したコマンドは、SDカードを操作するというより、動作確認を目的としたテスト的なものなので、3種類のコマンドに統合します。 ここでのコマンドは、CMD0 CMD1 CMD9 CMD17 CMD24 のコマンドではなく、CMD0 CMD8 CMD58 CMD55 ACMD41 CMD58 CMD9 でカードを ready にする方法になります。この手順では、SDHCも操作できます。
  1. SDカードを使える状態にするコマンド。 "Si"
  2. SDカードの任意のアドレスから、メモリの任意の番地へ、指定セクタを連続で読み出す。 "Sr x,y,z"
  3. SDカードの任意のアドレスから、メモリの任意の番地のデータを、指定セクタ連続で書く。 "Sw x,y,z"
SDカードを使える状態にするコマンド。 "Si"

ここで、コマンドは、大文字の "S"、小文字の "i" になります。小文字の "s" は、メモリの変更コマンドに使っているので、区別するためです。
SH2-Bug>Si ここで Enter キーを押すと、以下のようにコマンドが進みます
CMD0 response = 01
CMD8 response = 01 card interface = 00 00 01 AA FF 00 
CMD58 response = 01 OCR = 00 FF 80 00 FF FF 
ACMD41 response 55 = 00 response 41 = 00 ACMD41 count =   5 (  215 ms )
CMD58 response = 00 OCR = 80 FF 80 00 FF FF 
CMD9 response = 00
 CSD = FF FE 00 2F 00 32 5F 5A 83 C7 6D B7 FF BF 96 80 00 45 70 68 FF 
 CSD Version 1.0 C_SIZE  = 0x0F1E x 0x0200 kB 1981440 kB 
SH2-Bug>

SDカードの任意のアドレスから、メモリの任意の番地へ、指定セクタを連続で読み出す。 "Sr x,y,z"

ここで、x は読み出し開始のカードアドレス、 y は読み出すSH2のメモリ番地、 z はセクタ数 になります。x,y,z はすべてヘキサで表現します。"Si" コマンドでSDHCだと判定された場合は、x は、開始セクタ番号として扱いますから、実アドレス/0x200 となります。この例でが、2GBのカードなので、SDカードアドレスは、実アドレスそのものになります。
SH2-Bug>Sr 1ee00,ffffe000,2 ここで Enter キーを押します
SH2-Bug>
読み出しでは、エラーがなければ途中のメッセージはでてきません。この例では、SDカードの 0x1EE00 番地から2セクタ呼んでいますが、このアドレスは、いわゆる ブートセクター の位置を読んでおり、SDカードファイルシステムの情報が記述された部分です。SDカードのアドレス 0x1EE00 と 0x1F000 番地を読み出したSH2のメモリ番地、0xFFFFE000 と 0xFFFFE200 番地の先頭をダンプすると、以下のようになります。
ここで使用したSDカードは、デジカメでFAT16でフォーマットしたSDカードです。
SH2-Bug>dffffe000
ADDR      0 1  2 3  4 5  6 7  8 9  A B  C D  E F  ascii
FFFFE000 EB00 9020 2020 2020 2020 2000 0240 0100 [ ...        ..@..]
FFFFE010 0200 0200 00F8 F400 3F00 4000 F700 0000 [ ........?.@.....]
FFFFE020 09D7 3C00 8000 2913 18FD E020 2020 2020 [ .ラ<...)....     ]
FFFFE030 2020 2020 2020 4641 5431 3620 2020 0000 [       FAT16   ..]
FFFFE040 0000 0000 0000 0000 0000 0000 0000 0000 [ ................]
FFFFE050 0000 0000 0000 0000 0000 0000 0000 0000 [ ................]
FFFFE060 0000 0000 0000 0000 0000 0000 0000 0000 [ ................]
FFFFE070 0000 0000 0000 0000 0000 0000 0000 0000 [ ................]
SH2-Bug>dffffe200
ADDR      0 1  2 3  4 5  6 7  8 9  A B  C D  E F  ascii
FFFFE200 F8FF FFFF FFFF FFFF 0500 0600 0700 0800 [ ................]
FFFFE210 0900 0A00 0B00 0C00 0D00 0E00 0F00 1000 [ ................]
FFFFE220 1100 1200 1300 1400 1500 1600 1700 1800 [ ................]
FFFFE230 1900 1A00 1B00 1C00 1D00 1E00 1F00 2000 [ .............. .]
FFFFE240 2100 2200 2300 2400 2500 2600 2700 2800 [ !.".#.$.%.&.'.(.]
FFFFE250 2900 2A00 2B00 2C00 2D00 2E00 2F00 3000 [ ).*.+.,.-.../.0.]
FFFFE260 3100 3200 3300 3400 3500 3600 3700 3800 [ 1.2.3.4.5.6.7.8.]
FFFFE270 3900 3A00 3B00 3C00 3D00 3E00 3F00 4000 [ 9.:.;.<.=.>.?.@.]
SH2-Bug>
アドレス、0xffffe000 のアスキーダンプを見ると、"FAT16" という文字があり、FAT16のファイルシステムだとわかります。さらに、このブートセクタには、いわゆる”ローダー”は書かれていないので、単なるデータ用のストレージデバイスです。
アドレス、0xffffe200 は、FATテーブルになっています。

SDカードの任意のアドレスから、メモリの任意の番地のデータを、指定セクタ連続で書く。 "Sw x,y,z"

ここで、x は書き出し開始のカードアドレス、 y は書くべきデータが入ってるSH2のメモリ番地、 z はセクタ数 になります。x,y,z はすべてヘキサで表現します。"Si" コマンドでSDHCだと判定された場合は、x は、開始セクタ番号として扱いますから、実アドレス/0x200 となります。この例でが、2GBのカードなので、SDカードアドレスは、実アドレスそのものになります。 。"Si" コマンドでSDHCだと判定された場合は、x は、開始セクタ番号として扱いますから、実アドレス/0x200 となります。この例でが、2GBのカードなので、SDカードアドレスは、実アドレスそのものになります。
SH2-Bug>Sw 40000000,ffffe000,2 ここで Enter キーを押します
SH2-Bug>
この例では、書き出し開始のカードアドレスが、0x40000000 と、1GB先頭と大きいですが、多分このあたりにはデータは無いと判断しているだけです。フォーマット後、数枚の写真を撮った状態では、このあたりに画像は書かれていません。






戻る


inserted by FC2 system