2016.12.5
前へ
次へ
ホームページトップへ戻る

マイコン独立大作戦
SDカードインターフェースの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
作戦その2はキーボードインターフェースです。
そして作戦その3は、SDカードインターフェースです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第25回]


●CMD58

前回少し書きましたようにCMD58はSDHCカードの初期化に必須のコマンドではありません。
しかし「カードがサポートしている電圧範囲を知るために実行するほうがよい」と書かれていますし、初期化プログラムが正しく実行されているかどうかを検証するためにも、「Physical Layer Simplified Specification」で指示されている通りに実行してみることにします。
下図は前回もお見せした「Physical Layer Simplified Specification」からの引用です。

[出典]SD Card Association:Physical Layer Simplified Specification Version 2.00

CMD58は初期化の中と後の2度実行されています。
CMD58の引数は00で、SPIモードではCRC7はチェックされませんから、下のレイアウトになります。
7A 00 00 00 00 FF
10進数の58は16進数では3Aです。
そのビット7と6にスタートビット(01)を付加しますから、7Aになります。
CRC7はチェックされませんからストップビットの1を付加してFFにします(ここは末尾のビットが1なら何でもよいです)。

実行例は[第23回]でお見せしました。
その初期化部分を下に再掲します。

loading SDCDIF5N.BIN ...026d(621)bytes loaded,from 8100 to 836C
>jp 8100
CMD0
FF01
CMD8
FF01000001AA
CMD58
FF0100FF8000
CMD55
FF01
ACMD41
FF01
CMD55
FF01
ACMD41
FF00
CMD58
FF00C0FF8000

CMD58のレスポンスはR3です。


[出典]SD Card Association:Physical Layer Simplified Specification Version 2.00

1番目のCMD58のレスポンスは
01 00 FF 80 00
です。
1バイト目はR1と同じです(R1は前回参照)。
まだ初期化が完了していませんからビット0が1です(idle state)。
続く4バイトはOCRレジスタの値になっています。


[出典]SD Card Association:Physical Layer Simplified Specification Version 2.00

ビット0〜14まではreservedですから0です。
ビット15〜ビット23までが、このカードが対応している電圧範囲です。
1番目のCMD58のレスポンスを今度はビットパターンで下に示します。
00000001 00000000 11111111 10000000 00000000
ビット15〜ビット23が1ですから、このカードは2.7V〜3.6Vまでの電圧範囲に対応していることがわかります。

ところでこのレスポンスと2番目のCMD58のレスポンスを比べて、その違いを確認してみましょう。
00 C0 FF 80 00
ですからビットパターンでは
00000000 11000000 11111111 10000000 00000000
です。
初期化完了後ですから第1バイト(R1)のビット0が0になっています。
ということは普通にアクセスできる状態になったことを示しています。

その次のバイトの上位2ビット(ビット31、ビット30)が1になっています。
上で引用したOCRレジスタテーブルで確認すると、ビット31は初期化が完了(power upが完了)すると1になる、と書いてあります。
ビット30は初期化が完了するまでは0のままですが、初期化が完了してビット31が1になったときにビット30が1ならこのカードはSDHCカードで、0のままならスタンタードのSDカードであることを示しています。
2回目のCMD58のレスポンスではビット31とビット30が1になっていますから、このカードがSDHCカードであることが示されています。

ところで前回の終わりのところで、2GBのSDカードに対してSDHCカード用のプログラムを実行しました。
そのときのCMD58のレスポンスを上の結果と比べてみましょう。

>/ld sdcdif5n.bin,8100
loading SDCDIF5N.BIN ...026d(621)bytes loaded,from 8100 to 836C
>jp 8100
CMD0
FF01
CMD8
FF01000001AA
CMD58
FF0100FF8000
CMD55
FF01
ACMD41
FF01
CMD55
FF01
ACMD41
FF00
CMD58
FF0080FF8000

1回目のCMD58のレスポンスは
01 00 FF 80 00
ですからSDHCカードと同じです。
2回目は
00 80 FF 80 00
ですからビット31は1ですが、ビット30は0のままです。
このカードはスタンタードのSDカードであることが示されています。

SDカードインターフェースの製作[第25回]
2016.12.5upload

前へ
次へ
ホームページトップへ戻る