プロが教えるわが家の防犯対策術!

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
電源も波形で確認しましたが問題ありません。

よろしくお願いします。

A 回答 (5件)

詳しくないですが。



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 …
「SDカードの初期化について」の回答画像1

この回答への補足

ありがとうございます。

下記のURLを参考にしています。

http://bitcraft.web.fc2.com/embedded/sdcard/sh71 …

『SDHCを含むSDカードの初期化』
というところです。

『SD ACMD41 レスポンス』で検索はしているのですが・・・

補足日時:2010/11/10 19:22
    • good
    • 0

ACMD41コマンドのレスポンスとして R1 を読む、との事で


R1 の bit アサインを確認すると、
レスポンスが 0x05 という事は
コマンドエラーも含んでるようです、
発行したコマンドbitパターンのどこかに異常があるかも?

参考URL 先にもあった 0x01 であれば「イニシャライズ中」
ということで合点がいきますが。

とても全体を把握しきれないので、
見方を間違ってたらすみません。
「SDカードの初期化について」の回答画像2

この回答への補足

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

もう少し調べてみます。

補足日時:2010/11/11 09:44
    • good
    • 0

はずしているかもしれませんが。


1.ACMD41のレスポンスのタイプはR3なので、レスポンスの長さは48ビットのはずですが。
2.ACMD41のargumentは正しく与えられていますか?
3.正確なところは忘れましたが、メーカーによってはACMD41に対して、Busyではなくなるまで、秒単位の時間がかかったような記憶があります。 
    • good
    • 0

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 の両方を書き込む"とか
内容が多少違うのが気になります。
「SDカードの初期化について」の回答画像4

この回答への補足

ありがとうございます。

ACMD41のレスポンスを判定し、0x00以外なら再度ACMD41を再送
というのはやっています。

それを50,000回繰り返してもレスポンスは0x05のままです。

ちなみに、デバッガで追いかけて気付いたのですが、
最初の1回目のレスポンスが0x01で2回目以降が全て0x05で返ってきます。

『0x00になるまでCMD55とACMD41を繰り返す』
ってのはやってないので(ACMD41のみの再送をひたすら繰り返してました)
これはちょっと期待できそうな・・・

CMD55とACMD41ってセットみたいなもん?みたいですもんね。

試してみます。

補足日時:2010/11/12 15:53
    • good
    • 0
この回答へのお礼

ありがとうございます。

初期化できました!!!
参考にしたURLをよくみたら
ACMD41のレスポンスで0x01が返ってきたら
CMD55送信から繰り返す、と書いてました。

ほんとに助かりました。

ただ、初期化できましたが、SDHCを挿すと
エラーで返ってきます > <

あとは地道にデバッグするしかなさそうです。

とりあえず先に進めるのでほんとに助かりました。

お礼日時:2010/11/15 11:17

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カードでも細かなとこで色々ありそうですね。

補足日時:2010/11/12 16:00
    • good
    • 0
この回答へのお礼

ありがとうございます。

"A"は2バイトコマンドの意味・・・でした^ ^

ACMD41が必ず2回必要なものもあるんですね!?
メーカーによる差異でなんですかね?

こちらも色々試してみます。

助かりました。

お礼日時:2010/11/15 11:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!