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

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

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

[第23回]


●SDHCカード(SDカードVer.2x)初期化プロセス

前回の続きということでまずはCMD8について書こうとしましたら、根拠があいまいなまま使っていたことがわかりました。
それを調べていく過程で、ほかにもいい加減な理解のままコマンドを使っていたところなども出てきて、それでそのあたりをしっかり理解するために、ここ3日ほど苦闘しておりました。
努力の甲斐あって、やっと理解がいきました。
そこでプログラムも作り直して、あらためて実行して動作を確認しました。
[第5回]で実行結果をお見せしましたが、内容が少し異なっていますので、あらためて最新の実行結果をお見せします。
プログラムも前回お見せしたものからかなり変わりましたが、それについては初期化プロセスの説明のあとでお見せすることにします。

logfile nd80zlog\12031752.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/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
FF00C0FF8000
CMD9
FF00FFFE400E00325B5900003B537F800A4000211278FFFFFF
RTEST
FF00FFFFFE
[00000000]
8800  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8810  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8820  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8830  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8840  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8850  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8860  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8870  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8880  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8890  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88C0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8900  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8910  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8920  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8930  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8940  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8950  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8960  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8970  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8980  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8990  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 82  ................
89C0  03 00 0B 19 D1 C8 00 20-00 00 00 30 ED 00 00 00  ....ムネ. ...0....
89D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA  ..............Uェ

>/exit
0000 00C3 - 
リモート接続を終了しました
logfile closed at Sat Dec 03 17:54:24 2016

上のログのうち、初期化のプロセスを実行しているのは、RTESTよりも前の部分です。
今回のプログラム作成については[第8回]でちょっと紹介いたしました、SD Association のSimplified Specificationsでダウンロードできる「Physical Layer Simplified Specification 」を参考にしました。
同サイトで確認しましたところ、2016年12月現在の最新版はVersion5.00ですが、私が参考にしましたのは、たまたまGoogle検索でみつけたものをそのままダウンロードしましたので、かなり以前のVersion2.00です。
テストに使っておりますSDHCカードもいつのものか定かではない古いものですので、まあ、昔のバージョンでもよいかも。

下図がSDHCカード初期化の概略フローです。
当初は随分面倒で分かりにくい手続きだと思ったのですが、そう思ったのはよく理解していなかったからでした。
上記ドキュメントをしっかり読んで理解できたあとであらためてフローを整理してみますと、それほど複雑でも面倒でもないように思えます。



●CMD8

さてSDHCカードの初期化でCMD0の次に実行するのがCMD8なのですが、このコマンドがよくわからなくて随分悩みました。
このコマンドはSDHCカード(Ver.2)で新たに作られたものらしく、ネットで検索してもほとんど情報が得られません。
ところがあらためて「Physical Layer Simplified Specification 」をよくよく確認してみましたら、しっかり書いてありました。


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

上記の説明文から、CMD8としては次の6バイトをSDHCカードに送ればよいことが理解できました。
48 00 00 01 AA 87

引数の3バイト目はTable4−15から0001bを指定します。
4バイト目はチェックパターンで何でもよいのですが、四角で囲んだ「Application Note」で’AA’にするとよい、と書かれていますので、素直にそれに従います。
最後の5バイト目はCRC7+ストップビット(1)です。
CRC7の計算については[第7回]に書きました。
そこで紹介したプログラムCRC7.BINを使ってCMD8のCRC7を計算しました。

logfile nd80zlog\12031749.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld crc7.bin,8100
loading CRC7.BIN ...0041(65)bytes loaded,from 8100 to 8140
>cm 8103
8103 00-48
8104 00-
8105 00-
8106 00-01
8107 00-aa
8108 CD-
>jp 8100
19 32 64 41 0B 16 2C 58 39 72 6D 53 2F 5E 35 6A 5D 33 66 45 03 06 0C 19 33 66 44 01 03 06 0D 1A 34 68 59 
3B 76 65 43 
>/exit
0000 00C3 - 
リモート接続を終了しました
logfile closed at Sat Dec 03 17:50:48 2016

計算の結果は43になりました。
1000011です。
この後ろにストップビットを追加して10000111にします。

CMD8を送った結果は、上の方でお見せしたログにありますが、下に再記します。

CMD8
FF01000001AA

CMD8のレスポンスはR7(5バイト)です。


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

第1バイトはCMD0のレスポンス(R1)と同じで、ビット0のみ1(idle state)になります。
4バイト目と5バイト目はCMD8で送った引数の第3、第4バイトの値がそのまま返ってきます。

実はCMD8は初期化に必須なコマンドではありません(カードによっては必要な場合もあるようですが)。
CMD8はVer.2のSDカード(SDHCカード)のみで認識可能なコマンドなので、これを使って、SDHCカードと2GBまでのSDカードとの振り分けに使いなさいよ、ということのようです。
CMD8はSDカードでは認識されずコマンドエラーになります。

上記削除については次回にて説明します(2016.12.4)。

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

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