SPIインターフェースを使用したmicroSDカードの初期化
質問
私はを使用しています microSD 埋め込みデザインのカード。カードは、SPI インターフェイスを使用してマイクロコントローラーに接続されます。以前に使用したすべてのカードでは問題なく動作しましたが、新しいカードが初期化されなくなりました。カードは Transcend 2 GB microSD カード (TS2GUSD) です。
SPI モードに切り替えるために最初のクロック トレインを送信した後、次の操作を行います。
CMD0 (引数 0、CRC 0x95) -> 応答 0x01 -> OK
CMD8 (引数 0x000001AA、CRC 0x87) -> 応答 0x01 0x000001AA -> SDC V2+ カードであることを意味し、電圧範囲 2.7 V ~ 3.6 V がサポートされています -> OK
次に、ACMD41 コマンドを送信する必要がありますが、CMD41 の前に必要な CMD55 (引数 0、CRC 0) を送信すると、応答 0x05 -> Illegal Command が返されます。CMD1(MMCカード用)も送信しようとしましたが、同様の結果が得られます 不正なコマンド 応答。このコードは、Sandisk 2 GB microSD カードで正常に動作します。
この問題を解決するにはどうすればよいですか?
解決
私は問題を発見したように見えます。 Iは、CMD55の正しいCRCを計算し、ダミーCRCの代わりにそれを送信すると、コマンドが(結果は0x01)に受け入れられます。あなたは、セクション7.2.2で物理層の仕様を見れば
:、それが明示的に述べていますSPIインタフェースは、デフォルトでCRC OFFモードで初期化されます。 (コマンドCMD0とCMD8を除きます)。
このは、このように仕様に違反し、トランセンドのカードのこのシリーズの場合ではないようです。また、CRCエラーの場合は返信が0x05をするのではなく、0x09のする必要があります。私は明示的にCMD59でCRCチェックをオフにしようとしたが、それは助けていないようです。
=>の正しいCRCを計算する(全て?)コマンドカード作業を行います。
私はこのことについてトランセンドの支持体と接触してよ。私は有益な何かを学ぶなら、私はあなたがここに知っているよ。
私は前に他の2ギガバイトトランセンドのカードを使用していますが、新しいものが韓国製(サムスンカード(MMAGR02GUDCA)のようです)。されている間、彼らは、台湾で行われた
他のヒント
私はほとんど同じ問題がありました。 ACMD41を送るとき、私はCMD55がCMD41が続く送りました。 CMD55に対する応答は、アイドル状態を示す初期化プロセス(これは正常である、と思う)を実行して、0x01でした。 CMD41は、違法なコマンドを示し、0x05ので応答します。それは私の特定のカードもSPIモードでは、デフォルトではCRCチェックを行うことが判明し、違法なコマンド(すなわち、それはSD仕様に従っていません)としてCRCエラーを誤って報告します。私は正しいCRCを計算すると、それが正常に動作します。ここで私が使用CRC7計算コードがある、それは私のためによく働いています:
https://github.com/hazelnusse/crc7する
あなたはCRCチェックを無効にするには、世話をしていない限り、私は、それが無効になっていないと仮定し、各コマンドフレームのための適切なCRCを計算することを確認するためにおそらく最高だと思います。私が言うことができるものから、SD仕様は、それがCMD8以外のSPIモードではデフォルトで無効にされなければならないと述べていても、一部のカードはSPIモードではデフォルトでそれを無効にし、他の人がそれを可能にする。
あなたは、失敗したコマンドのためCRC 0
を使用しました。私はあなたが0x00
として全体の最後のバイトを送ったことを意味していることを前提としています。 end bit
と呼ばれる最後のビットが常に1
しなければならない - CRC7は、最後のバイトの最初の7ビットであることに注意してください。あなたが最後のビットとして0x00
で、最後のバイトとして0
を送ったのであれば、失敗は理解できるだろう、とさえエラーコードが理にかなって。あなたが最後のビットとして1
を送信する場合、それはすなわち、動作するはずです。最後のバイトとして0x01
または0xFF
のようなものを使用します。
これは普通のことだ、それはおそらく準備ができて通常よりも長くかかる消去電圧を作るために使用される内部チャージポンプです...あなたは、初期化が終了するまで、CMD55 + ACMD41コンボを主張する必要があります。
CMD58も(時にはソケットが接触問題を持っている)あなたは正しい電圧レベルを供給しているかどうかをチェックするのに役立つ可能性があります。
チップセレクトしてCMD0を送る(0)単独のSPIモードでカードを初期化しません。これは、SPIモードを設定します。 カードは受け付けACMD41復帰するまで初期化されません。そして、CRCはデフォルトではオフになってます。