組み込みデザインで microSD カードを使用しています。カードはSPIインターフェースを使用してマイクロコントローラーに接続されています。以前使用したすべてのカードで正常に機能しましたが、新しいカードは初期化されません。カードはトランセンド2 GBmicroSDです。カード(TS2GUSD)。
SPIモードに切り替えるために最初のクロックトレインを送信した後、次の手順を実行します。
CMD0(引数0、CRC 0x95)->応答0x01-> OK
CMD8(引数0x000001AA、CRC 0x87)->応答0x01 0x000001AA-> SDC V2 +カードであることを意味し、電圧範囲2.7 V-3.6Vがサポートされています-> OK
次に、ACMD41コマンドを送信する必要がありますが、CMD41の前にある必要があるCMD55(引数0、CRC 0)を送信すると、応答0x05-> IllegalCommandが返されます。 CMD1(MMCカードの場合))も送信しようとしましたが、同様の不正なコマンド応答が返されます。このコードは、Sandisk 2 GBmicroSDカードで正常に機能します。
この問題を解決するにはどうすればよいですか?
問題を見つけたようです。 CMD55の正しいCRCを計算し、ダミーCRCの代わりにそれを送信すると、コマンドが受け入れられます(結果0x01)。セクション7.2.2の 物理層の仕様 を見ると、次のように明示的に示されています。
SPIインターフェイスは、デフォルトでCRC OFFモードで初期化されます(コマンドCMD0およびCMD8を除く)。
これは、この一連のトランセンドカードには当てはまらないようであり、仕様に違反しています。また、CRCエラーの場合、応答は0x05ではなく0x09である必要があります。 CMD59でCRCチェックを明示的にオフにしようとしましたが、それは役に立たないようです。
=>(すべて?)コマンドの正しいCRCを計算すると、カードが機能します。
これについてトランセンドのサポートに連絡しています。私が何か役に立つことを学んだら、ここであなたは知っているでしょう。
以前は他の2GBトランセンドカードを使用していましたが、台湾製で、新しいカードは韓国製です(Samsungカード(MMAGR02GUDCA)のようです)。
私はほとんど同じ問題を抱えていました。 ACMD41を送信するときは、CMD55を送信してからCMD41を送信しました。 CMD55の応答は0x01で、アイドル状態を示し、初期化プロセスを実行しています(これは正常だと思います)。 CMD41は0x05で応答し、不正なコマンドを示します。私の特定のカードは、SPIモードでもデフォルトでCRCチェックを実行し、CRCエラーを不正なコマンドとして誤って報告していることがわかりました(つまり、SD仕様に準拠していません)。適切なCRCを計算すると、正常に機能します。これが私が使用したCRC7計算コードです。それは私にとってうまく機能しました:
https://github.com/hazelnusse/crc7
CRCチェックを無効にするように注意していない限り、無効になっていないと想定し、コマンドフレームごとに適切なCRCを計算することをお勧めします。私の知る限り、SD仕様では、CMD8を除いて、デフォルトでSPIモードで無効にする必要があると規定されていますが、一部のカードではデフォルトでSPIモードで無効になっています。 。
失敗したコマンドにCRC 0
を使用したとのことです。最後のバイト全体を0x00
として送信したことを意味していると思います。 CRC7は最後のバイトの最初の7ビットのみであることに注意してください。end bit
と呼ばれる最後のビットは常に1
である必要があります。したがって、0x00
を最後のバイトとして送信し、0
を最後のビットとして送信した場合、失敗は理解でき、エラーコードでさえ意味があります。最後のビットとして1
を送信すると、機能するはずです。最後のバイトとして0x01
または0xFF
のようなものを使用します。
これは正常です。消去電圧を作成するために使用される内部チャージポンプは、準備が整うまでに通常よりも時間がかかる可能性があります...初期化が完了するまでCMD55 + ACMD41コンボを要求する必要があります。
CMD58は、正しい電圧レベルを供給しているかどうかを確認するのにも役立ちます(ソケットに接触の問題がある場合があります)。
チップセレクト(0)のみでCMD0を送信しても、カードはSPIモードで初期化されません。これにより、SPIモードが設定されます。ACMD41が受け入れられるまで、カードは初期化されません。 。その後、CRCはデフォルトでオフになっています。