H8S/2212によるSDカードとVS1053bの制御実験

前回はEEPROMでポチ任せで妥協したけど!
次こそは自力でソフト作ってやる!ってことで、H8でSDカードからの読み取りと、VS1053bの制御を自力でやってみました。



10/11/28[sun] - なう・どぅーいんぐ
 とうとう始めてしまいましたこんな時期に
 「VS1053b H8制御実験」

 ちょこちょこ書いてた実験回路のパターン図が完成したので、昨日削ってきました。
 ヘッドフォン実装時の回路パターンは「ぽち氏」が書いてくれるそうなので、回路図丸投げ(ぁ

 パターン図はこんなかんじ↓
 
 塗りつぶし作業しながら、コア電源とI/O電源の電圧間違いを発覚したり、
 若干のパターン変更とかあったり・・・
 まぁ、大丈夫だろうと思って削り出し

 ぼちぼちと部品付けていって、今日完成
  

 付属回路のっけた全体図
 

 で!、さっそくコーディングに試みるも・・・
 DREQが上がってこないよ。LOWのままなんだが・・・



10/12/02[thu] SDカード通信試験再び

 DREQが上がってこない原因はクリスタル付近だった(ぁ
 コンデンサが12pFであるべきところを0.1uFを付けていた・・・
 つまり発振してなくて動作して無かったと

 でもってVS1053bとの通信試験にsin波出力テストを試みるも動かない・・・
 なんでや~といいつうH8/3694のハードウェアマニュアルを見てみると,
  >>「通信データの1 キャラクタは、LSB から始まる8 ビットデータで構成されます。(ry」
 (゜д゜;)
 つまり,1バイトのデータを送る際,3694は1ビット目から送るのに対し,VS1053は8ビット目から受け取るようになってる.
 このままだと「そこのデータを5にセットしてくれ」と言ったつもりが,「れくてしトッセに5をターデのこそ」って伝わる感じw
 ・・・なんか余計分かりにくいなw

 だったら,3694からはMSBで送ってやればいいんじゃないか,
 と,思っているあなた!
 ってなノリで3694をはじめ,300HTinyにはMSBから送れるようにするためのレジスタが無い!
 つまり無理だ

 まぁ幸いながら,送るべきコマンドは限られているので,
 無理やりにでもデータのビット列を反転させたのを定義しておてハードコーディングで済ませるのもアリかなぁと
 いやまぁ,反転させる関数を作るのも手なんですが,マイコンという限られたリソースを余分に使いたくないと思いまして.

 そんなやり方でとりあえず,VS1053bのレジスタのリードコマンドで,期待されるデータっぽいのが帰ってきたので,とりあえずは成功したのかな?
 でも,レジスタ0のデフォルトの返答が「0x0800」のはずなんだけど,「0x4800」が帰ってくる件
 (MSBをLSBで読んでるのでテスト表示とは違うが一応記述はデータシート準拠)
 マイク/ライン1選択のビットが1になってる・・・
 まぁ,他のアドレス(0x1)とか見てもVS1053からの返答は正しいっぽいのでいいか.

と,アドレス0の9ビット目の項目をみつけてしまった.
  >>「9 SM_SDIORD SDIビット順 0:MSbファースト 1:LSBbファースト」
 !?
 lこんな項目があったのか!と浮かれてる間に騙された・・・
 しばらくうまくいかず,データシートを見てて,
  >>「SM_SDIORDが"0"のとき,SDI上のデータはMSbファーストとみなされます.SM_SDIORDを"1"にすると,SDIデータのビットの並びを逆,すなわちビット0が最初でビット7が最後となる順番にできます.ただしバイトの並びは変わりません.またこの設定は
SCIバスには影響を与えません.」

 (゜д゜;)

 

 無駄に時間食ってしまった・・・
 ということで,反転ビットを定義するのは仕方なく妥協して,
 気を取り直して,sin波出力テストを試したら鳴った!

 やったよ~.やっと第一歩だよ~.

 続いて,SDカードの読み取り試験.
 前回,やったのはI/Oパタパタでの実装なので賞味使えない(ぁ
 でも,両方SCI使って受け渡しするより,片方I/Oで受け取って,SCIで渡したほうが効率良いんかなぁ?・・・
 まぁ,もう回路作っちゃったからいいやw

 SDカードをSPI,もといクロック同期式SCIで通信するのを再度試みるにあたって気づいたこと
 SDカードもMSBだよ (´д`;)
 どうせ,ここでビット反転したデータ受け取るなら,VS1053に送るときもそのままでいいよな・・・って
 反転設定いらなくなったよ

 仕方ないね,と思いつつコマンドテーブルを書き換えて,1バイト送信関数などをI/OパタパタからSCI用に変えて
 さて,初期化出来るか!?って試行するも・・・ダメー
 あ,ここでみのりんの例の画像ほしいな

 全然返答が来ないなーってやってて,ポチ氏が帰り際にSDカードの基盤部分チェックすると・・・
 ポチ「ああぁw繋がってないです」 麦粉「ちょwwww」
 クロックの線が繋がってなかったとかw
 あ,因みに,テスト回路基盤のパターンは自分でやったけど,
 SDカード部分と加工補助はポチ氏にやってもらった(ここ重要)
 まぁミスはあるさ,仕方ないね

 で,試してみたら,普通に返答来たw

 さて,ここからSDカードの初期化を実装していくわけだが,時間的に今日はこの辺で終わりかな
 今日一日の大半をこれに費やしてしまったな・・・



10/12/03[fri] 学位授与試験対策は大丈夫か?

 さて、SDカードと通信するために初期化の手順へ
 以前作ったI/Oで試みたソースをもとにSCI通信仕様に書き換え
 勿論、コマンド類はMSBからLSBに反転

 と、CMD0のリセットは出来るものの、CMD1のレスポンスが0x05となんか変・・・
 レスポンス内容的には「コマンドが変」?ってことなんだが・・・
 錯誤しながら、前のソースを見直してみると、コマンド処理の後に、1バイトの「ダミークロック」を送っていた
 そういえばそうだった。
 なんか、同期がズレるとかなんとか
 そしたら難なく出来て次はセクタの読み込み

 MBRの読み込みは成功?
 受信データが何か変やなぁと思ってたらバイト反転してるの忘れてたwww
 アドレス計算とかするときには反転してからでないと出来ないので、結局、バイト反転の関数を作ることに・・・
 でも受信データ全部反転してたら、無駄に遅くなるので、必要なところだけ

 で、いけったっぽい・・・・んやけど、BPBっぽいデータに辿りつけない・・・
 MBRからBPBのセクタ値を参照して、バイト反転して、0x200(512)を掛けてセクタを算出
 その値でCMD17でーと思ったら、CMD17で読もうとするときにまた反転せなあかんのやったwww面倒いなぁ・・・
 それでやってみたもののBPBのあるところにあるはずのファイルシステムの情報が無い・・・
 MBRの fileSystemDescriptorの値が0x0eとか・・・・
 SDカードフォーマットしても駄目
 試しに別のSDカード使ってみたらいけたw

 ちょっと調べてみたら
  >>「AT32は無視するとしても、この0x0eが曲者です。実は、Windows XPなどで容量の小さなSDカードをフォーマットすると、実際にはFAT12でフォーマットされているにもかかわらず、fileSystemDescriptorは0x0eになります。そのため、実際にはこのフィールドだけではFATの厳密な種類を判別できません。」

 (゜д゜;)

 なん・・・・だと・・・・
 読み込み試験に使ってるSDは秋月で100円で買った8MのSDだった・・・・
 なるほど。そういうことか

 あとはファイルを読み出すだけなんだが、前回のは使い回しが良いようにってほど作りこんでないので、ここで纏め上げなければならない
 しかも、クラスタとか気にしてなかったが、今回はちゃんと考慮しなければならない・・・
 音楽を鳴らすまではもう少し時間かかるかな・・・



11/02/05[sat] プロジェクトスタート
【電子回路】
 やっと始まりましたよ
 H8S/2212でで色々しちゃいますよ
 まずは,実験回路の作成
 今回はポチ氏も協力してくれるので非常に頼もしい(主に回路側のみ)
 一人で全部やると途中で萎える・・・・

 まずはハードウェアマニュアルを参照して回路図の作成
 参考文献が無いのが手厳しいところ
 大体できたらポチ氏に渡してパターン図と基盤加工してもらって
 書き込みテストかな.まずは



11/02/05[sat]への本記事編集時の追記
 事の発端はH8/3694ではSDとVSとのSPI通信で不具合があることと、
 「H8SがUSB付きで安い」ってのをポチが見つけたことによる
 「これでUSBホストもできますね」って勢いだけで購入(してもらった?w)

 以後、H8/3694を改め、H8S/2212で開発することになったとさ



11/02/16[wed] 終了t・・あっ違(ry 修了とまとめ④
 H8S/2212の実験回路で色々
 そういえば、関東出発前に回路が出来て、書き込みが出来ないとか何とか
 出発後にポチ氏が色々やっててくれたみたいで、
 まず、買った2212はSCI書き込みが出来ないと
 で、実験回路のUSB周りが不具合あったと(回路修正済み)
 でで、Windows7(x64)では無理と
 とのことで、デスクトップPC(おべべさん)を学校に持ち込み
 いつものUnknownHardwareErrorの青画面、他が出ることなく一発起動
 やはり寒いのが原因だったのか

 でもって開発環境整えてやってみて書き込み成功
 さて、色々ゴリゴリ出来るか?



11/02/26[sat]
 H8/2212再始動
 二度目以降の起動の動作がおかしいのはFT232が原因だったようで
 どうもFT232から電流が漏れてるというか、それのせいで電源を切ったつもりでも絶妙に切れてなくて再起動したつもりで前回の続きだったと
 試験回路やからしゃぁないかなぁ
 後付部品とかもごちゃごちゃ増えてきたし、仕様が固まったところで作り直してもらうのも視野か・・・

 とりあえず、挙動がおかしい原因が分かったので、今度はVS1053bとの通信を目標
 帰省までに音楽鳴らすところまでいけるかな・・・?



11/02/27[sun]
 お前もここでつまずくか・・・・2212ェ・・・
 クロック同期SCIからクロックが出ない・・・いや、出力されない

 ハードウェアマニュアルであっち見たりこっち見たり・・・
 この見方だと本で欲しいな・・・

 とりあえず、経緯風まとめ
 ・SCI2とSCI0はちょっと違う。というのもSCI0は高速UARTとか括弧付けされてて機能が拡張されている
 ・SCI0はTPUから転送レートがジェネレートできる。けどこれは調歩同期の話。クロック同期には関係なかった。
 ・クロック同期のとき、SCIセレクト機能なるものがある。これは2212がスレーブのときにIRQ7のピンをチップセレクトの機能を持つというもの。結果的にはこれも原因じゃなかった。(デフォルトで設定は無効)

 じゃぁ結局原因は何だったのか・・・
 答えは、TDREのクリアだった
 よくよく見ると、ハードウェアマニュアルの送信手順のフローにも書いてた
 (ずっと初期化が原因ではないかと思ってたので見てなかった)
 3694のハードウェアマニュアルと見比べて判明した
 TDREはTDR内の送信データの有無を示すレジスタ。0の状態がTDRにデータがあり、未送信状態である。
 つまり、0にしてロックすることで(自己解釈)送信が開始されるということではないだろうか。

 H8/3694では
 [クリア条件]
 • 1 の状態をリードした後、0 をライトしたとき
 • TDR へ送信データをライトしたとき

 H8S/2212では
 [クリア条件]
 • TDRE=1 の状態をリードしたあと、0 をライトしたとき
 • TXI 割り込み要求によりDMAC でTDR へ送信データを転送したとき

 上記を見比べると、3694ではTDRにライトした時点で自動的にTDREは0にクリアされるが、2212では手動でクリアしないといけないようだ。

 まさかそんな罠とは・・・・



11/03/02[wed] ノンストップ鼻水・・・これは、風邪!?
 今日もH8充実
 が、しかし、SDカードのアクセスに試みるも出来なくなった・・・
 CMD17でレスポンスが変な、過去には無かった新展開
 まぁ、過去の試みとは違い、H8/3694→H8S/2212であるのと、I/Oパタパタアクセス→SCIクロック同期、を使っての近いだけど、やっぱそこなんかなぁ?

 CMD0送る・・・
 →40 00 00 00 00 95 ff ff
 ←ff ff ff ff ff ff ff 01
 レスポンス 0x01 OK

 CMD1送る・・・
 →41 00 00 00 00 f9 ff ff
 ←ff ff ff ff ff ff ff 00
 レスポンス 0x00 OK

 CMD16送る・・・
 →50 00 00 00 00 00 ff ff
 ←ff ff ff ff ff ff ff 00
 レスポンス 0x00 OK

 CMD17送る・・・
 →51 00 00 00 00 00 ff ff
 ←ff ff ff ff ff c1 3f ff
 レスポンス・・・・・え?

 どういうことなの?
 c1 3fって何?レスポンスですらないよ
 ちょっと調べてみたけど、手がかり無し・・・

 今日はもう休もう・・・



11/03/02[wed] short型が1byteと思っていた時期が私にもありました。
 まさに今!
 どうしてだろう・・・intより小さいという固定概念が生んだ悲劇だったのか・・・
 確かに32bitCPUなら、int=4byte、short=2byteなんだけど
 int=2byteだとshort=1byteという勘違いをしていたようだ

 マイコンだもんね。16bitCPUだもんね。
 ”char型に整数とか入れるのはよくない”ってのをどっかで聞いて、暗示されていたのもあるかもしれない・・・
 それで、char型を避けてshort型を使ってKO☆NO☆ZA☆MAというわけですね。
 1byteの型が使いたかったら、unsigned charを使えってことか。そういうことか、理解した。

 ってことで、
 sizeofで配列の個数を取得しようとしていたところが駄目だったっぽい。
 1byte1個の前提で個数を取得できるってことやね。
 コマンド配列をshort型にしたことによって、1個2byteとなって2倍の長さ(勿論コマンド配列の外)を送っていたと

 逆に考えると、CMD0、CMD1、CMD16が通ったのが偶然だったのか、許容範囲だったのか

 ついでだったんで、H8S/2212でHEWでの型のサイズを調べてみた
 
サイズ[byte]
char 1
short 2
short int 2
int 2
long 4
long int 4
long long 8
void* 4
int* 4
char* 4

 なるほど。ポインタ型は全部4byteか。long long が使えたのが意外だった。

 あと、調べてて見つけたのが、
 char型はsignedか、unsignedか決まっていないらしい。処理系依存だとか。

 さて、とりあえずセクタダンプまでできたので次はFATファイルシステムの管理か・・・
 まずはFATの構造についておさらいしないと



11/03/04[fri]
 さて、また途中で難はあったけど、とりあえずSDカード、FATファイルシステムのルートディレクトリエントリまでたどり着きました。
 これで、前回I/Oパタパタで出来たところまで追いついたわけです
 ローレベル部分のコーディングが安定して、それらを使って色々出来てくるとワクワクしてきますね。
 (OS上のソフト書いてるのと比べたらまだまだ根底のコードですががががggg)
 Chris氏とかはローレベルのをガリガリ書くのが好きってまえに聞いた気がするけど・・・どうなんだw
 個人的には上位層を、使えるものは使って、手っ取り早く目的のものを実装するほうが好きですね。

 さぁ・・・ここからが本当の地獄だ・・・
 いざ、未開拓の領域へ。FATファイルシステムのファイル管理の扉を。
 まだ、クラスタ間移動とか、アドレス変換とかまだまだですけどね・・・
 変数の管理とか、グローバルなのかローカルなのか、それとも構造体にするのか決まってない状態です。
 この辺結構悩みますね。下手すると後から面倒なのでこの辺は嫌いです。



11/03/06[sun]
 よーし、きたよー
 とりあえず今日の成果は、指定クラスタ(ファイルの頭)から、FATをたどって1ファイル読み出す所まで出来ました
 今は、ファイルシステムの構築より、1ファイル読み出してVS1053bとの連携を構築するのが先です
 クラスタの桁が上がる境界値のバグが怖いので、明日その実験してからですかね。

 それはそうと、昨日ポチ氏に実験回路の不具合修正版を作ってもらいました
 Ver2ですよ、奥さん!
 諸不具合の修正と、利便性を図った再デザイン仕様ですよ

 ↓ こっちは旧版の実験回路
 
 H8/3694でのSD & VS1053b実験回路をそのまま使ってるので配線が㌧㌦状態です
 USBケーブル2本出てるけど、黒いのは書き込み(又は、USBデバイス開発)用、
 白いのはUSB-シリアル変換を通してのハイパーターミナル接続のデバッグ用

 ↓でもって新実験回路
 
 あえて、大きくすることで、使いやすさを重視(ってお願いした)
 MDピン設定もどうせブートとシングルチップモードしか使わないので一括化
 あとはFT232周りの不具合対策とかとか

 しかも、ご丁寧にグリーンレジストまでしてくれたが、スプレーの出来が悪いのはご愛嬌
 こいつはUSBでプログラムを書き込む(っつかUSBしか無理だったってオチ)ので、ついでに電源ももらって外部電源いらず。
 これなら自宅に帰っても開発できるね!やった!
 でも画面が小さいのは窮屈やなぁ・・・



11/03/21[mon] 告知してませんでしたが・・・
 VS1053b手ごわい・・・
 以前から進展なし
 SCI_CLOCKFのマルチプライヤを設定すると0になる現象について助言も求む・・・
 改めて色々試してみたけど、0x0800、0x1800と、下位8bitの操作は可、0x2800、0x8800、0x9800他、MULTのビットを操作すると不可
 どういうことなの・・・

 他、
 sdiテストはいけるし、コマンドのレスポンスも正しい
 HDA0と1の値もMP3再生中なような値でてるし(時々0になる)
 大量のデータ連続送信のときに何があるのか
 送り方が悪いのか・・・



11/03/30[wed] 神奈川生活Lv1
 それはそうと、引越し後落ち着いて開発再開しようと思ったら挙動がおかしくなった
 SDを読んでくれない?
 テスターで通電試験したら繋がってなかった・・・

 再はんだし直しついでに、ポチの助言で
1.8Vレギュレータの出力にコンデンサ増設してみた
 一応、出力は1.78Vと問題はなさそうなんだけど念のため

 で、起動してみたら一瞬だけ鳴った!
 一瞬、ほんの1秒ほど
 もしかしたらクロック設定のマルチプライヤが1倍だから速度が足りないのかと思い、設定し直したらクロック設定できるようになったよ!
 しかもちゃんと再生してる!

 ってことは、やはり原因はハード側だったのか・・・
 ビットレートの高い曲だと、途切れるので、SPIの通信速度上げたら案の定通信できない
 やはり、配線が長いのが駄目なのか・・・
 大学の工房が使えるようになったら、新設基盤作るか
 でもライセンス要るからちょっと時間かかるかな



11/05/08[sun] 事後報告
 とりあえず、一通り通信実験はで来たので一区切りつけます
 というか、完全に忘れてたwwww

 その後というものの、
 ソフトウェア部分は、仕様としてルート直下の「MUSIC」フォルダのみに音楽ファイルを入れるとして
 全曲データの配列化とか、再生・停止、NEXT、BACKとか実装してみた
 ハードウェアは拡張基盤を新たに作って、通信速度は上げれたけどそれでも足りなかった・・・
 500kbps
 500kbpsもあれば十分とは思ってたんやけど、1つの通信線で「データ取り込み」→「データ送出」を繰り返してるから必要ビットレートは普通に倍は必要なわけやね・・・
 とのことで、SCIデバッグをやめて、SCI2本使ってうまいことやったら500kbps以内でも十分なんじゃないかと
 きっと本番基盤ならICも近いしもっと速度出すことも可能やと思うし
 (eeprom版はSDから直接データ送ってるんやろうけど・・・セクタ未満のアクセスでもしてるんかな・・・?)
 ってことで、本実験はここで切り上げて、本番基盤が出来たときに新たにレポートしようと思います
 
その前にヘッドホン買う金が無い(←




【参考文献】
 VS1053b 日本語データシート私家版/(課後の電子工作)

 FAT FS フォーマットの実装についての覚え書き/(KabaVM System)
 SDカードドライバの設計(2)/(Resilient Mind)