ここから本文です
Dr.Kikkie (KIKI) : 不許無断天才|免責:本稿を真に受けて損害があっても知らん。

書庫全体表示

記事検索
検索
タイミング調整の結果、手持ちのほとんどの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もなかなかシビアです。
イメージ 1
 
ということで、現在はセクター読み込みのバグ取り中です。
なかなかしつこいバグで、同じセクターを読んでいるつもりなのに、毎回異なる内容が表示されます。挙動不審なところもあります。しかし、とにかくここまで来ましたのご報告まで。
 
一応、CMD0とCMD1の初期化が終わって、CMD16で読み書き単位を512MBに設定、CMD17で読み込もうとしている様子が分かるでしょ?
コマンドのレスポンスも正しい数値が返っています。でも、挙動不審なんですよねえ?
CMD17のルーチンは割と長いので、気長にデバッグします。それが済んだら、いよいよ書き込み。セクター単位の書き込みの犠牲になるSDCを選出しないといけません。Teamという知らないメーカーの8GBmicroSDHCかなあ?(心なしか、小さなカードがビクビクしているように見えるよw)
 
それにしても、MSXにとって8GBって、なんて広大なんでしょう。昔、32MBのHDDに「使い切れないなあ」と思ったのがウソのようです。
512B × 15564800セクタ = 7,969,177,600B
ありゃ?2バイト整数では、15564800セクタも扱えないのでは?(・∀・)ありゃ? 
 
イメージ 2
 
初期化に関しては所期の動作ができたので、さっそく各種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が成功しやすいです)。変換アダプタで差が出るとはね。
 
イメージ 1
 
まだ初期化だけのプログラムですが、あまりタイミングを調整しておらず、認識されたバグもありますので、もう少しブラシュアップします。
早くセクター単位でいいから読み書きしてみたいですね。
 
しかし、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なんてのも絶滅危惧種でしょうな。
 
イメージ 1
 
では、実験再開。
実はデバッグ用の行を削っていたら、大事なところまで削ってしまったらしい。runしたとたんに暴走し始めたw
なーにやってんだか? 3歩進んで5歩下がる。到達点より少し下がったところから再出発である。当面の目標は、CMD1でレスポンス「0x00」を得ること。
それがダメなら、本当にフロー図どおりにしないといけない。CRC有効の「CMD8」やら2バイトコマンドの「CMD41」やら中ボスキャラが控えている。
ここを潜り抜けて初めて、Read/Writeの大ボスにお目見えできる。FatFSはさらにその先のビヨンドですな。
 
突然投げ出して、インテリジェントなSDC I/Fに走り出すかもしれないよwwww
朗報!一歩だけ前進ヽ( ´¬`)ノ ♪
 
さっそく届いたばかりの「定番!超軽量マイコン用ファイルシステムFatFs」(CQ出版社)を読了。おお!知りたいことが載っている!
ファイルシステムの前提として、各種メモリにアクセスするスキルが前提となるわけですね。そこで、最低限の知識を付けさせるため、SDカードやIDE-HDDなどについて解説されています。
例えばこれ。SDカード独特のSPIモードについて解説されています。
 
イメージ 1
 
クロックとデータセットの仕方がよく分からなかったのですよ。上の図と本文をじっくり読んで試行錯誤。ようやくお蔭様で、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で定義したはずのユーザー関数を使おうとするとシンタックスエラーになったり。
 
イメージ 1
 
別の書籍に当たってみました。例えば「MSX-Datapack」では「BASICが使用するメモリの上限」としており、これなら文例の「CLEAR 300,&HD000」では&HD000までがBASICの上限、マシン語エリアは&HD001以降となります。
 
イメージ 2
 
複数の書籍に当たってみると、実は両方の説明が混在していたのであります。案外、皆さんきちんと理解してなかったようです。こんなことってあるのですねえ。で、正解は「MSX-Datapack」ということにしました。先に述べた挙動不審の件もありますが、「MSX-Datapack」的に解釈しておいたほうが無難だという実際的な理由であります。
 
こういう基本的な解釈がマチマチな事象は、他にもあります。
現在、SDカードのアクセスにあくせくしているわけですが、SPIの動作モードにも疑問点があります。例えばクロックに関しては、
 ・クロックの立上り時に読むのか、立下り時に読むのか
 ・アイドリング時のクロックは"0"か、"1"か
によって4つのパターンが想定できますが、それらをどう呼ぶか各社バラバラだというのです。詳しくはこちら↓
「SPIの罠」
(ここから引用、図はクリックで拡大されるはず)
罠はこのパターンの表現です。なんと各社全く違う表現をします。
以下の表が各表現の対応です。タイミング欄の赤点線の瞬間にデータを送受信します。
イメージ 3
 
つまり、仕様書には「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頁)と書かれており、次頁のタイミングチャートでその様子が示されています。
 
イメージ 4
 
イメージ 5
 
結局、SDカードのクロックは「通常時=1、カードへの書き込みは立下り、読み込みは立ち上がり」という、先の「SPIの罠」の表で言えば、mode2とmode3の混在と言えましょうか?
 
そう断言できればいいのですが、この本もけっこうアヤシイところがあって、一体何を信じていいのか猜疑心に苛まれながら、いまだにCMD0のエラーレスポンスが解消できないでいるのです(*´Д`*)
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

過去の記事一覧

最新のコメント最新のコメント

すべて表示

kik**41010
kik**41010
非公開 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

よしもとブログランキング

もっと見る
本文はここまでですこのページの先頭へ
みんなの更新記事