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 bit | Transmitter bit | Content | CRC | End bit |
|---|---|---|---|---|
| 0(always) | 1(host command) | command, parameter, address | CRC-7 | 1(always) |
responseトークンは、持っている内容ごとに4種類の構造をとる。トークン長は48ビットか136ビットである。block dataに対するCRCは、16bit-CCITT多項式である。使われているCRCについては4.6節に記述する。
| 種類 | Start bit | Transmitter bit | Content | End bit | length |
|---|---|---|---|---|---|
| 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-7 | 1 (always) | 48 bit |
| 種類 | Start bit | Transmitter bit | Content | CRC | End bit | length |
|---|---|---|---|---|---|---|
| R2 | 0 (always) | 0 (card response) | CIR or CSD | 1 (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信号線だけを使用して行われる。
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カードは、動作電圧がVDD − min˜VDD − maxであるホストとの間で、通信を確立できなくてはならないと定められている。データ転送における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モードでは引数が付けられません。 これらの動作については別途調べます。


