|
フロー図のとおりやってもダメなことが、じんわり分かってきました。
いろいろ書き込みながら作業してます。
マギの中に残されたリツコの母親のメモみたいw(分からない人はスルーね)
初期化が終わるまではCLK周波数は400Kbps以下でないといけないとか、同じ意味だと思うけど100kHz〜400kHzだとか(Wait入れなくちゃ)。
フローには書いてないけど、随所にダミーの8CLKを入れないといけないとか。
アイドリング中のCLKは’H’にすべしとか。ダミークロックの間は/CSは’H’にすべしだとか・・・
フロー図自体にもナゾがあるんですよね。
条件分岐したうえで、
「SD Ver.2 (Block address)」
「SD Ver.2 (Byte address)」
「SD Ver.1」
「MMC Ver.3」
「Unknown card」←要するに「知らんがな」
に分類されるわけですが、
「SD Ver.1」か「MMC Ver.3」か判断する部分のコマンドが「ACMD41」と書きながらコードは「0x00000000」、同様に「MMC Ver.3」か「Unknown card」か判断する「CMD1」も「0x00000000」。どっちも「CMD0」じゃないすか!
書き誤りとしても、「CMD41(0x40000000)」は「SD Ver.2」と「SD Ver.1」の判別に使っているので、結局、「SD Ver.1」と「MMC Ver.3」の判別をどうやっているのか分からない。
あーー、1chipMSXでSDカードの初期化に「CMD1」を使っているとあったのは、このへんのことだったのでしょうか?
というわけでナゾは深まるばかりですが、Jポートに直結できるハードにしちゃいました。I2C小型LCDと入れ替えるたびに繋ぎ変えるのが邪魔臭かったからです。このmicroSDアダプタの端子は、いかにもMSXに繋いでくださいと言わんばかりの配列ですた(・∀・)b
|
日記
-
詳細
コメント(6)
|
スパゲティ状態した部分をバサッと削って、つじかわさんの「mmc_test」のソースの初期化部分に丸ごと差し替える。暴走しなくなったが、「cmd0」でエラーが出る。
チェックを全部外して強制的に「cmd1」を実行する。当然、スンナリ終わる。しかし、メモリに残されたコマンドレスポンスを見ると、「01111111」orz 全面的にエラー。
要するに、まだ初期化ができてませんねん >┼○ バタッ
アヤシイところをメモしておきます。
(1)「cmd0」のレスポンスは「0x01」。
最初、「0x00」の思い込みで時間と労力をロスしました。
(2)「cmd1」のレスポンスは「0xff」が続いたあと、「0x00」で正常終了。
資料によっては「0x01」が続くと書いているものもある。
とにかく「0x00」になるまで待つことにする。
つじかわさんは16回トライでダメならタイムオーバーと判断しているらしい。
(3)コマンドやデータの入出力は、CLKの立上がりエッジのはず。
資料によっては「立上がりで入力、立下りで出力」と書くものあり。
こういう基本的なところでマチマチなのはどういうことやねん?
(4)レベル変換ICをかましているので、74HC14は省略した。
やっぱり要るかな?プルアップ抵抗の影響でナマっている可能性あり。
(5)あ、途中でピンアサインを変えたぞ?大丈夫か?w
そもそも、つじかわさんのルーチンに差し替えて、なんでエラーになるのか理解できない。前進してるのか後退してるのか?(・∀・)?
サンハヤトの基板から、スイッチサイエンスで買ったブレークアウト基板に変更。こっちのほうが余計なピンがなくていいですね。固定用の穴もあいてるし。
とりあえず、アクセスLEDが点灯していることのご報告。
|
|
明けましておめでとうございます。って、もう13日、いや14日か。
月日の経つのは早いものですなあ。と、まったりしている場合ではありませんね。
この年末年始、ずっとSDカードのアクセスに取り組んでおりました。が、なかなか上手くいきません。コマンドのレスポンスを「0x00」ばかりだと勘違いしていたり。アセンブルはエラーなく終了しますが、実行するとちゃんと暴走します。たぶん、PUSH/POPを間違っているのでしょう。だんだんスパゲティ化しつつあります。
いささか煮詰まってきたところで、こんなんみつけてしまいました。
スイッチサイエンスさんとこで売っている、ちっさいLCD。
8文字×2行です。I2Cでコントロールするそうです。SPIもまともに出来てないのにI2Cに手を出す無謀さは、今年も相変わらず。
以前にmosakuさんとこから拝借したRTCのソースをアレンジしているところですが、今のところ何も表示できてませんw
何に使うあてもないのですけどね、可愛いのでつい買ってしまいました。わずか16文字で何かをMSXが訴えてくるなんて、なんていじらしいのでしょう。I2Cの魔術師様なら、サクッとこなされるんでしょうなあ、などと思いながら、I2CとSPIの二正面作戦に打って出ている今日この頃です。
旧日本軍にせよ、ナチスドイツ軍にせよ、二正面作戦は必ず失敗するのですけどね(・∀・)b |
|
前回、「電気的に接続できたとして」としましたが、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」)。
|
|
この時期、毎年寒くなるとこまめに風邪をひいたりして体調を崩します。ようやく戻ってきたのでハナシの続きを。って、どこまで話したっけ?状態。
あ、そうそう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」のタイムアウトで考えます。(本日これまで。)
|



