H8/3069FのMMCインタフェースがやっと動く
実にくだらないところが原因 (11/26/08)
この夏からの懸案だった秋月のH8/3069LANボードのOS(MES)で、MMC(SDカード)インターフェースが動かない問題がやっとのことで解決した。OSのバージョンの問題もあったのかもしれないが、最終的な原因はここに書くのもためらわれる基本的でお粗末な原因だった。これを読んでも余り参考にならないと思うが、まあトラブルシューティングのケーススタディとしては少しは役に立つかもしれない。
ネット関係のマイコンでは、AVRのMega168で作ったプリンタ電源の遠隔制御が、あれから全くトラブルなく快調に稼動を続け子供たちから喜ばれている(階段の往復が一回で済む)。お父さんも鼻が高い。一方、このH8ボードは余り計画性なしに買ったマシンで、イーサネットインターフェースと2MBのRAMはついているが、Linuxを動かすには少し力不足で、イーサネットはそのうち雑誌の付録マイコン(インターフェース誌2008年7月号)にもついてきたので、H8の立場は微妙になっていた。
H8の汎用ボードを作ったときも、SDカードスロットは作りこまず、ブレッドボード用のSDカード基板を流用して、基板にはそのソケットしかつけていない。結果としてはこれが良くなかったのだが、SDカードにこだわったのは、家庭内の小さなWebサーバーにするにしても、テキストだけでなくちょっと気の利いたテキスチャーを張った背景をつけたいとか、フラッシュメモリの書き込み制限が100回と少ないので、TFTPなどで起動のたびにプログラムを送らなくても良いように、独立の不揮発性の記憶装置が欲しかったからなどの理由である。
しかし、こいつは最初どうしても動かず、クロックのクリスタルを20Mhzから25Mhzに換装するまで棚に放置されていた。クリスタルは表面実装でこの取り外しは、前の記事に詳しくあるように難儀を極めた。ちょうどフラックスが接着剤がわりになってクリスタルの背面シートが基板に固着しているうえ、ランドが大きく、サンハヤトの低温半田でも一部が溶け切れずランドをはがしている。ウェブで「H8」で検索すると、同じことをしてボードをおしゃかにした人の報告があったりして苦笑いである。
そもそも換装したのは、MMCが安定稼動しているという古いカーネルを入れるためである。あれだけ苦労したのだから、意地でもMMCは動くようにしなければいけない。しかし古いカーネルに取り替えても、MMCは頑として動かない。ロジアナでシーケンスを追うと前と同じ、カードの初期化がすむのを延々と待っている。
H8とMMCとのハード接続は、いくつかの回路例がウェブに載っているが余り大差はない。こちらのSDカード基板はchaN氏の記事そのままの回路に、3ステートバッファーの74VHC126を追加してレベルシフトしているが、ウェブではインバータや、NORの石を使って3.3Vと5Vのレベルシフトをやっている。デジタル的には全く変わりがない。しかもSDカードからはレスポンスが返っているので誤配線は考えられない。その証拠に、ブレッドボードに残したAVRのSDカードシステムでは問題なく稼動する。
回路に問題がないとはいえ、ウェブとソフトが同じなので、ハードしか考えるところがない。プルアップ抵抗を、SDカードまわり(3.3V)からH8(5V)に移したり、AVRの回路図ではクロックがプルダウンされているのをプルアップにしてみたり、パスコンを大きくしてみたり、まあ、考えられる変更はすべてやったが、やっぱり動かない。
途方に暮れて、こうなったら別のインタフェースをインバータで作ってみるかと、これまで色々いじったSDカード基板をすべて元に戻し、念のためAVRで動作確認してみたら、今まで動いていたSDカードアクセスが急に動かなくなった。半田付け?このあいだの半田ボール?いや、大丈夫。ロジアナを引っ張り出す。あれあれ、H8と同じように初期化でreadyが戻っていない。うーむ、これはH8のときと同じ現象だ。これは何かにおうぞ。
おや、SDカードの電源をFETでコントロールするピンの配線がブレッドボードにない。いやこれは前からなかったような気がする。うーん、思い出せない。電源制御のFETのゲートは無接続で動くはずだ。念のため、ソースコードで確認する。うわあ、えらいことだ。電源ONはLowだ。H8のボードはここをどうしている。あーっ、何もしていない。これではSDカードの電源が入らない。しかし、入らないなら何故、レスポンスをかえすのだ。とにかくブレッドボードのジャンパーでピンをグランドに落としてAVRを動かす。問題なく元に戻った。これだ!
電源が入っていないのに動く理由を調べているときではない。とるものもとりあえず半田ごてに電気をいれ、H8ボードのピンをグランドに落とし、SDカード基板を移す。あせる手で、コンソールに「mount mmc1」とこれまで何百回も入れたコマンドを入力した。
アクセスランプが点き、エラーなしでプロンプトが返ってくる。やった。動いたようだぞ。「cd /mmc1」を入れる。これもエラーがでない。どきどきしながら「dir」を入れると、やった、やった、差したSDカードのファイルリストが表示された。これ、これ、この夏から、夢にまで見た、H8でSDカードがつながった瞬間である。いやあ、長かった。苦労すればするほど喜びは大きいというが、電子工作での久しぶりの感激である。
人間と言うのは因果なものである。楽しみだけでは人生は愉快に送れない。古いカーネルを入れてMMCが動かないときは、今やっていることだけでなくこれまでの人生すべてが無駄なことのようにみえて、自分の越し方行く末を暗い気分であれこれ考えていたのだが(いや、根が躁鬱なだけかも)、動いたとなると世界が一変して、まるで天下をとったような爽快な気分になる。アルコール中毒者が酒を飲むとそうなるらしいが、その意味ではこちらも少し中毒気味なのかもしれない。
大丈夫と思ったところが危ない(11/27/08)
浮かれる気分はともかく、今後の課題として今度の騒ぎを整理してみた。まず原因は明らかで、SDカードの電源を制御するピンの勘違いで、グランド(電源OFF)、オープン又はHigh(電源ON)だとばかり思い込み、その配線をしなかったため、SDカードの電源が不安定になったことである(測ってみたら2V以上あった)。こんな基本的なミスが気がつかなかったのは、不安定ながらも、SDカードがコマンドにレスポンスを返したため、ここでのチェックを怠ってしまった。ブレッドボードでは恐らくグランドに落とすジャンパー線があったのだろう。それが、SDカード基板の接続替えのときか何かのときに偶然はずれ、AVRでも動かなくなった。
しかし、H8でも、AVRでもこの状態(ゲートが浮いた状態)で、SDカードが初期化コマンドにレスポンスを返していることは、ロジアナで確認している。このレスポンスを見る限りでは、最新バージョンのMESのカーネルでも動いた可能性がある。 それはともかく、直接の原因はこの際、余り問題ではない。ここは本来、グランド(0)か、Vcc(1)でなければならず、無配線というハイインピーダンスの状況を追求してみても仕方がない。言えることは、これまでに何度も書いたようにデバッグの極意「デバッグは外へ、外へ」という教訓を忠実に守らなかったことである。
システムは膨大な要素で成り立っている。ひとつの要素が故障しているかどうかを確認するときは、普通、他の要素は正しく動いているという前提がなければ先に進めない。しかしトラブルは必ずしもその要素にあるとは限らない。プログラムのデバッグなど最たるものだ。問題だと思うルーチンのロジックをいくら念入りに調べてもだいたい解決しない。大抵は他のところに原因がある。
これが、デバッグは外へ、外へと言う所以なのだが、今回はロジアナでカードのレスポンスを見たために、すっかりこの教訓を忘れてしまった。昔、ソフト開発の参考書を執筆したときに「絶対はありえない。変数より定数を疑え」などと偉そうなことを書いていたが、今回は正しく「SDカードは正常に動いている」という前提が間違っていた。お恥ずかしい。
すべての前提を最初から疑い、ひとつひとつ複数の手段でその前提を確認して行ったらここまで解決が長引くことはなかったのではないかと思う。まあ、それにしても偶然ブレッドボードのジャンパー線がはずれたからAVRで動かなくなり解決の糸口が見つかった。もし、これがなかったらH8ボードは再びお蔵入りになっていたかもしれない。
閑話休題。OSのMESのことである。小さなシステムの小さなOSだから多くは期待していなかったが、プログラムのロード以外にコマンドが何もないのに困った。欲しかったら自分で作れということなのだろうが、ネット関係はTFTPが動いたりそこそこ揃っているのに、ファイルの操作や、プロセスの管理はないに等しい(ファイルのdeleteがあるだけ)。一旦プロセスを動かすと、リセットしない限り止める事が出来ない(killがない)。
それに開発元が、H8についてのサポートを打ち切ってしまい、このあいだソースの提供を電子メールでお願いしたけれど、今になっても全く音沙汰がない。一部のサイトには、デバイスドライバーの開発法が出ていたりして何とかコマンドの追加は出来るようだが、折角、MMCが動いたのに先行きが余り見通せなくなってきた。
今、考えているH8での開発イメージは、シリアルコンソールをいちいち繋ぐのではなく、Telnetあたりからシステムを操作し、ウェブページの送り込みやHTTPサーバーの再起動、CGIによる別プロセスの操作などをやりたいのだが、相当量の作りこみが必要な感じである。それならもうちょっと汎用性の高い、TOPPERSプロジェクトのμITRONでも試してみようかと思う。
本来は、ネットワークとサーバーをどう、何のために使うか具体的に決めてから始めて、次にシステムを考えるべきなのだが、機械の方が先行してしまうのは、これはお遊びだから許してもらおう。まあ、世の中のプロジェクトだって余り威張れたものではないが。
| 固定リンク
| コメント (0)
| トラックバック (0)
最近のコメント