MMC controller for H8
パラレルポートを使ってPCにMMCを接続してみました。詳細はこちらです。
先に作ったH8とACEXの基板にMMCを実装しました。MMCモードの状態遷移は複雑そうだし、なにより、バスが双方向なのは面倒なので、とりあえずは、SPIモードの実装です。でも、MMCモードのコマンド群は魅力的なんですよね〜
とりあえず簡単な解説です。現在goemonというOS上のモジュールとしてしか実装していないのですが、そのうち、きちんと分離し分かりやすい形でソースの提供をします。リクエストがあれば、メールしてください。早急にやりますので。
とりあえずおきました。(2002/03/10)
- ハードウェア的な問題
僕の基板では、MMCのdataラインがプルアップしていないので、適当にプルアップしてあげなければいけません。
データシートをみると、抵抗値についての記述がありますが、共に100Kの抵抗でプルアップしました。
- MMCコントローラの概要
いろいろなところに書いてあるので、今さらなのですが、SPIモードにはいるためには以下の手順を踏みました。
- CS="high"で、clockを80クロックおくる(76クロック以上なので)
- CS="low"でCMD0を発行(0x01)のレスポンス
- レスポンスが0x00になるまで、CMD1を発行する
これでSPIモードになります。CMD0を発行する時点ではMMCモードなので、きちんとCRCがいります。(その後はCRCの部分はドント・ケアです)データシートによると、CRCの値は0x95です。
- MMCのバスステートでの注意点
MMCはクロックに同期させてデータをおくるので、クロックがくるうと、うまく動作しません。日立からでているデータシートに二種類あって、ユーザーズマニュアルではない方に詳しくバスステートについての記述があります。
私はコマンドの発行をこんな感じで実装しました。
- CS="low"
- 8クロック
- コマンドの発行
- 8クロック
- レスポンスの受信
- 8クロック
必要ないクロックもあるかもしれませんが、こうすると動きます。その後にデータなどが必要ない場合には、ふたたびCS="high"とします。
バスステートの図を近日中公開の予定
- データのリードとライト
日立のカードはデフォルトのブロックアクセスが512バイト単位なので、それに従います。データのリード/ライト時の手順は次の通りです。
- コマンドの発行(ライトならCMD24リードならCMD17です)レスポンスは0x00のはず
- データのスタートバイト0xfeを発行/受信
- データを512バイト分発行/受信
- CRC分の2バイトのダミーの発行/受信
- MMCからのレスポンスを受信(****0101)となっていれば成功
- MMCからのDataラインがhighになるまでクロックの送出(lowのうちはbusy状態)
- ソース
とりあえずgoemonのモジュールのまんまですが、置いてみました。サンプル代わりにはなるかな...
mmc.c
mmc.h
動いてしまえば、とってもMMCが愛しく感じられます(動くまではシリアルだし、よく分からんし、ちょっとむかつく)。なんといってもこのサイズで16MBなどといった容量が得られるのですから。