実際、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モードでカードを初期化するには、次を行う必要があります。
CMD0
arg:0x0
、CRC:(0x95
応答:0x01
)- 0xFF
応答が文字化けした場合、または応答が文字化けした場合は、この手順を繰り返してください。詳細については、以下を参照してください。
CMD8
arg:0x000001AA
、CRC:0x87
(response 0x01
:、続いてargのエコー、この場合0x000001AA
)-このコマンドはオプションのように思えるかもしれませんが、新しいカードには完全に必須です。一方で0x1AA
、ここで共通argの値である、あなたは、実際に、他の値を渡すこと。「表7-5:SPIモードでのCMD8のカード操作」、p。詳細については仕様の108。
3a。CMD55
arg:0x0
、CRC:any、0x65
実際に(応答:0x01
; すべてCMD55
のプレフィックスである場合;応答がある場合、古いカードがあります- /の代わりにarg [CRC ]で繰り返します) ACMD
0x05
CMD1
0x0
0xF9
CMD55
ACMD41
3b。ACMD41
、arg:0x40000000
、CRC:any、0x77
実際(この引数は、カードがHCSのものであると想定していることに注意してください。通常はそうです。古いカードには0x0
arg [CRC 0xE5
]を使用してください)。応答がの場合0x0
、問題ありません。の場合0x01
、3aに移動します。の場合0x05
、上記のメモを参照してください(3a)。どちらでもない場合は、何か問題があります(以下も参照)。
CMD1
CMD0
CMD8
CMD55
ACMD41
CMD55
ACMD41
CMD0
CMD8
CMD1
CMD1
CMD55
ACMD41
CMD1
0x05
nn0
0xFF
CMD0
nCMD0
0xFF
0x01
CMD8
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モード)
CMD8
事前に発行されていなければまったく起動しません。また、実用的な範囲内であれば、通常、クロックは問題になりません。