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になるまで受信し続ける.
ECS=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できるはずです.