いろいろ紆余曲折というかトラブルにまみれましたがとりあえず目的は達成。
I2C通信テスト
I/OエクスパンダーであるMCP23008-E/Pと12F675-I/PをI2C通信で設定をレジスタに書き込んだり、I/Oの値を読み込んだりする基本的な動作のチェックが完了。
CCS Cコンパイラの組み込みライブラリであるI2C関連の関数を使って記述していたのですが、どうも動作がおかしい状態が続いていました。
1)レジスタの設定が出来ない
MCP23008のレジスタへI2Cを用いて設定を書き込むのですが、どうも不安定。正しく書き込めるときもあると言う状態。ソース側で通信速度を落とすと解決する。
出力指定をしているピンが設定できていないのは、当該ピンがハイ・インピーダンス状態になっているため確認できていた。
2)I2Cバスの動作を確認すると落ちる
ロジックレベルを表示するプローブ(PICツールボックスに組込)をI2Cの通信を行っているピンに当てるとハングアップして止まってしまう。たぶんACK待ちをしていると思われます。
簡易ロジックテスターには微分回路を用いて、立下りエッジと立ち上がりエッジのそれぞれで点灯するLEDが付けてあり、一過性の信号変化を見ることが出来るようにしているのですが、一回瞬いてから動かなくなっていました。
I2Cで読み取りをして、12F675のピンに出力している分には問題ないので、データとクロックの信号線がバタついている可能性が高いと思われました。
3)高速通信ができない
低速の100kbpsでは普通に通信できるようになりましたが、400kbpsの高速モードで通信すると不安定というか正常に動作していないみたいです。
動作するように見えていたり止ってしまったりとかなり不安定。信号線の誤動作が予想されますがオシロのプローブを当てても状態が変化しますので捕まえづらい状態でした。
ブレッドボードでテストベンチを作っている状態を差し引いてもあまりにセンシティブ。
どうもI2Cのバスのプルアップ抵抗が小さいようです。当初3.3kΩをつけていたのですが、高速な通信をするためには引っ張り上げる力が足りないようで、1.5kΩに変更すると正常に動作するようになりました。
下位4bitを入力に、上位4bitを出力にして入力をそのまま出力側に出すテスト用のソフトウェアで無事動作を確認。
これで、I2C関連の動作はなんでも大丈夫だと思います。
ちょっとSPIとは異なる部分がありますが、基本的な通信プロトコルは似ていますので、他のデバイスのコントロールもテストしておこうかと思います。
動作しないのでなぜかと思うとI/Oエクスパンダーのリセット端子が浮いていて、ずっとリセットの状態のままだったりというトンデモトラブルもありましたが。
とりあえず、これでコントロールアンプの制御回路が組み立てられる状態になったといえますので、順次進めて行きたいと思います。
I2CとSPIは電子ボリュームやDACなどのデジタルオーディオのデバイスとは切っても切り離せないくらい採用されています。そのため、それらのデバイスをコントロールするためには必須の手段です。
ちょっと寄り道で電子ボリュームの操作を行う予定。
コメントする