
CPU Cortex-M3のマイコンのSPIでSDカードのデータを読むファームを
作成しています。
SDカードの初期化について教えて下さい。
CMD0→CMD1という初期化をするとデータはキッチリ読めます。
ただ、デバイスサイズのリードが少し変です。
UARTでデバイスのサイズを表示させているのですが、
128MB,512MB,1GB,2GBの4種のSDカードで試してみたところ
128BMと1GBはちゃんとサイズ通りなんですが、512MBと2GBのサイズが
変です。(512MB→123MB 2GB→495MBと意味不明なサイズを読みます)
CSDを表示させて計算してもやはり変です。
そこで、とりあえず上記は置いてSDHCにも対応したいということで
初期化ルーチンを変更しました。
ウェブ上で検索して下記のような初期化を組んでみました。
CMD0→CMD8→CMD58→CMD55→ACMD41→・・・
というような流れのものですが、
CMD55まではレスポンスも問題なく返ってきますが、
ACMD41のレスポンスが異常です。
0x00が返ってくるのが正解みたいですが、なぜか0x05が返ってきます。
何回繰り返しても変わりません。
考えられる原因をご教授いただけるとありがたいです。
ちなみに初期化時のクロックは394kHz
電源も波形で確認しましたが問題ありません。
よろしくお願いします。

No.4ベストアンサー
- 回答日時:
ANo.1,2 です。
コマンドとレスポンスの表は2つあり、ACMD41 のレスポンスは
一方は R1 、他方は R3 となっていました。
No.1補足欄のURL先の記事ではレスポンスは1バイトなので、
多分 R1 をチェックしてるのだろうと思いました。
回答 No.1 では R1 の Bit0 は、 "In Idle State"とだけ触れましたが、
あの図の手前の bit 説明文に
"・In idle state—The card is in idle state and running initializing process."
とあります。
イニシャライズ中は"1"、イニシャライズ完了すると"0"になるようなので、これを待つ、
ということかと思われます。
また、これを待つ際に何をするかというと、
SDカードに関するWebページはたくさんありましたが、
"ACMD41 を繰り返し書き込む"とか
"0x00になるまでCMD55 と ACMD41 の両方を書き込む"とか
内容が多少違うのが気になります。

この回答への補足
ありがとうございます。
ACMD41のレスポンスを判定し、0x00以外なら再度ACMD41を再送
というのはやっています。
それを50,000回繰り返してもレスポンスは0x05のままです。
ちなみに、デバッガで追いかけて気付いたのですが、
最初の1回目のレスポンスが0x01で2回目以降が全て0x05で返ってきます。
『0x00になるまでCMD55とACMD41を繰り返す』
ってのはやってないので(ACMD41のみの再送をひたすら繰り返してました)
これはちょっと期待できそうな・・・
CMD55とACMD41ってセットみたいなもん?みたいですもんね。
試してみます。
ありがとうございます。
初期化できました!!!
参考にしたURLをよくみたら
ACMD41のレスポンスで0x01が返ってきたら
CMD55送信から繰り返す、と書いてました。
ほんとに助かりました。
ただ、初期化できましたが、SDHCを挿すと
エラーで返ってきます > <
あとは地道にデバッグするしかなさそうです。
とりあえず先に進めるのでほんとに助かりました。
No.5
- 回答日時:
ANo4を書いたgoma1109です。
>コマンドとレスポンスの表は2つあり、ACMD41 のレスポンスは
>一方は R1 、他方は R3 となっていました。
すいません。 SPIモードのことを失念していました。 SPIモードではR1,バスモードではR3ですね。
>"ACMD41 を繰り返し書き込む"とか
>?"0x00になるまでCMD55 と ACMD41 の両方を書き込む"とか
ACMDxxの”A”は2バイトコマンドの意味で、CMD55を先に発行するということを暗に含んでいるので、同じことを言っているような気がします。
また、SDカードによっては、時間待ちの長さだけではなく、必ずACMD41が2回必要なものがあったことを思い出しました。
この回答への補足
ありがとうございます。
CMD55→レスポンス判定→ACMD41→レスポンス判定→ACMD41→レス→ACMD41→レス・・・
を繰り返していました。
CMD55→レス→ACMD41→レス→CMD55→レス→ACMD41→レス・・・
というふうにするというとですよね。
ACMDの"A"は2バイトの意味・・・
なんか闇が開けたような気がします!
数秒も待たないとダメなときもあるんですか!?
よくわかりませんが、メーカーによる違い、容量による違い・・・
同じSDカードでも細かなとこで色々ありそうですね。
ありがとうございます。
"A"は2バイトコマンドの意味・・・でした^ ^
ACMD41が必ず2回必要なものもあるんですね!?
メーカーによる差異でなんですかね?
こちらも色々試してみます。
助かりました。
No.3
- 回答日時:
はずしているかもしれませんが。
1.ACMD41のレスポンスのタイプはR3なので、レスポンスの長さは48ビットのはずですが。
2.ACMD41のargumentは正しく与えられていますか?
3.正確なところは忘れましたが、メーカーによってはACMD41に対して、Busyではなくなるまで、秒単位の時間がかかったような記憶があります。

No.2
- 回答日時:
ACMD41コマンドのレスポンスとして R1 を読む、との事で
R1 の bit アサインを確認すると、
レスポンスが 0x05 という事は
コマンドエラーも含んでるようです、
発行したコマンドbitパターンのどこかに異常があるかも?
参考URL 先にもあった 0x01 であれば「イニシャライズ中」
ということで合点がいきますが。
とても全体を把握しきれないので、
見方を間違ってたらすみません。

この回答への補足
ありがとうございます。
そういえばレスポンスのビット調べたら何のエラーか
書いてたな・・・
というのを昨日風呂に入ってる時に思い出しましたf^_^;;
コマンドエラーなんですね。
もう少し調べてみます。

No.1
- 回答日時:
詳しくないですが。
ACMD41 はBUSYチェックが必要なようですが大丈夫ですか?
SD ACMD41 レスポンス
で検索すると関係ありそうな記事が見付かるかも。
http://www.google.co.jp/search?hl=ja&q=SD+ACMD41 …
ヒット例
http://www.cqpub.co.jp/hanbai/books/49/49981/499 …

この回答への補足
ありがとうございます。
下記のURLを参考にしています。
http://bitcraft.web.fc2.com/embedded/sdcard/sh71 …
『SDHCを含むSDカードの初期化』
というところです。
『SD ACMD41 レスポンス』で検索はしているのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
ネットワークフォルダの中身を...
-
バッチファイル pause時の文字...
-
コマンドプロンプトで印刷実行
-
system関数のエラー検出
-
ネットワーク内のIPアドレス...
-
SDカードの初期化について
-
VB6.0でVISAを用いる
-
linux duコマンドで困っています。
-
PCに保存していた写真を見られ...
-
VBSでメール送信
-
拡張子をつくる
-
Subversion と TortoiseSVN で ...
-
FFFTP ミラーリングダウンロード
-
キャビネットファイルの破損・・・
-
メルカリを退会して再登録した...
-
ExcelのVBProjectがExcelを開く...
-
FFFTPの自動化バッチについて
-
同一フォルダ内に一見同じファ...
-
Excelで外部のファイルの場所を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
Visual C++からftpを使う
-
system関数のエラー検出
-
ネットワークフォルダの中身を...
-
テキストボックスのフォーカス...
-
ユーザーフォーム内のテキスト...
-
バッチファイル pause時の文字...
-
telnetで接続した先のコマンド...
-
コマンドプロンプトで印刷実行
-
Windowsのバッチファイルでcall...
-
EXCELで右クリックメニューの追加
-
シリアル通信でのread関数の戻り値
-
データリーダーからのデータ読...
-
バッチ(Windows2000)での解析エ...
-
FlashROMにデータを書き込むに...
-
ぱそこん、スマホのos、アプリ...
-
VBAチェックボックスで有効無効...
-
VBA チェックボックスの設定に...
-
コマンドボタンテキストの改行
-
SDカードの初期化について
おすすめ情報