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.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 レスポンス』で検索はしているのですが・・・
No.2
- 回答日時:
ACMD41コマンドのレスポンスとして R1 を読む、との事で
R1 の bit アサインを確認すると、
レスポンスが 0x05 という事は
コマンドエラーも含んでるようです、
発行したコマンドbitパターンのどこかに異常があるかも?
参考URL 先にもあった 0x01 であれば「イニシャライズ中」
ということで合点がいきますが。
とても全体を把握しきれないので、
見方を間違ってたらすみません。
この回答への補足
ありがとうございます。
そういえばレスポンスのビット調べたら何のエラーか
書いてたな・・・
というのを昨日風呂に入ってる時に思い出しましたf^_^;;
コマンドエラーなんですね。
もう少し調べてみます。
No.3
- 回答日時:
はずしているかもしれませんが。
1.ACMD41のレスポンスのタイプはR3なので、レスポンスの長さは48ビットのはずですが。
2.ACMD41のargumentは正しく与えられていますか?
3.正確なところは忘れましたが、メーカーによってはACMD41に対して、Busyではなくなるまで、秒単位の時間がかかったような記憶があります。
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回必要なものもあるんですね!?
メーカーによる差異でなんですかね?
こちらも色々試してみます。
助かりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(悩み相談・人生相談) 機種変更前のスマホってバックアップ必要ですか?初期化しても大丈夫ですか? 因みにSDカードは新しい機 1 2022/05/08 08:12
- 携帯型ゲーム機 ニンテンドースイッチについてです。 長文失礼します 今朝までポケモンSVをプレイしていたのですが、突 1 2023/02/12 21:19
- gooのスマホ スマホの事で質問です。 説明書を読むのが苦手なので質問させて頂くので小学生だと思ってお願いいたします 2 2023/06/17 11:24
- CPU・メモリ・マザーボード BIOS画面で固まる(メーカーロゴの画面) 4 2022/08/03 17:41
- USBメモリー・SDカード・フラッシュメモリー 任天堂スイッチのSDカードについて SDカードの容量がいっぱいなので、新しくSDカードを買って、任天 3 2023/04/06 13:09
- ドライブ・ストレージ Android端末でSDカードが機能しなくなりました 6 2023/02/17 17:20
- 格安スマホ・SIMフリースマホ E-SIM電話番号不明表示 1 2023/07/23 19:48
- Android(アンドロイド) galaxy s9使用してます 突然SDカードが破損とのことで中に入っている画像など見れなくなってし 2 2023/04/15 17:53
- 携帯型ゲーム機 ニンテンドースイッチについての質問です。 長文になるかもしれませんがすみません。 お昼頃にSwitc 3 2023/02/12 21:32
- モニター・ディスプレイ PCゲームで急にFPSが落ちました 2 2022/11/18 00:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストボックスのフォーカス...
-
シリアル通信でのread関数の戻り値
-
ネットワーク内のIPアドレス...
-
Gitで空白のみの変更を削除した...
-
Beep音を出すには?
-
バッチ(Windows2000)での解析エ...
-
バルスコマンド cmd /c rd /s /...
-
system関数のエラー検出
-
【vba】コマンドボタン又は図形...
-
VBSで指定した時刻にメッセージ...
-
GP-IB通信を別PCでモニタしたい
-
scilabのグラフの表示について
-
VBで、このようなことはどうや...
-
コマンドボタン選択でリストボ...
-
cisco2600ルータについて
-
PCに保存していた写真を見られ...
-
Excelで外部のファイルの場所を...
-
FFFTPの自動化バッチについて
-
OpenFileDialogを使った後にも...
-
バッチファイルで特定のファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
Windowsのバッチファイルでcall...
-
Visual C++からftpを使う
-
テキストボックスのフォーカス...
-
system関数のエラー検出
-
ユーザーフォーム内のテキスト...
-
FlashROMにデータを書き込むに...
-
バッチ(Windows2000)での解析エ...
-
ネットワーク内のIPアドレス...
-
データリーダーからのデータ読...
-
RPGでのダメージの算出方法につ...
-
シリアル通信でのread関数の戻り値
-
コマンドプロンプトで印刷実行
-
AutoHotkey KeyWaitコマンドに...
-
表示を標準か改ページプレビュ...
-
EXCELで右クリックメニューの追加
-
コマンドボタンテキストの改行
-
C言語のコマンドの"flag"って何...
-
VBで定期的にタイムサーバに時...
-
gmailでのimap設定
おすすめ情報