|
タイミング調整の結果、手持ちのほとんどのSDC、microSDCを読み込めるようになりました。諦めていた16GBのSDHCも、CMD1一本槍で読み込めているのですよ。SPIでアクセスするような人を撥ね付けるのは、大人気ないという判断でしょうかね?
microSD→SDのアダプタをつけると読み書きの速度が落ちるそうで、microSDCを直接挿し込めば読めるのにアダプタ経由だと読めなくなります。中間ぐらいのタイミングを狙って、両方読み込めるようになりました。
Amazonのレビューで測定結果を公表されていたので引用しておきます。断線もしやすいそうです。この変換ケーブルは常用にはしんどいですね。というわけで、microSDCメインの運用になりそうです。
ノーマル Sequential Read : 45.630 MB/s Sequential Write : 34.860 MB/s Random Read 512KB : 41.977 MB/s Random Write 512KB : 18.746 MB/s Random Read 4KB (QD=1) : 3.681 MB/s [ 898.7 IOPS] Random Write 4KB (QD=1) : 0.799 MB/s [ 195.1 IOPS] Random Read 4KB (QD=32) : 4.541 MB/s [ 1108.6 IOPS] Random Write 4KB (QD=32) : 0.892 MB/s [ 217.7 IOPS] エクステンションケーブル使用時 Sequential Read : 23.550 MB/s Sequential Write : 21.117 MB/s Random Read 512KB : 22.420 MB/s Random Write 512KB : 11.858 MB/s Random Read 4KB (QD=1) : 3.421 MB/s [ 835.1 IOPS] Random Write 4KB (QD=1) : 0.756 MB/s [ 184.6 IOPS] Random Read 4KB (QD=32) : 4.104 MB/s [ 1002.0 IOPS] Random Write 4KB (QD=32) : 0.857 MB/s [ 209.3 IOPS] (UHS-IのmicoSDで計測)
確かに半分ぐらいの速度に落ちてますね。
あと、成績が悪かったのはバッファローの512MBで、2枚とも50%ぐらいの確率でタイムオーバーになりました。ぼくが持っているSDCの中でも最古参なのでくたびれているのかもしれません。SanDiskのmicroSDC1GBもなかなかシビアです。
ということで、現在はセクター読み込みのバグ取り中です。
なかなかしつこいバグで、同じセクターを読んでいるつもりなのに、毎回異なる内容が表示されます。挙動不審なところもあります。しかし、とにかくここまで来ましたのご報告まで。
一応、CMD0とCMD1の初期化が終わって、CMD16で読み書き単位を512MBに設定、CMD17で読み込もうとしている様子が分かるでしょ?
コマンドのレスポンスも正しい数値が返っています。でも、挙動不審なんですよねえ?
CMD17のルーチンは割と長いので、気長にデバッグします。それが済んだら、いよいよ書き込み。セクター単位の書き込みの犠牲になるSDCを選出しないといけません。Teamという知らないメーカーの8GBmicroSDHCかなあ?(心なしか、小さなカードがビクビクしているように見えるよw)
それにしても、MSXにとって8GBって、なんて広大なんでしょう。昔、32MBのHDDに「使い切れないなあ」と思ったのがウソのようです。
512B × 15564800セクタ = 7,969,177,600B
ありゃ?2バイト整数では、15564800セクタも扱えないのでは?(・∀・)ありゃ?
|
日記
-
詳細
コメント(0)
|
初期化に関しては所期の動作ができたので、さっそく各種SDCでテストしてみました。結果的にはmicroSDは全滅状態でした。microSDのアダプタなのに;;
microSD→SDのアダプタを付けて、SDCもテストしました。
Pansonicはさすがというか、1GBから32MBまでminiSDも含めて全部合格。ハギワラシスコムとバッファローの512MBも合格。しかし、同じバッファローの512MBが成功したり失敗したり。ELECOMの512MBは不合格。
Amazon?の16GBはSDHCということもあり、予想どおり(予定どおり?)不合格。
microSDの8GB以上はSDHCなので不合格。微妙なのは1GB1枚と2GB2枚。成功したり失敗したりするのです。奇妙なのは、アダプタ本体のmicroSDスロットに入れると、ほぼ失敗します。で、microSD→SDのアダプタにSD変換アダプタを介して接続すると成功例がたまに出てきます。右下のSD変換アダプタは、成功しやすい順に左から並べました(SanDiskが成功しやすいです)。変換アダプタで差が出るとはね。
まだ初期化だけのプログラムですが、あまりタイミングを調整しておらず、認識されたバグもありますので、もう少しブラシュアップします。
早くセクター単位でいいから読み書きしてみたいですね。
しかし、microSDのアダプタなのにmicroSDが使えないとは・・・orz
|
|
MSXでSDカード(以下「SDC」という。)にアクセスしようとしているところ。
本当はMMCにしたかったが実物を見たこともない。今さらヤフオクで入手するのもアレなので小容量SDCを対象としている。つまりFAT32やSDHCは対象としていない。この時点で既に時代遅れだけど、新規格ほどアクセスが面倒臭いのですよ。
さて、今のところ1GBのmicroSDCにCMD0が通るところまで来た。しかし、CMD1が通らない。1chipMSXはCMD1一本槍で2BGまでのSDCに対応しているという。確かに、テストに使っている1GBmicroSDCも1chipMSXでアクセスできる。
しかし、本当に1chipMSXはCMD1一本槍なのだろうか?こっそりSD専用CMDを使っているのではないか? そう疑い出すと、テストに使っている1GBmicroSDCも疑わしくなってくる。実はSDHCなのではないか?実はFAT32フォーマットではないか?
疑いだすとキリがない。小容量SDCを使えばいいのだが、製作したアダプタに合った小容量のmicroSDCを持っていない。ええい!買っちまえ!というわけで、入手したのがコチラ。
「サンコー SD-microSD変換エクステンションケーブル SDCVET2K」。
Amazonで784円。レビューはあまり良くないが、使えればいいし実際使えてるし。さて、16MB(16GBじゃないよw)のSDCを繋いで・・・あれ?どこ行った?すぐどっか行っちまう。ちっさくてもいいんだよー。ちっさいのは恥じゃないよー。
仕方がないので、32MBのminiSDCを取り出す。アダプタを介してSDCソケットに接続。ちゃんと認識される。32MBのminiSDCなんてのも絶滅危惧種でしょうな。
では、実験再開。
実はデバッグ用の行を削っていたら、大事なところまで削ってしまったらしい。runしたとたんに暴走し始めたw
なーにやってんだか? 3歩進んで5歩下がる。到達点より少し下がったところから再出発である。当面の目標は、CMD1でレスポンス「0x00」を得ること。
それがダメなら、本当にフロー図どおりにしないといけない。CRC有効の「CMD8」やら2バイトコマンドの「CMD41」やら中ボスキャラが控えている。
ここを潜り抜けて初めて、Read/Writeの大ボスにお目見えできる。FatFSはさらにその先のビヨンドですな。
突然投げ出して、インテリジェントなSDC I/Fに走り出すかもしれないよwwww
|
|
朗報!一歩だけ前進ヽ( ´¬`)ノ ♪
さっそく届いたばかりの「定番!超軽量マイコン用ファイルシステムFatFs」(CQ出版社)を読了。おお!知りたいことが載っている!
ファイルシステムの前提として、各種メモリにアクセスするスキルが前提となるわけですね。そこで、最低限の知識を付けさせるため、SDカードやIDE-HDDなどについて解説されています。
例えばこれ。SDカード独特のSPIモードについて解説されています。
クロックとデータセットの仕方がよく分からなかったのですよ。上の図と本文をじっくり読んで試行錯誤。ようやくお蔭様で、SDカード初期化の前半、CMD0について無事「0x01」と正しいレスポンスが返るようになりました。半日がかりで疲れました〜。
しかし一難さってまた次男。初期化の後半のCMD1が「0x00」のレスポンスを返してくれないのです。ひょっとしたらですね。使っているのが1GBのmicroSDなので、CMD1ではだめでSDカード専用のCMD41を使わないといけないのかもしれません。つまり、まさに例のフロー図どおりに処理しないといけないかもしれないのです。
何が辛いって、7インチのVGAディスプレイで作業しているので、80桁表示が見えないのですよ。21インチに繋ぎ替えようかしらん。邪魔臭いなあ(・∀・;)
余談ですが、10章の「Petit-FatFsの使い方」として、ATiny45/85で動かしてみるという記事があります。
どういうわけか手元に「AVR Stick」なるモノがあって、これに載っているのがATiny85なわけですな。付属CDのHEXファイルをそのまま書き込んで、MSXとはRS232Cカートリッジ又はJポート経由の調歩同期(大昔にやった気がするw)でやり取りすれば、最低限の外付けハードでSDカードにFATっぽくアクセスできるかもしんまい。
「できる限りはMSXで処理するのじゃ!」と言っていたヤツはどこへ行ったのでしょうね(爆)
|
|
今さらながらですが、SDカード用のBASICプログラムを書いていたときのことです。「あれ? CLEAR文ってどう書くんだっけ?」と思ったのです。慣れたこともすぐ忘れちゃうお年頃♥
いつも使っているSONYの「聖子のMSX文法書」(恥ずかしいカバーはすぐ捨てましたw)が見当たらなかったので、Nationalの「BASIC説明書」を参照しました(下図)。
第2パラメータの説明として、「指定された番地の直前までをBASICが使用するメモリの上限値」と書いてあります。文例の「CLEAR 300,&HE000」であれば、&HE000の直前の&HDFFFがBASICの上限と読めるでしょ? とすれば、&HE000以降がマシン語エリアのはず。「そうだっけなぁ?」と違和感を感じながらもBASICのプログラムを書いていたのですが、どうも挙動不審。DEFUSRで定義したはずのユーザー関数を使おうとするとシンタックスエラーになったり。
別の書籍に当たってみました。例えば「MSX-Datapack」では「BASICが使用するメモリの上限」としており、これなら文例の「CLEAR 300,&HD000」では&HD000までがBASICの上限、マシン語エリアは&HD001以降となります。
複数の書籍に当たってみると、実は両方の説明が混在していたのであります。案外、皆さんきちんと理解してなかったようです。こんなことってあるのですねえ。で、正解は「MSX-Datapack」ということにしました。先に述べた挙動不審の件もありますが、「MSX-Datapack」的に解釈しておいたほうが無難だという実際的な理由であります。
こういう基本的な解釈がマチマチな事象は、他にもあります。
現在、SDカードのアクセスにあくせくしているわけですが、SPIの動作モードにも疑問点があります。例えばクロックに関しては、
・クロックの立上り時に読むのか、立下り時に読むのか
・アイドリング時のクロックは"0"か、"1"か によって4つのパターンが想定できますが、それらをどう呼ぶか各社バラバラだというのです。詳しくはこちら↓
「SPIの罠」
(ここから引用、図はクリックで拡大されるはず)
罠はこのパターンの表現です。なんと各社全く違う表現をします。
以下の表が各表現の対応です。タイミング欄の赤点線の瞬間にデータを送受信します。 つまり、仕様書には「SPI通信はMode0,0でよろしく!」と書いてあるものもあれば、 「CKP = 0, CKE = 0 でお願いします_(._.)_」と書いてあるものもあります。
普通に考えると「Mode0,0 って、CKP = 0, CKE = 0 と同じなのかな?」と思います。 だれだってそう思います。僕もそう思います。 でも現実は無情。上の表の通り、全く別のパターンです。 対策は、毎回この表を見ることです。記憶などに頼ってはいけません!ましてや「なんでこう呼ぶのかな?」などと考えてはいけません。(引用ここまで)
ああ、無情・・・orz
ELM-CHANさんは「SPIポートの設定はMode 0(CPHA=0, CPOL=0)とするのが適当です(Mode 3でも多くは動作が可能)」とサラッと書かれていますが、
SPIモード
そう簡単でもないようで、いつも参照しているテキスト『フラッシュ・メモリー・カードの徹底研究』(CQ出版)では、「送信はクロックの立ち下がりで出力するように、受信はクロックの立ち上がりで入力するようになっています。」(97頁)と書かれており、次頁のタイミングチャートでその様子が示されています。
結局、SDカードのクロックは「通常時=1、カードへの書き込みは立下り、読み込みは立ち上がり」という、先の「SPIの罠」の表で言えば、mode2とmode3の混在と言えましょうか?
そう断言できればいいのですが、この本もけっこうアヤシイところがあって、一体何を信じていいのか猜疑心に苛まれながら、いまだにCMD0のエラーレスポンスが解消できないでいるのです(*´Д`*)
|




