SPIでmicroSDカードを初期化するための正しいコマンドシーケンスは何ですか?


18

microSDカード(2 GB、Kingston、Sandisk)とSilicon Labs C8051F931コントローラーを接続しようとしています。

初期化のために従わなければならないシーケンスについて非常に混乱しています。PIC Microcontrollerを使用した書籍SD Card Projectsでは、135ページに言及されています。

したがって、SDカードをSPIモードに切り替える手順は次のとおりです。
電源投入。
•CSおよびデータアウトラインを論理「1」に設定して、少なくとも74クロックパルスをカードに送信します。
•CDラインをローに設定します。
•6バイトのCMD0コマンド「40 00 00 00 00 95」を送信して、カードをSPIモードにします。
•R1応答をチェックして、エラービットが設定されていないことを確認します。
•R1応答の「アイドル状態」ビットが「0」に設定され
、エラービットが設定されなくなるまで、コマンドCMD1を繰り返し送信します。これで、カードは読み取り/書き込み操作の準備ができました。

これを試してみましたが、CDM1でも01を取得しています。00が期待されます。

また、ここでは、CMD0の後にCMD8を送信する別のコマンドシーケンスがあります。しかし、本は私がCMD1を送信する必要があると述べています。

正しいシーケンスは何ですか?

回答:


34

実際、SDの初期化で見つかる情報/コードのほとんどは、SDHCとSDXCよりも前に作成されるため、日付が付けられているか、純粋ではありません。この手順は、後方互換性のある方法で古いハードウェアに対処せざるを得ないため、最近ではより複雑になっています。

まず、他の人が述べたように、低い初期クロックレートを選択します(通常は100 kHz〜400 kHzの範囲。可能な場合は400 kHzを使用します)。デバイスで許可されている場合は、後でより高いクロックに切り替えることができます。新しいカードはMHzに近いクロッキングに安全に耐えることができますが、古いカードは文句を言います(つまり、通信したりゴミを返したりしません)。

次にCMD1、カードがCMD55/を認識しない限り、SD / SDHC / SDXCカードの初期化に使用しないでくださいACMD41。SDカードの仕様で述べられているように:

いずれの場合も、ホストがMultiMediaCardとSDメモリーカードを区別するのが難しい場合があるため、CMD1は推奨されません。

一部のコントローラー(大部分の新しい容量のカード)は、発行CMD1しても単にIDLEのままになります。CMD8 0x1AAリセット(CMD0)後に最初に発行してから、を使用してみてくださいCMD55 + ACMD41。それが失敗した場合にのみ、を使用しますCMD1

tl; dr SPIモードでカードを初期化するには、次を行う必要があります。

  1. CMD0arg:0x0、CRC:(0x95応答:0x01)- 0xFF応答が文字化けした場合、または応答が文字化けした場合は、この手順を繰り返してください。詳細については、以下を参照してください。

  2. CMD8arg:0x000001AA、CRC:0x87(response 0x01:、続いてargのエコー、この場合0x000001AA)-このコマンドはオプションのように思えるかもしれませんが、新しいカードには完全に必須です。一方で0x1AA、ここで共通argの値である、あなたは、実際に、他の値を渡すこと。「表7-5:SPIモードでのCMD8のカード操作」、p。詳細については仕様の108。

    3a。CMD55arg:0x0、CRC:any、0x65実際に(応答:0x01; すべてCMD55のプレフィックスである場合;応答がある場合、古いカードがあります- /の代わりにarg [CRC ]で繰り返します) ACMD0x05CMD10x00xF9CMD55ACMD41

    3b。ACMD41、arg:0x40000000、CRC:any、0x77実際(この引数は、カードがHCSのものであると想定していることに注意してください。通常はそうです。古いカードには0x0arg [CRC 0xE5]を使用してください)。応答がの場合0x0、問題ありません。の場合0x01、3aに移動します。の場合0x05、上記のメモを参照してください(3a)。どちらでもない場合は、何か問題があります(以下も参照)。

CMD1CMD0CMD8CMD55ACMD41CMD55ACMD41CMD0CMD8CMD1CMD1CMD55ACMD41CMD10x05nn00xFFCMD0nCMD00xFF0x01CMD8

MSBが設定されているが、0xFF通常はSPIがクロッキングのシフトを得たことを示唆しないことに注意してください(たとえば、SDホットプラグを行っているときに定期的に発生するVccドロップの結果として)。修正するには、デバイスを完全にリセットしてください(電源のオン/オフ、デアサート/アサートS̲S̲など)。それは通常動作します。

また、仕様には

最後のSDメモリカードバストランザクションの後、ホストは、クロックをシャットダウンする前に操作を完了するためにカードに8(8)クロックサイクルを提供する必要があります。

それがなくても動作しますが、8サイクル= 1 SPI出力バイトなので、それほど害はなく、持っているだけで良いです。

少なくともそれぞれの前後にS̲S̲(別名CS)をLowにアサートする必要があることに注意してくださいCMD- CMD0(デバイスはそれなしではオンになりません)、実際にCMDは標準がある場合は他のすべてに必要な場合は完全に必須です準拠のSDカード。カードのS̲S̲を常にGNDに接続すると思われる場合がありますカードがホストが接続する唯一のSPIクライアントである場合は、uC出力ピンとコードで管理する必要性の両方を節約し、カードはすべて選択されていると仮定する必要があるため、良いアイデアです当時の。実際には、一部のカード(ほとんどではない場合)は、単に低を検出するのではなく、高から低の傾斜がオンになることを期待しているため、S̲S̲ビットをまったく切り替えずに遅れると、怒ります時計または唾を吐くゴミ; 一部の(通常はより新しい)カードは動作するはずですが、一部の(より古い)カードは動作しない可能性があり、YMMV(まだ)です。それでも、より堅牢なSPI構成(> 1スレーブデバイス)の場合、特定のSDカードとの実際のトランザクションの前にピンをLowにアサートすることを忘れないでください。

また、仕様ではSPIモードでのみCRCを使用する必要があるCMD0と記載さCMD8れていますが、一部のSDカード(トランセンドなど)ではCMD55/に適切なCRCが必要なようですACMD41-安全のために、事前に計算された値を使用してください。

また、SPIはそれ自体でプルアップ/ダウンを必要としませんが、MISOに47kのプルアップをスローすることをお勧めします。一部のデバイスは、特定の状況(初期化されていないなど)でDOピンを高インピーダンスのままにしており、フローティングピンは常に奇妙な問題の原因になります。場合は、あなたのUCは3.3 Vccのを持って、あなたは内部プルアップを使用することができます。5Vの場合、MISOラインに適切な5-> 3.3Vロジック変換が既にない限り、それを行わないでください。

参考文献:

MMC / SDCの使用方法

SD仕様パート1簡体物理レイヤ簡体仕様 -最も重要なセクション6.4.1パワーアップして7.2.1モードの選択と初期化して図7-1:SDメモリーカードの状態図(SPIモード)


4

SDカードの仕様は、sdcard.orgで入手できます。簡略版では詳細が省​​略されていますが、SDHCおよびSDカードの初期化シーケンスが説明されているパート1の図7-2を参照してください。

2 GB以下のMicroSDカードは古いカードと同じように機能する0x00ため、CMD1 最終的には結果が得られます。カードはSPIバスからの外部クロックを使用して内部処理を駆動できるため、これには数回以上の再試行が必要になる場合があります。


2

@vaxquisの優れた回答に加えて、「Physical Layer Simplified Specification Version 4.10、©Copyright 2001-2013 SD Group(Panasonic、SanDisk、Toshiba)およびSD Card Association」の対応するチャートを引用したいと思います(図7-2 :SPIモードの初期化フロー):

SDカードSPI初期化シーケンス

ここで、どのコマンドをどの順序で送信するか、および応答がカードのタイプについて何を伝えるかを確認できます。デバイスができるだけ多くのカードをサポートすることが望ましいと思います。また、512バイトのブロックの読み取りと書き込みの基本操作に関しては、少なくともすべてのV1.xおよびV2.0 SDおよびHCカードで実行可能である必要があります。


2

これを別の可能性として提供します。SPIモードでは、Samsung MicroSD EVO 32GBですべてのコマンドコードに有効なCRCコードが必要です。私は彼らだけではないに違いない。私は、32GBを超えるすべてのカードがそうであると考えている人のコメントを読みました。私は1週間以上バグをデバッグしています。カードに送信されたすべてのコードに有効なcrcコードが含まれるまで、私のコードは機能しません。これを使用してすべてのCRCコードを計算しました https://github.com/hazelnusse/crc7/blob/master/crc7.cc コマンド59を使用してCRCコードをオフにしようとしました。これにより、他の人の時間と労力が大幅に節約されることを願っています。

CRC値を使用した初期化コード..

Power On..
Clock card at least 74 (I use 80) cycles with cs high
CMD0 0, crc=0x95
CMD8 0x01aa, crc=0x87
CMD58 0, crc=0xfd
CMD55 0, crc=0x65
CMD41 0x40000000, crc=0x77
CMD9 0, crc=0xaf
CMD16, 512, crc=0x81 (If you want block length of 512)

Some random other commands..
CMD17 0, crc=0x3b (Read one block)
CMD18 0, crc=0x57 (Read multiple blocks)
CMD24 0, crc=0x6f (set write address for single block)
CMD25 0, crc=0x03 (set write address for first block)

-2

SPIバスは400 kHzになっていますか?初期化は、SDカードがアイドル状態であると報告するまで400 kHzで実行されるSPIバスで発生する必要があります。アイドル状態では、SPIバスのクロックレートを上げることができます(正確な最大値はメーカーによって異なりますが、ほとんどのカードでは12 MHzが安全です。

また、これによると:http: //elm-chan.org/docs/mmc/mmc_e.html CMD1は適切な初期化です。CMD8は、電圧範囲を照会するためにのみ必要です。これは、非SDHC(<= 2GB)カードでは問題になりません。


実際、多くのSDカード(ほとんどが新しいもので、私のSony SR-32C4 32GBは1つです)は、CMD8事前に発行されていなければまったく起動しません。また、実用的な範囲内であれば、通常、クロックは問題になりません。
vaxquis

-3

多分これは手遅れですが、カードからの応答は問題ありません!CMD0の後、応答は0x01でなければなりません-これは、カードがIDLE状態にあり、作業の準備ができていることを意味します。0b00000101のようなものがある場合、2桁目の1はこれが不正なコマンドであると表示され、0桁の1はsardがまだIDLE状態であり、作業の準備ができていると表示します。応答が0x00の場合、カードがアイドル状態ではないことを意味し、別のRESETコマンドを送信する必要があります。


質問を読んだことがありますか?OPははっきり言ったI tried this, but I am getting 01 even for CDM1CMD1-NOT OK に応じてIDLEを取得する。あなたはあなたの「答え」で彼の本当の問題に取り組んでいない。
vaxquis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.