SanDisk Secure Digital Card Product Manual: SPI Protocol Definition
出典: Wikimura
SDカードの使い方について書かれたSanDisk Secure Digital Card Product Manual(Rev. 1.9)の5章「SPI Protocol Definition」の適当な訳です。
コマンド、レスポンス、データという言葉は、カードとやり取りするトークンのことです。データブロックはデータトークンと同義だと思います。
SPI Bus Protocol
SDカードチャネルは、コマンドとデータのビットストリームに基づいている。 これはスタートビットから始まりストップビットで終端する。 また、SPIチャネルはバイト単位である。 そのため、全てのコマンドおよびデータブロックは、8ビットバイトで構成されている。CS(chip select)信号からのクロックが8の倍数クロックになるよう、バイト単位でアラインメント(中途半端な区切りがないよう整えられている)。
SDバスプロトコルと同様に、SPIメッセージもコマンド・レスポンス・データブロックというトークンから構成される。
ホスト-カード間の通信は全てホスト(マスタ)によって制御される。ホストはバストランザクションをCSシグナルをLowにすることで開始する(Chip selectは負論理)。
レスポンスの振る舞いは、以下の3点でSPIモードとSDモードで異なる。
- 選択されたカードは常にコマンドに対して応答する
- 8または16ビットのレスポンス構造が使われる
- カードがデータ取得で問題に遭遇した時、SDカードではタイムアウトが使用されていたが、SPIではエラーレスポンスを返す。データブロックの代わりに送られる。
コマンドに対するレスポンスに加え、カードへ書き込まれるデータブロックに対しても「special data response」トークンが返される。データブロックのサイズは、1バイトからカードの書き込みブロック(WRITE_BL_LEN)までなら良い。
Mode Selection
SDカードはSDバスモードで起動する。 SPIモードへは、CS信号をアサート(負論理なのでLow)されているときにリセットコマンド(CMD0)を受け取ることで切り替わる。 ただし、SDバスモードである必要があると認識された場合は、コマンドに対して応答せず、SDバスモードのままとなる。 SPIモードが要求されると、SPIモードへ切り替わり、「SPIモードR1レスポンス」を返す。
SDバスモードに戻る唯一の方法は、"power cycling"(電源を切って入れ直す?)である。SPIモードでは、SDカードプロトコルステートマシンは(not observed: 信号を監視していない?)動作していない。SPIモードでサポートされている全てのSDカードコマンドは常に利用可能である。(SPIモードのステートマシンは動いているということ?)
SPIモードにおけるデフォルトのコマンド構造/プロトコルでは、CRCチェックが無効化されている。
しかし、カードはSDバスモードで起動するため、CMD0は必ず有効なCRCが付加されなくてはならない(SPIモードのコマンド構造であっても)。一旦SPIモードに入ると、CRCはデフォルトで無効化される。
CMD0は静的(というより固定)コマンドで、常に同じ7ビットCRC値「0x4A」を生成する。終了ビットに'1'をセットするので、CRCバイト(CRCと終了ビットを合わせたもの)の値は「0x95」となる。
CMD0のシーケンスは、0x40 00 00 00 95となる。このシーケンスはSPIモードでもいつでも送ることができる。
Bus Transfer Protection
バス上を転送される全てのSDカードトークンは、CRCビットによって保護されている。 SPIモードでは、SDカードは非保護モードを提供する。 これにより、CRC生成とチェックのための関数やハードウェアを実装することなく、信頼性のあるデータリンクを構築することを可能にする。
非保護モードであっても、コマンド・レスポンス・データトークン内のCRCビットは必要である。
しかし、それらは送信側で"don't care"として定義されているため、受信側は無視する。
SPIモードは非保護モードで初期化される。
このオプションは、ホスト側でCRC_ON_OFFコマンド(CMD59)を使用することで有効化・無効化を切り替えることができる。
CRC7および16の生成多項式は、SDバスモードと同一である。これについてはSD Bus mode章を参照されたい。
Data Read
SPIモードはシングルブロックおよびマルチプルブロックのリード動作(read operation)をサポートしている(CMD17およびCMD18)。 有効なリードコマンドを受け取ると、カードはレスポンスに続き、定義したデータ長のデータトークンを返します。データ長はSET_BLOCK_LENGT(CMD16)コマンドによって設定します。
(図5-1)
有効なデータブロックには、CRC-16-CCITTで定められる多項式で生成されたCRC-16が後続する。
- x16 + x12 + x5 + 1
最大ブロック長はREAD_BL_LEN(CSDパラメータ)で512と定められている。
ブロック長(CMD16で定める値)は1からREAD_BL_LENまでの値をとり得る。
開始アドレスはカードの有効なアドレス範囲内であればどこでも良い。しかし、ブロックは単一の物理カードセクタ(physical card sector)内に収まっていなくてはならない。(セクタをまたがらない範囲ならOKということ)
データ取得エラー(data retrieval error)の場合は、カードは一切のデータを転送しない。代わりに、special data errorトークンがホストへ送られる。図5-2はデータではなくエラートークンで終了するデータリード動作を示している。
(図5-2が欠けている)
マルチプルブロックリード動作では、各ブロックが16ビットCRCを持っている。
SDバスモードと同様、転送停止コマンド(CMD12: Stop Transmission command)でデータ転送を止めることができる。
Data Write
SPIモードではシングルブロックおよびマルチプルブロックのライト動作をサポートしている。 有効なライトコマンド(CMD24およびCMD25)を受け取ると、カードはレスポンストークンを返し、ホストから送られるデータを待つ。 CRCとスタートアドレスに関する制限はリード動作と同一である(図5-4)。有効なブロック長は512バイトのみである。 これより小さなブロックは、次の書き込み命令の際にエラーを起こす。
全てのデータブロックは1バイトのスタートブロックトークン(start block token)を先頭に持つ。
ブロックがカードに受け取られると、データレスポンストークン(data response token)が返される。エラーが起きなければ、これらのデータは書き込まれる(programmed)。
カードが書き込みでビジー状態である間は、ビジートークンの連続的なストリーム(DataOut信号がLowで保持されるだけ)ホストに送られる。
書き込みが終了すると、SEND_STATUSコマンド(CMD13)により書き込み結果を確かめなくてはならない。
いくつかのエラー(addresss out of range:アドレス範囲外、write protect violation: 書込み保護違反など)は、
書き込み時にしか検出されない。
データブロックとデータレスポンスを介した有効性チェックには、CRCとgeneral Write Error indicationが使われる。
(ちょっと意味不明)
マルチプルブロックライト動作では、転送停止は"Stop Tran"トークンを「次のブロックのスタートブロックトークン」を受信する代わりに送る。
データレスポンスで書き込みエラーが示されていた場合、ホストはSEND_NUM_WR_BLOCKS(ACMD22)により正しく書きこめたブロック数を取得できる。
(ブロック単位でやり直しできる?)
データトークンについては5.2.4で記述する。
(図5.5)
CS信号をリセット(High)しても、書き込み作業は終了しない。カードはdataOut信号を解放(Tristate)しつつ書き込みは継続する。
書き込み完了前に再度選択(CS信号がアサートされる)されると、dataOut信号はLowに固定され(通常のビジーと同じ)、コマンドは拒否される。
CMD0を使ってリセットすると、あらゆる保留中またはアクティブな書き込み作業は終了する。
これはカードのフォーマットを破壊する可能性がある。これを避けるのはホスト側の責任である。
Erase and Write Protect Management
SPIモードにおけるイレースおよびライトプロテクト管理機能は、SDバスモードと同一である。 カードが削除中または書込み保護ビットを変更中は、ビジー状態となり、dataOut信号はLowで保持される。 図5-6は、ビジー信号あり・なしの場合のデータがないバストランザクションを示している。
Read CID/CSD Register
SDバスプロトコルと異なり、CSDおよびCIDレジスタの読み込みは、ただのリードブロックトランザクションである。 (SDバスモードでは専用のトークン形式だった)
カードは標準のレスポンストークンに続き、16ビットCRCが後ろについたのデータブロックを返す。
CSDコマンドに対するタイムアウトは設定することができない。というのも、タイムアウトはCSDのTAACに書き込まれているためである。
従って、CSDレジスタのリードレイテンシには、標準応答タイムアウト値(standard response time-out value)
が使われる。
補足
- CSD(Card Specific Data)
- カードの特性が記録されている。当然書き込めない。
- TAAC(Data read access time)
- CSDのフィールドの1つ。このアクセスタイム以上応答がなければタイムアウトにするという判定基準になる?
Reset Sequence
SDカードは定められたリセットシーケンスが必要である。パワーオンリセットまたはCMD0(ソフトウェアリセット)後、 カードはアイドル状態(idle state)に入る。この状態で有効なコマンドは下記のとおりである。
- CMD1: SEND_OP_COND
- ACMD41: SD_SEND_OP_COND
- CMD59: CRC_ON_OFF
- CMD58: READ_OCR
ホストはCMD1を繰り返し送ることで、レスポンスに含まれる"in-idle-state"ビットが0にセットされ、「カードが初期化を完了し次のコマンドへ進む用意ができたこと」を示すまで問い合わせ続けなくてはならない。
SPIモードでは、CMD1はオペランドを取らず、OCRレジスタの値も返さない。
代わりに、ホストはCMD58(SPIモード限定)を使用することで、OCRレジスタを読み込むことができる。カードに対し、サポート範囲外の電圧でのアクセスを避けるのはホスト側の責任である。
CMD58の使用は初期化段階だけに限定されておらず、いつでも利用できる。
Clock Control
SPIバスクロック信号はSPIホストがカードを省電力モードにしたり、データフローをコントロールするために使われる。 ホストはクロック周波数を変更することも、停止することも可能である。
ホストが従わなくてはならない制限は以下の通り。
- バス周波数はいつでも変更できる(最大データ転送周波数はSDカードで定められる)
- SDカードがレスポンスやデータを出力するために、クロックの供給が必要である。最後に行ったSPIトランザクションの後、ホストはSDカードが動作を完了できるよう8 (eight) clock cycle(←原文: 8クロックを1単位にしてる?)を送る必要がある。この8-clock periodの間はCS信号は無関係であり、アサート/デアサート(ネゲート?)どちらでも良い。以下はSPIバストランザクションのリストである。
- コマンド/レスポンスシーケンス: レスポンスのエンドビットから8クロック(原文: Eight clocks)。この間CS信号はアサート/ネゲートしてもよい。
- リードデータトランザクション: 最後のデータブロックのエンドビットからEight clocks。
- ライトデータトランザクション: CRCステータストークンからEight clocks。
- ビジー状態のカードのクロックは停止して良い。SDカードはホストのクロックとは関係なしに書き込みを行う。ただし、ビジー信号が停止するためにはクロックが必要である。クロックが来ないと、CSでdataOutから切断していない限り、SDカードはdataOut信号をLowに保持し続けてしまう。
Error Conditions
Memory Array Partitioning
SDと同じ
Card Lock/Unlock
SDと同じ
Application Specific Commands
SDと同じ(一部SPIにはない)
Copyright Protection Commands
SDと同じ
SPI Command Set
コメント
- CRCが必要かと思ったら、SPIモードではデフォルトでは無効化されているそうです。せっかくCRCの関数を作ったのに...
- SDバスモードで起動するため、最初のコマンドだけはCRCが必要だそうです。

