マイコン独立大作戦
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
前へ
次へ
ホームページトップへ戻る