マイコン工作実験日記

Microcontroller を用いての工作、実験記録

SCCBとの相性

2011-12-14 23:46:47 | CMOSカメラ
先日のMTM07では、CMOSカメラもこっそりと(?)展示していたのですが、そのソフトウェアで気になっていた箇所があったので、ようやくとその部分を調査、修正しました。



その部分とはOmnivisionのCMOSカメラの制御用シリアルであるSCCBとのインタフェースです。SCCBはI2Cのサブセットみたいなシリアルなので、SAM3SであればTWIと接続して使用します。ところが、わたしはこれまでこのTWIとのインタフェースがうまくできずに、結局GPIOでソフト的にSCCBを制御していました。今回も以前作成したコードを流用したのでソフト処理だったのですが、この機会に再度TWIを使っての接続に挑戦することにしました。

今回もいろいろと試行錯誤があったのですが、ようやくとTWIを使っての制御ができるようになりました。要点としては...
  • レジスタへの書き込みは、TWIの通常の書き込みを使って行えた。PDCを使ってのDMA転送での書き込みも問題なくおこなえる。
  • 苦労したのはレジスタの読み出し。TWIの持つレジスタ番号を指定しての読み出し操作を利用するとNAKエラーになってしまう。デバイスのアドレスとレジスタの指定をする書き込みと、レジスタ内容を読み出す操作のふたつのフェーズに分けて処理することで読み出しできた。

ATMEL ARMのTWIでは、TWI_MMRレジスタ内に読み出そうとするデバイスの対象レジスタ番号を指定して、読み出し操作をおこなうことができます。この機能を用いると、マイコンがデバイスアドレス/レジスタの指定という書き込みと、レジスタの読み出しの二つの処理を連続して一度にやってくれるので、とても便利です。ところが、この機能を使うとほとんど必ずNAKエラーが発生してしまいます。SCCBでは転送の最終ビットがDon't Care Bitとなっており、ACKになっていないための影響だと想像できます。ふたつのフェーズに分けて処理をおこなうと、なぜかNAKエラーも生ぜずに読み取りがおこなえるようです。

コツをつかんでしまえば簡単なことだったのですが、何度も試行錯誤してようやくと得られた結果です。苦労させられたもうひとつの要因は、マイコン側とカメラ側でTWI/SCCBの状態不整合が発生してしまったことです。読み出し時の2つのフェーズの最初のフェーズでマイコン側がエラーを検出すると、その時点で処理が止まり、2つ目の読み出しフェーズの処理がおこなわれません。ところが、カメラ側は読み出しフェーズを期待して待っているようです。マイコン側が、再度読み出しに先立つデバイスアドレスとレジスタ番号を送っても(書き出しても)、読み出しを期待しているカメラ側はこれを受け付けなくなってしまうようです。残念ながら使用したOV7670カメラモジュールにはリセット信号が端子として出ていません。そのため、明示的に初期状態に戻すには電源の入れ直しが必要でした。ソフトを修正しても、カメラをリセットしないとちゃんと動かないということに気づくのに、エラく時間消費してしまいました。リセット端子が出ていればこんなに苦労しなくて済んだのになぁ。