SDカードインターフェースの調査

SDカードをSTM8Sにつないでみたいので、まずは仕様を調査した.

SDカードにはSPIインターフェースと、そうでないSD独自のインターフェースがある.
以下ではSPIインターフェースだけについて解説する.

SD cardのピンアサイン
下図はBOTTOM VIEWです.当サイトではSPIモードでSDカードを駆動しますので、1〜7ピンだけしか使いません.



microSD cardのピンアサイン

下図はBOTTOM VIEWです.当サイトではSPIモードでSDカードを駆動しますので、2〜7ピンだけしか使いません.


SD-->microSDの変換アダプタの結線
BOTTOM VIEWにて、下図の置き方で見て、

SD         →               microSD       SPIで使うピン
 8         DAT1                8
 7         DAT0/MISO       7               MISO
 6         VSS                 6                GND
 5         SCLK               5                SCLK
 4         VDD                 4                3.3V
 3         VSS                行き先なし
 2         CMD/MOSI       3                MOSI
 1         DAT3/CS          2                CS
 9         DAT2               1

SD cardの回路例   (MSP430はTIのマイコン)


SD commandは必ず下記の6BYTEsで送信される.MOSIピンからMSB firstで送信される.
ただしCRCは無くてもOK.SPIモードではデフォルトoffである.


代表的なSD commandは下記である.
SD command formatの6bitのcommand番号には、下記左列の数字が入る.


上表のTypeがなにかを説明する.これはcommandに対するSD cardの返答である.
3種類あるが、まずR1

つぎにR2

最後にR3



話題は変わって、
バルクデータ転送は任意のバイト数を転送できる.
ブロック転送は固定バイト数を転送できる.(たいていは512バイト)
どちらも16bit-CRCが最後につく.(無くても可)
----どのように無くするのかは不明----

ブロック転送に失敗すると、SD cardは次のread error tokenを返す.



SD cardのCSは、command転送期間はLOWになるべきである.

ソフトウエア実装では、このような動作をする.
   CS=0 → command送信 → command argument送信 → CRC 0x95 → 返値を読む → CS=1
0x95はCMD0をargument=0で送信しようとしたときのおきまりのCRC値である.
CMD0はSD cardをresetしidleに入れるcommandである.


SD cardの初期化手順

SPIモードで使えるようにするための初期化手順です.

@SPIを設定する.これは各hardwareに依存するのでよしなにやってください.
SPI設定の要点は、MSB first、マスターモード、全2重.
clock周波数は、サンプルプログラムでは4MHzにしました.
ACS=0にする
B80発のダミーclockをSD cardに与える
CCMD0を送信するとSD cardはresetされる.このCMD0でSPIモードに入る.すなわちこのCMD0は非SPIモードなのでCRCはオンなのでCRC0x95を送信しなければならないことに注意のこと.
DコマンドレスポンスがIDLEモードに入ったことを意味する01になるまで受信し続ける.
E
CS=1
Fダミーclockを8発与える
GCS=0
HCMD1を送信する
Iコマンドレスポンス00が返ってくるまで受信し続ける.ただしあまりにも00が返ってこない場合は、再度CMD1を送信する.これを繰り返す.
JCS=1
Kダミーclockを8発与える

ダミーclockというのはSD cardが必要とするものです.


SD cardからの1ブロックリード手順

@CS=0
ACMD17を送信
Bコマンドレスポンスが00になるまでwaitする
Cデータトークンの先頭を意味するFEを受信するまでwaitする
D512BYTEを一気に受信する
ECRCを2BYTE受信する
FCS=1
Gダミーclockを8発与える



SD cardへの1ブロックライト手順

@CS=0
ACMD24を送信
Bコマンドレスポンスが00になるまでwaitする
Cデータトークンの先頭を意味するFEを送信する
D512BYTEを一気に送信する
ECRCを2BYTE送信する
Fデータレスポンスが05になるまで受信する
GCS=1
Hダミーclockを8発与える


調査はこんなところでおしまい.

STM8Sには、SPIインターフェースが搭載されているので、STM8SでSD cardをinterfaceできるはずです.

inserted by FC2 system