SH7144でSDカードコントローラを試作

CQ出版のインターフェイス誌、2006年6月号の付録基板を使って、SPIモードでのSDカード制御の記録です。
ここでは、2GまでのSDカードの標準的なコマンド、CMD0 (res = 01)---> CMD1(res = 01)..... (res = 00 ready) という簡単なイニシャルでは反応しない、4G超のSDHCの制御も可能にします。
 RX62N こちらは随時追加→RX62NのSPIでSDカードを制御
 SH2A(SH7262)こちらは随時追加→SH2AのSPIでSDカードを制御、SH7262でのスピード評価
TECHI シリーズ Vol35を参考に、SPI接続はそのままの回路としますが、若干の回路を追加しています。その理由は、SDカードはコマンドを間違えると、電源を切らないと復帰できない状態になる場合があるので、ソフトウエアでSDカードの電源をON、OFFできるようにするためです。こうすると、SDカードが反応しなくなっても、ソケットから出すことなく、電源ON(ソケットにカードを挿入)からのシーケンスを、ソフトで制御でき、デバッグがしやすくなります。必要な部品は、適当なユニバーサル基板、接続用コネクタ、FET(2SJタイプで500mA流せ、3Vでゲート操作できるもの)と抵抗1本(電源OFFを確実にするための放電抵抗)、タンタルコンデンサ2個(16V10μぐらい)です。その他、2本のプルアップ抵抗(22kΩ)。
SH7144基板には、裏に4MビットのSRAMを実装しています。このメモリ上でプログラムのテストを行います。また、SDカードの制御では、作業メモリを大きくすると、いろいろ便利だからです。
試作回路はこのようになります

表1 接続
SDカードピン意味
SDカードピン番号
CQ基板のJ2コネクタ
SH7144ピン番号
SHのピンの意味
CLK
12
106
PE8(SCK2)
CS
13
107
PE9
DI(CMD)
14
108
PE10(TXD2)
DO(DAT0)
11
105
PE7(RXD2)
GND
3、6
39
2,23・・・
GND
VDD
FET(D)
110
PE11

装置の全体

SH7144基板と、SDカードソケットを接続した状態。電源は、下のユニバーサル基板へ、5Vを供給します。SH7144は、RS232Cでパソコンと接続して、RS232Cターミナルソフトで、SH7144を操作します。ターミナルソフトは、テラタームなどを使います。
SDカードソケットは、CK-29 サンハヤトのSDカード基板を使ってますが、この基板上に、SDカードのVDDとGNDの間に、10μFのタンタルコンデンサを接続しています。電源OFFを確実にするための放電抵抗は、1kΩとしています。10μFと1kΩで、時定数は10msになり、40ms待てば、計算上3.3V/(2.71^4)=0.06Vぐらいになり、DIとDOを、22kΩでプルアップしているので、0.3Vほど高くなりますが、十分放電できます。



左から、接続用のユニバーサル基板の裏側。電源制御に使うFET(ここでは、”2SJ327を使用)。各基板を分離したところ。

SH7144の初期設定

SH7144の電源ON直後、バス幅、ウエイト、アドレス有効、などを設定します。CQ7144基板は、外部拡張可能な、モード2となっていますが、チップセレクト1で外部のSRAMを16ビットバスで接続できる設定にします。また、電源ONで、オンボードのLEDが点灯します。この表の上の部分は、アセンブラで記述した部分で行うもので、C言語で書いたSDカードの制御プログラムで、残りのレジスタを初期設定します。
表2 電源ON直後のレジスタ初期設定
レジスタ名(幅)
レジスタのアドレス
設定値
動作
PACRL1 (16)
0xFFFF838C
0x5550
RD/WRL/WRH/CS1/CS0有効
PBCR1 (16)
0xFFFF8398
0x000A
A21/A20有効
PBCR2 (16)
0xFFFF839A
0xA005
A19-A16有効
PCCR (16)
0xFFFF839C
0xFFFF
A15-A0有効
PDCR1 (16)
0xFFFF83AC
0xFFFF
D0-D15有効
PEIORL (16)
0xFFFF83B4
0x8000
PE15 出力、PE14---PE0 入力
PEDRL (16)
0xFFFF83B0
0x0000
LED点灯
BCR1 (16)
0xFFFF8620
0x200F
CS1 16bit Size
WCR1 (16)
0xFFFF8624
0xFF01
エリア1=ウェイト0, エリア0=ウェイト1

表3 プログラム起動後のレジスタ初期設定
レジスタ名(幅)
レジスタのアドレス
設定値
動作
MSTCR (16)
0xFFFF861C
読み出し値 & 0xFFFD
内臓SCI_1を有効。RS232Cコンソール
MSTCR2 (16)
0xFFFF861E
読み出し値 & 0xDFCD
タイマー4などを有効
TCR4 (8)
0xFFFF8201
0x05
タイマー4のクロック入力を、Pφ(24MHz)/1024に設定
TSTR (8)
0xFFFF8240
0x80
タイマー4を自走カウントアップ
SMR1 (8)
0xFFFF81B0
SCI_1 調歩同期、8bit、NOPARITY、1STOP、クロックレート0
PACRL2 (16)
0xFFFF838E
0x2145
PA7=INOUT,CS2=OUT,PA5=INOUT,SCI_1=enable,SCI_0=enable
PAIORL (16)
0xFFFF8386
0x8012
TXD0=OUT,TXD1=OUT,PA15(CK)=OUT
BRR1 (8)
0xFFFF81B1
0x0C
Pφ(24MHz) x 1/13 x 1/32 --> 57692 (57.6k)

SH7144の初期設定プログラム

制御プログラムは、CygwinのGCCで開発しています。GCCのバージョンは4.02です。
アセンブラで記述したスタートアップは、こちらです。
その他の初期設定は、こちらです。

SH7144のSPIポートの設定と、SDカードの電源OFF−−>ON

SH7144には、シリアルポートが4本あり、SCI_2を使います。クロック同期モードに設定し、MSBから出てくるように設定します。SH7144のSCIには、MSBから出すモードがあるので、SDカードをSPIで制御するには便利です。SCI_2を同期モードで使うには、SCI_2を有効にする以外に、対応するI/Oポートの入出力も設定しておきます。TXD2、SCK2は出力、RXD2は入力とします。
使用しているポートは多機能なので、またSDカードの電源を切ってもDI(CMD)ピンや、CSピンがHighだと、これらの信号がSDカード内部で電源に回り込み、単に電源をOFFにするだけでは、2V付近までしか下がりません。その為以下の手順になります。
  1. SDカードへの出力はすべてLowにします。CS=Low、CLK=Low、DI(CMD)は、SCI_2のTXD2ポートを単なる入出力ポートに設定するため、PECRL1、PECRL2に全て0を書きます。また、MSTCRの設定で、SCI_2を無効にします。D2=1
  2. FETのゲートをHighにします。これでSDカードへの電源供給が止まり、放電抵抗1kΩでタンタルコンデンサを放電します。
  3. 40ms待ちます。時間を正確にするため、タイマー4のカウントを読んで、正確に40ms以上待ちます。
  4. FETのゲートをLowにして、SDカードに電源を供給します。CS、CLK2、TXD2ポートをHighに出力します。
  5. MSTCRの設定で、SCI_2を有効にします。
  6. SCI_2のCLKを出力に設定します。SCR2=1
  7. SCI_2のビット出力をMSBから始まるようにします。SDCR2=0xFA
  8. SCI_2を同期シリアルに設定します。SMR2=0x80
  9. SCI_2のボーレートプリスケーラを1/16に設定して、375kHzにします。BRR2=0x0F
  10. 時間経過待ちをします。ボーレートの1クロック間以上待ってから次の設定をするためです。
  11. SSR2を読んで、0を書きます。SCI_2のエラーステータスをすべてクリアします。
  12. SCR2に0x31を設定して、シリアル入出力を有効にします。
  13. PECRL1、PECRL2に、それぞれ、0x0022、0x8000を設定して、SCI_2のシリアルポートを有効にします。
  14. ダミークロックを出します。規定では、74クロック以上となっていますが、ここは適当に80としています。
以上で、SDカードへの操作ができるようになります。このあと、コマンドをSDカードに出しますが、SDHCの場合は、CMD0、CMD1だけではREADYにできないようで、Simplified Version of PHYSICAL LAYER SPECのSPIモードでの初期化手順に従い、CMD0、CMD8、CMD58、ACMD41、CMD58、CMD9と進めます。この手順では、SDHCでない、2GB以下のSDカードでもREADYにできます。
  1. 電源の制御と、SPIの初期化プログラムはこちら。mmcbios.c
  2. ヘッダーファイル1common.h
  3. ヘッダーファイル2sh7144.h
上記の処理で、電源波形(上)と、CLK2(下)の波形を観察したものです。

SDHCを含むSDカードの初期化

  1. ポートの初期化後、CSをHighにして、400kHzで、ダミークロックを出す。0xFFを10回出力します。
  2. CSをLowにして、CMD0を出します。CSがLowだと、SPIモードになります。SH2の同期モードでは、何かを出力しないとCLKが出ないので、コマンドを出した後、0xFFを出しながら、入力完了フラグを見て受信します。また、所定のレスポンスを受信した後、CSをHighにしてから、0xFFを出力して、ダミークロックだけ出しておきます。このようにしないと、SDカード側で次のコマンドを受け付けてくれないようです。(ダミークロックがなくても受け付けるSDカードもあります)
  3. CMD8を出します。32ビットの引数は、マニュアルにより、0x000001AAとします。古いタイプのSDカードでは、このコマンドは未定義命令 illegal command bit (0x4)を返し(0x05)ますが、このまま続けます。
  4. CMD58を出します。レスポンスは、not ready 0x01から始まって、0x00、0xFF、0x80、0x00 となります。
  5. CMD55を出してレスポンス0x01を待ち、ダミークロックの為、0xFFを出します。この後ACMD41を出します。レスポンスが、not ready 0x01だと、CMD55、ACMD41を再度出し、0x00になるまで続けます。
  6. レスポンス0x00を確かめると、CMD58を出します。レスポンスに続いて出されるのがOCRで、0xC0、0xFF、0x80、0x00となり、0xC0のビット0x40が、SDHCであることを示しています。SDHCでない場合は、0xC0のところが、0x80になっています。
  7. これでSDカードは ready 状態で、リード、ライト可能になっていますが、さらに、CMD9を出して、CSDを読み出します。SDHCの場合は、読み出したCSDのバージョンが2になっていて(ビット127−126が、01)CSDの内容が標準のSDカードと異なります。大きな違いは、カードの容量を示す部分で、22ビットあり、単位が512kBとなって、最大2Tバイトまで示すことができます。
  8. CSDには、SDモードでのクロックスピードを、50MHzに対応しているかを示すビットもあります。(ビット103−96=0x5Aで50MHz、 103−96=0x32で、25MHz)
  9. SPIモードでは20MHzが上限ですが、ここでSH7144のシリアルクロックを375kHzから最大の6MHzに変更します。BRR2=0。

上記SDカードの初期化を含むSH7144モニタプログラム

  1. SDカードの操作プログラムはこちらmmc7144.c
  2. ヘッダーファイル3mmc.h
  3. 内臓ROM用Sレコードファイル。SH7144のフラッシュに書きますmmc7144r.mot
  4. 外部RAM用Sレコードファイル。外部SRAMにロードして、0x400400番地から実行できますmmc7144.mot
  5. モニタプログラムの操作。一部準備中sh2mon.html





inserted by FC2 system