|
前回、「電気的に接続できたとして」としましたが、SDカード・スロットの候補を追補してまとめておきます。
上段左から、
(1) microSDカード・アダプターの端子+2列ピン
サイズがピッタリなんですね。先にピンに予備ハンダしておいて、サッとハンダごて当てれば大丈夫のはず。もう一列のピンをエポキシ樹脂で接着すればいっそう強度が増すでしょう。一番安くあがるSDカード・スロットです。
(2) 普通のSDカード・スロット(3.3Vレギュレータ付き)
どこで買ったか忘れました(・∀・)? 他の入力ピンを3.3Vレベルに合わせる工夫が必要なので、電源が付いている有り難味がイマイチ低くなります。
(3) サンハヤトのSDスロット(レベル変換IC付き)
サンハヤトは痒いところに手が届く製品を出してきますね。レベル変換の面倒がない点がいいです。
以上3種類が、「インテリジェントではないSDスロット」です。
下段左から、
(4) microtechnicaの「SD/SDHCカードシリアル制御ボードMSC-MOD70」
256MB〜32GBまでのSDカード/SDHCカードに対応(FAT対応)。入力は5Vトレラント(リセットピン除く)。インターフェイスは、非同期式シリアルのUARTと、同期式シリアルのI2Cのどちらかをモードピンの設定によって選択します。が、UARTはデフォルト115.2kbp。コマンドで低速にできますが、MSXにとってデフォ115.2kbpはキツい。I2Cの一択になりますね。データの送信に少しクセがあって、元データが「00H」のときは「FFH 00H」、「FFH」のときは「00H FFH」と、この部分だけ2バイト送信されます。ちなみに、16MBと128MBのSCカードを用意していたぼくは、SDカードの探し直しです(*´Д`*)
(5) SUNTECHの「SDカードインターフェースEU-SD110V2」
2GBまでのSDカード/SDHCカードに対応(FAT対応)。インターフェイスは調歩同期。通信速度は4800/9600/19200/38400/57600/115200bpsから選択できます。この選択方法がユニークで、速度毎にファームウエアが用意されており、インストールしたいファイルをダウンロードします。PCから転送すれば、次回からその速度で起動します。4800bpsならMSXでも対応できそうです。入力は5Vトレラント。
この二つは、I/F側でFATに対応しており、専用コマンドでアクセスします。先の三つに比べて、インテリジェントな感じですね。
ここで少し考えているのが、MSX本体とI/Fの役割分担です。MSX側の負担を減らそうとすると、よりインテリジェントなI/Fを使えばいいわけですね。例えば、オランダのSunrize製CF I/F(下の写真)を使えば、MSX-DOSからSDカードにアクセスできます。本体を1チップMSXに替えれば、初めからSDカード対応です。
しかし、それじゃ「作法」に反する気がするのですね。できる限りMSX側で処理する、難しい部分をI/Fに任せる、というのが「自立したMSXユーザー」のあるべき姿ではないでしょうか? エラいこと、言っちゃった(・∀・;)
余談ですが、何らかのカタチでRTCもほしいところです。そうでないと、意味不明なタイム・スタンプになりますから。今日掲げたI/Fの中では、(4)だけRTCを載せています。仮に1チップMSXを使うとしてもRTCがありませんから、別途用意してもよろしいのではないでしょうか? ちなみにAmazonで145円のRTC売ってました(電池別。なお、「RST」となっているピンは、正しくは「CS」)。
|
過去の投稿月別表示
-
詳細
コメント(2)
|
この時期、毎年寒くなるとこまめに風邪をひいたりして体調を崩します。ようやく戻ってきたのでハナシの続きを。って、どこまで話したっけ?状態。
あ、そうそうMSXの汎用ポートにSDカードをつないで、SPIモードでアクセスしようとしているところです。
で、ハードウエアはさて置き、電気的に接続できたとしてソフトウエアを書きかけたのでした。
しかし、いくつかの分からないところが出てきて調査に戻ったのであります。
分からないところの第一点は、「初期化」の部分です。
大雑把には
に書いたとおりでいいかと思いますが、細かいところで、SDカードは<CMD0>→<CMD1>でいいのか? <CMD0>→<ACMD41>としないと受け付けられないのか? という疑問があります。
<ACMD41>というのは、SDC専用の初期化開始コマンドで、アプリケーション特化コマンドの<CMD55>をアタマに付けて、<CMD55>→<ACMD41>として使います。
elm-chan さんの「MMC/SDCの使いかた」
にフローがありました。
・・・場合分けが多いですね。アセンブラ止めてC言語にしようかな?(・∀・;)
でも、既にMMCは身近には売ってないし「2GBまで」と宣言しちゃったから、<CMD55>→<ACMD41>しか選択肢はない・・・という判断でいいのだろうか?
この「SASI HDD用I/F」の MSX用はぼくも持っていまして、肝心の32MB HDDがクラッシュしたのがしばらくMSXを離れていた直接の原因でもあります。
さて、このサイトで興味深い記述をみつけました。
(ここから引用)
「その他も含めて、SDカードアクセスのバスライン初期化に際してうまくいかない原因を調べてみたところ、ざっとこれだけのものがありました。
…正解は最後のやつでした。文献なんかを読んでもあまりこんなこと書いてないみたいな気がするのですが、これで一発で動作しました。それどころか、昔1chip MSX版MZ-700でロジックを変更して以降初期化できなくなった8MBのSDカードもあっさり初期化できるようになりました。おお、これは1chip MSXにも反映せねばなりませんな。
今まで動いていたのは…偶然か。」(引用ここまで) ・・・いろいろと面白いですねえ。「1chip MSXにて、SDカードでもCMD1を受け付けることがわかっている」とか「1chip MSX版MZ-700」とか。
で、<CMD1>でいいなら、これで行きます。ほいで、「各コマンド終了直後、CS='H'状態で8クロックのダミークロックが必要」、これ行きます。
ただし、ぼくが参照しいているテキスト「フラッシュ・メモリ・カードの徹底研究」(2006年CQ出版)には、「ダミー・クロック送信時の/CSは”H”でも”L”でもかまいません」とあります(95頁)。「どっちでもいい」というのが困るんですよね。/CS='H'で行きます。フロー先頭の「74クロック以上のダミーコード」の部分で「/CS='H'」とあるのと整合的です。先頭ではDIも'H'なのねん。「苦悶式SDカード 4」の「/CS=Lで統一」は撤回。 フローを参照しておきながらアレですが、なるべく一本道で行きたいのです。フローチャートでいうと「MMC Ver.3」に至る道ですね。一歩前進したのか後退したのか分かりませんが、とにかく少し疑問の部分が整理できました。ダメだったら、またそのとき考えます。
フローに記載はありませんが、SDカードからのレスポンスを待っている部分にタイムアウトも必要だと思います。「苦悶式SDカード 4」では「100ms」と書いていますが「数100ms」かかることもあるらしい。大容量SDだと1秒かかることも。でも、「対象は2GBまで」と宣言したので「数100ms」のタイムアウトで考えます。(本日これまで。)
|
|
予定どおり風邪をひきまして、現在も絶賛水洟中! どうもプログラムに集中できません。というわけで、5V→3.3Vの電源アダプターを作ってみました。三端子レギュレータとコンデンサでチョチョイのチョイ、のはず。
ところで、三端子レギュレータってこんなイメージですよね(下の写真)。
名前のとおり足が三本あって、刻印面から見ると左から IN、GND、OUTの順。
でも何を思ったのか今回ぼくが使ったのは、左側がNJM2845DL1-33、右側がAMS1117-3.3。端子にクセのある連中です。
NJMのはラーメン屋の岡持ちの持つところみたいなのがGNDです。足の間にちょろっと出ていますが(男の子なのねw)、GNDとも他の端子とも繋がってないようでした。AMSのGNDは左端で、上のベロは放熱用なのでしょう。
78シリーズの端子イメージが定着しているのはぼくだけじゃないようで、WEBを眺めていると配列の違いに起因する失敗談を見かけました。
作ってみたのが下の写真。サンハヤトの電源付きブレッドボードの上に並べてみました。
左端はサンハヤトの電源。5Vの入力はACアダプターとUSBの両対応で、出力は5Vと3.3Vをジャンパで選択できます。上の電源ラインは5V、下の電源ラインは3.3Vと使い分けもできて、さすがに使いやすいです。 中央がNJMで作ったアダプター。ちゃんと表面実装しているのがお分かりでしょうか。コンデンサもチップを使っています。矢印は5V→3.3Vの方向を示します。ピンのふちが黒いのはGNDのシルシで、ぼくの習慣みたいなものです。GNDがセンターなのでINとOUTを上下に真っ直ぐ引き出すと、端子の位置がズレます。
右端がAMSで作ったアダプター。熱対策するほどのこたぁないだろうと密集してみました。チップ・コンデンサは裏側に貼り付けています。電解コンデンサも使ってみました。GNDが端だと配線がやりにくいなあと思いながらよく見ると、サンハヤトの製品もAMS1117-3.3でした。こりゃまた失礼「(・∀・)w
ブレッドボードぐせ?がついたせいか、入出力端子に丸ピンソケットを使ってしまいました。これではうっかりすると挿し込み時にショートしますね。どこかのブログで拝読した「両端がオスプラグの100V延長コード」を連想しました。
「端子」についてアレコレ考えることになった今回のプチ工作でした。 【蛇足】
ところで、5VACアダプタなんて、そのへんにゴロゴロしてそうなモンですが、4.5Vや9V、11Vなども混じっていて、意外とみつからなかったりします(ぼくだけか?)。
そんなとき、百均で買ったUSB充電コードのプラグを改造しておけば便利かもしれません。1チップMSXのUSB端子も使い道ができるかもね(・∀・)b |
|
やはり、こういう画面で見ないと雰囲気でませんな。
相変わらず、コマンドの発行とレスポンスの受け取りに難航しています。作業的には、ほとんどそれで全部なんですけどね。
付け加えて言えば、読み込みのデータ受け取りと書き込みのデータ渡しぐらいかな?
エラー処理ってのもバカにならないもんですなあ(他人事モード)。
まあ、ちゃんとやってまっせのアリバイづくりばかりですわ。
メインルーチンは極力簡単にするのが好みなんです。
読み込みの場合、コマンド・レスポンス1Bに続いてバッファが512B、ダミーのCRCが2B。合計515B一気に読み込んでラクをしようというのが、ミエミエ中尾ミエですな。PSG0と1は、初期値と作業中の値。作業が終われば初期値に戻します。HLPTRは、BASICから2バイト整数を渡すときのポインタです。
コマンドは、前回の構想から後退してます。リセット用のSDカード専用コマンド、ACMD41ではなくCMD1を使っているのは「退化」と言っていいでしょう。これでダメなら、もっかいSDカード用に書き換えます。
プログラムは全体の半分ほどを示しました。この先の下半身はほぼできておるのですが、本当に読み込んだり、書き込んだりする「RDSD」「WTSD」の部分なんか、ヒドイものですなあ。はっはっは。
浅草ギ研さんは、わざわざスーパーで買ってきた1GBのSDで実験されていて、ちゃんとMMC用のコマンドで動いているそうです。写真まで載せてます。
ぼくがターゲットにしているのは、SanDiskの1GBです。ちゃんとしたメーカー品のほうが仕様にうるさいかもしれませんね。しようがないな。
とらぬタヌキの八畳敷きでしたっけ? まだプログラムも完成していないのですが、マイクロSDでうまくいけば、通常のSDにも応用したいですね。ミニSDって中途半端なモノ使っている人いるのですかね?
なにぶんBASICベースを前提としていますので、どうもFAT対応はメモリ容量的にむずかしいようです。当初にちらっと書いたように、S○NYのHBI-55のような固定長ストレージとしての使い方を念頭に置いています。
とりあえず、中間報告まで。
|
|
今日調べてまとめたものを掲載。実際の端子操作を念頭になるべく分かりやすく書いたつもりですが、誤解・勘違い・誤りがあろうかと思います。誤字脱字、遺漏脱肛など、みつけたら、やさしく教えてね。
────────────────────────────────────
■一般注意事項(今回の仕様の一部を含む)
●SDカードシリーズ、SD・SDHC・SDXCなどの規格のうち、2GB以下のSDのみ対応。なお、この条件を満たすSDへの対応を保証するものではない。
●基本的にアイドル時は、/CS、CLK、DINともH。なお、SD側のDOもアイドル時はH。
つじかわさんが「動作不安定のため」、/CSだけ74HC14で反転させ、CLK、DINは2回反転させて「整形」したとされている。当初のプログラムにおいて、プログラム側で/CSを負論理で書いていたなら他の信号と同様に2回反転させて「整形」すれば済むはずである。 ところで、MSX起動時、汎用ポートの8ピンはL、7・6ピンはHである。MSXにSDを装着したまま起動したとすると、SDに通電した時点で/CS=L、つまり選択状態となる。つじかわさんはこれを嫌って、当初から8ピンだけは74HC14で反転するつもりだったのではないか? /CSは、起動時からHの7又は6ピンに割り当てればいいようなものであるが、頻繁に書き換えるCLKとDINをビットが隣りどうしのセットで扱いたかったのかも知れない。CLKの立下りでDIがSDに読み込まれるので、7・6ピンを同時に変化させたのだろう。 この結果、余禄として、本来同時に変化すべきトリガAとトリガBに、実はタイムラグが生じる予想外の"発見"に至ったのではないか。 なお、書籍「フラ研」には「CLK」にバッファを入れたら、すんなり正常動作した旨の記述がある(109頁)。つじかわさんが動作不安定に悩まされたのも、CLKが原因だったかもしれない。 ●随所にダミークロックが8クロック挿入されるが、この間、/CSはH・Lどっちでもいいとされる(「フラ研」95頁。ホンマかいな?)。今回はダミークロックの間は一般に/CS=Lで統一する。
●CLKはホスト側で発生する。DIN(DATA IN)やDO(DATA OUT)の端子名はSD側から見た名称であるが、以下で「出力する」と言った場合は、一般にホスト側からの出力を意味する。DOのみカード側の出力となる。混乱しないように>自分。
●ホスト側からDINに出力するときは、CLKの立下りでSDに取り込まれる。SDが取り込んだタイミングを見計らってCLK=Hにする。
●ホスト側に読み込むときは、CLKの立上がりでSDはDOに出力するのでタイミングを見て読み込み後、CLK=Lにする。
──────────────────────────────────── ■初期化シーケンス(初期化中は400kHz以下のクロック。)
1 /CS=H
2 CLKから80クロック出力
CLK=Hの初期状態から、L・Hを80回送信し、CLK=Lとする。 資料によっては「74クロック」と記載しているものもあるが、SanDiskやALTERAの資料等では「80クロック」となっている。ダミーデータを10バイト送信すると考えれば「80クロック」に根拠があると思われる。 浅草ギ研さんは「クロックを10バイト送る」と表現されている。8bit×10バイト=80クロックだが、CLKの動きだからクロックで表現するほうが分かりやすい。 3 /CS=L
/CS=Lの状態でSDがCMD0を認識すると「SPIモード」に移行する。SPIモード以外に、SDカード本来の「ネイティブモード」があるのは知っているよね。SandDiskがSPI対応を提案して取り入れられたそうです。SandDisk、エライ! 4 CMD0発行
SDに対するリセット開始の命令である。 データ並びは、40H,00H,00H,00H,00H,95H。 一般に、コマンドは先頭1バイトがコマンド本体、続く4バイトが引数、最後の1バイトがCRCとなる。 先頭2ビットは「01」で始まり残る6ビットが実質的なコマンドを示す。CMD0の場合、2進数で書くと「01000000B」なので、これを16進数にすると「40H」となる。 引数は持つものと持たないものがある。CMD0は引数を持たないので全部「00H」で埋める。CRCのビット0はエンドビットとして「0」に決まっているので、実質7ビットがCRCである。SDでは、ホストとカード間の通信におけるエラー検出にCRCが使われるが、SPIモードではCMD0のみ意味を持ち、他のコマンドでは基本的に無視される。CRCの計算は面倒なのでかなり助かる。CMD0のCRCだけはチェックされるので、エンドビットの「0」を含めて「95H」となる。 DINに値をセットしながら、H・Lを繰返しCLKの立下がりでコマンドを送出する。 コマンド送出後、CLKの立上がりでDOをポーリングし続ける。SDが「BUSY」状態の間はDOはHのままである。これがL(つまり「0」)になると「コマンド・レスポンス」の始まりである。
浅草ギ研さんはレスポンス待ちについて、「1バイトずつポーリングする。値がFFHのときはBUSY、FEHになるとBUSY終了」旨の書き方をされているが、ちょっと誤解を招きそうな気がする。BUSYの期間は不定である。「ポーリング結果をレジスタのビット0に入れ、左にシフトしながら次のポーリング結果を待つ」と書くのがより動作を理解しやすいだろう。「0」がきたときは、結果的にレジスタの値は「FEH」になるけどね。 5 コマンド・レスポンスの受信
DOから「0」を先頭に8ビット(=1バイト)のコマンド・レスポンスを受信する。「00000001B」(初期化プロセス実行中)であればOK。違っていたら何らかのエラーが起きている。 エラーがあった場合、今回のプログラムの仕様ではBASICに渡すバッファの先頭にエラー・レスポンスを残すしてRETするので、作業を中止してエラーの原因究明に当たろう。 他のコマンドでは、コマンド・レスポンスは「00H」であるが、CMD0だけ「01H」の点に注意が必要である。 ちなみに、コマンド・レスポンスには、1バイトの「R1」のほか「R1b」「R2」「R3」があるが。SPIモードでは「R1」のみ気にしておけばいい。 6 CMD1のための間奏曲(インターメッツォ)
ポーリング終了直後のCLKはHとなっているのでLにする。 CLKのH・Lを8回繰り返す。 CLK=Hにする。 /CS=Hにする。 この、CMD0とCMD1との間の操作は書籍によっては書いていない。ダミークロック送出と/CS=Hのタイミングが逆になってる例もあった。浅草ギ研さんもずいぶん悩んだらしい。この動作全体をしなくても動くこともあるらしい。 一応、安全のための「おまじない」として入れておく。 7 CMD1発行
SDの初期化作業が終わったかどうかの問い合わせ。 データ並びは、41H,00H,00H,00H,00H,F9H。ただしCRCはどうでもいいよ。
発行手順はCMD0と同様。SDが初期化作業中であれば、DOはHのまま。再びCMD1を発行し続けてポーリングする。 大容量化によってBUSY期間は長くなるらしく、100ms以上のタイムアウト期間を見込むべきらしい。 コマンド送出後、CLKの立ち上がりでDOをポーリングし続ける。ポーリングについてはCMD0と同じ。 8 コマンド・レスポンスの受信
DOから「0」を先頭に8ビット(=1バイト)のコマンド・レスポンスを受信する。「00000000B」ならOK。違っていたら何らかのエラーが起きている。 9 次のCMDのための間奏曲(インターメッツォ)
ここは 6 と同じ。 くたびれたところへ、ちょうどガメラが来た(・∀・)わ〜い♪ 怪獣見よっとw |




