SanDisk Secure Digital Card Product Manual: SD Protocol Description

出典: Wikimura

SanDisk Secure Digital Card Product Manualの4章「SD Card Protocol Description」の適当な訳です。

目次

SD Bus protocol

SDバス上でのやり取りは、コマンドとデータのビットストリームからなる。これはスタートビットから始まり、ストップビットで終了する。


カード指定には、初期化段階で割り当てたsession addressが使われる。 SDバスにおける基本的なトランザクションは、command/responseトランザクションである。 この種のトランザクションは、commandまたはresponseで直接情報を転送する。 いくつかのoperationは、データトークンも持つ。


SDカードとのデータ転送は、blockで行われる。data blockには、常にCRCビットが後続する。 single blockおよびmultiple block operationが存在する。なお、multiple block operationの方が高速書き込みに適している。 multiple block operationはCMD線でstop commandが送られると停止する。データ転送はホスト側から、単線(single line)か複線(multiple line)のどちらを使用するかを設定できる(カードが対応していれば)。これはSDバスの話。

Command
operationを開始するトークン。commandにはホストから単一のカードへ送られる"addressed command"と、接続されたすべてのカードへ送られる"broadcast command"がある。commandはCMD線からシリアルで転送される(SDバスの話)。
Response
指定された(addressed)カードまたは、接続された全てのカードから(同期的に)ホストへ送られるトークン。responseはCMD線からシリアルで転送される。
Data
カードからホスト、ホストからカードへ転送されることができる。Data線で転送される。

(中略:いくつか図が示されている) (中略:block write operationのビジー信号について書かれている。SDバスの話なので略)


commandトークンは以下の構造をとっている。各コマンドトークンはスタートビット'0'から始まり、エンドビット'1'で終わる。全長は48ビットである。各トークンはCRCにより保護されており、誤りを検出し、operationをやり直すことができるようになっている。

Start bitTransmitter bitContentCRCEnd bit
0(always)1(host command)command, parameter, addressCRC-71(always)


responseトークンは、持っている内容ごとに4種類の構造をとる。トークン長は48ビットか136ビットである。block dataに対するCRCは、16bit-CCITT多項式である。使われているCRCについては4.6節に記述する。

種類Start bitTransmitter bitContentEnd bitlength
R1 0 (always)0 (card response)送られたcommandとステータス1 (always)48 bit
R3 0 (always)0 (card response)OCRレジスタ1 (always)48 bit
R6 0 (always)0 (card response)RCA, CRC-71 (always)48 bit
種類Start bitTransmitter bitContentCRCEnd bitlength
R2 0 (always)0 (card response)CIR or CSD1 (always)1 (stop)136 bit

CMD線では、MSBが最初に転送され、LSBが最後に転送される。

(中略:Wide bus optionが使用されると...これもSDバスの話)

Protocol’s Functional Description

SPIモードとは関係ないようなので飛ばす SPIモードではコマンドを送ると、選択したSDカード全てが応答するらしいので、Point to pointにはならない。

Card Identification Mode[4.3]

Card Identificationモードでは、ホストはCard Identificationモードにある全てのカードをリセットする。 そして動作電圧範囲(validates operation voltage range)の有効化と、カードの識別を行い、カードに対しRCA(Relative CCard Address)の発行をさせる。この操作はそれぞれのカードに対して別々に、それぞれのCMD信号線から行う。Card Identificationモードにおけるすべての通信は、CMD信号線だけを使用して行われる。

Image:Morita-090726-Fig4-7.png


Reset[4.3.1]

GO_IDLE_STATE(CMD0)はソフトウェアリセットコマンドであり、どのような状態のSDカードであってもアイドル状態に移行させる。 アクティブでないSDカードは、このコマンドの影響を受けない。


電源投入後、すべてのSDカード(その時点でアクティブでないカードも)はホストによりアイドル状態に移行される。 なお、バス通信を始める前に、少なくとも74回のクロックが必要である


電源投入後またはCMD0後、すべてのSDカードのCMD信号は入力モードとなり、コマンドのスタートビットを待つ。 カードはデフォルトRCA(=0x0000)で初期化され、driver stage registerは[lowest speed, highest driving current capability]に設定される。


Operationg Voltage Range Validation[4.3.2]

SD Physical Specification standardでは、すべてのSDカードは、動作電圧がVDDmin˜VDDmaxであるホストとの間で、通信を確立できなくてはならないと定められている。データ転送におけるVDDの最大値と最小値は、OCR(Operation Condition Register)で定義されているものの、すべてのレンジをカバーできるわけではない。 SDカードホストは、カードのOCRを読むことで、適当なVDDを選択するか、カードを拒否することが望まれる。


CIDとCSDをpayload memoryに格納しているSDカードは、データ転送VDD条件(電気的特性で定められている値)でしか通信することができない。このことは、VDDに互換性のないホストの場合、カードはIdentification cycleを完了することができず、CSDデータの送信も行えない事を意味している。


SD_SEND_OP_COND(ACMD41)はホストに対し、カードの識別と、ホストの動作電圧に適合しないカードを拒否するためのメカニズムを提供する。この操作はホストが要求するVDD範囲をコマンドのオペランドとして送ることで行われる。これにより、指定された電圧範囲でデータ転送を行えないSDカードは、自身で以降のバス動作から切り離し、非アクティブ状態に入る。なお、ACMD41はApplication specificコマンドである。従って、ACMD41の前には必ずAPP_CMD(CMD55)が先行しなくてはならない。RCAは、アイドル状態におけるCMD55で使われる。


MultiMediaCardはACMD41に対して応答しない(実際にはこれに先行するCMD55、つまりAPP_CMDに対して応答しない)。 MultiMediaCardは、その仕様にあるように、SEND_OP_CONDコマンド(MultiMediaCardにおけるCMD1)により初期化される。 ホストはMultiMediaCardがCMD3に対して返すILLEGAL_COMMANDステータスを無視すべきである(CMD0,1,2はステータスレジスタをクリアしない)。実は、ACMD41とCMD1は、ホストがMultiMediaCardとSDカードを区別するために使われている。


コマンド内で電圧範囲を省略した場合、それぞれのカードに対し問い合わせることが可能である。 これにより、範囲外のカードを非アクティブにする前に、互換性のないものが無いかどうかを確認することができる。 この問い合わせは、ホストが共通の電圧を選択することができる場合か、アプリケーションに使用できないカードがあることを通知したい場合に使用すべきである。


ACMD41に対するレスポンスのビジービットは、カードがホストに対し、自身がまだ起動またはリセット処理中であり、まだ通信できる状態にないことを伝えるために使われる。この場合、ホストはビジービットがクリアされるまでACMD41を繰り返さなくてはならない。


初期化処理中、ホストはOCR(operating condition register)値を変更してはならない。 OCRへの変更はSDカードに無視される。もしoperating conditionで変更があった場合(?)、ホストはカードをCMD0によりリセットし、初期化処理をもう一度させなくてはならない。しかし、すでに非アクティブとなっているカードに対しては、電源を一度遮断してから入れ直すことでハードリセットをかけなくてはならない。


GO_INACTIVE_STATE(CMD15)は指定したSDカードを非アクティブ状態にする。 このコマンドは、ホストが明示的にカードを非アクティブにするのに使われる。 これは、ホストがVDDを変更し、そのカードが対応できないことが分かっているときに使える。

まとめ

動作電圧範囲について

SDカードが対応する供給電圧の範囲はデバイスごとに定められていて、OCRというレジスタで定義されている。 ホストの電圧とマッチしない場合動作できないので、通信前にしっかり確認できなくてはならない。 対応していないとSDからの応答は来ない。

ACMD41について

このコマンドは、初期化処理の処理状況を問い合わせるのと、電圧範囲の互換性が確保できないカードの検出と非アクティブ化をするのに使う。 このコマンドの前にはCMD55(APP_CMD)が先行しなくてはならない。MultiMediaCardはCMD55の段階で応答しない。 SPIモードでは引数が無い。

引数に電圧範囲を指定すれば、それを受け取ったカードが互換性を判断し、ダメなら自身で非アクティブ状態になる。 引数になにも入れなければ、それを受け取ったカードに問い合わせることが可能。 ただし、これは応答が返ることを期待しているため、もともと大丈夫なことが分っている場合で使う。 また、ダメだとわかったらCMD15で非アクティブ状態へ移行すること。

初期化処理が終了していなければ、レスポンスのビジーフラグがセットされる。0になるまで繰り返し問い合わせなくてはならない。


MultiMediaCardがあるとき

MultiMediaCardはACMD41に先行するCMD55の段階で応答しない(レスポンスがない?)。 これはカードがSDかMultiMediaCardかを区別するのに使える。

MultiMediaCardがCMD55を受け取ると、レスポンスのILLEGAL_COMMANDフラグがセットされてしまう。 この場合、ホストはこのフラグを無視しないといけないらしい。

SPIモードに関すること

図4-7にあるように、リセットごのアイドル状態において、チップセレクトを0(負論理なので電圧ではHigh)にした状態でCMD0を発行することでSPIモードに移行します。上記の内容の一部はSPIでは対応していなかったりするようです。

特にACMD41は、SDモードでは動作電圧を指定できるようになっていますが、SPIモードでは引数が付けられません。 これらの動作については別途調べます。

参考文献

  1. SanDisk SD Card Product Manual 1.9(オフィシャルでは入手不可 Googleで検索して出た1つ)
個人用ツール