カメラモジュール(OV7670) SCCB通信

 (2020.12.19 作成)

 このページでは安価なOminiVision製カメラモジュールOV7670のマイコンとの通信に使用するSCCB通信について説明したいと思います。OV7670についてのページはこちらがトップです。

 OV7670はモジュールが約150円と安いため多くのサイト様で紹介されているのですが、その際SCCB通信はI2C通信と同じであると説明されていることが多いです。しかし管理人がやってみたところちょっと違うのでは?と思ったのでこのページで紹介してみることにしました。

接続仕様

 SCCB通信ですが、OmniVision Serial Camera Control Bus (SCCB) Functional Specificationという文書が出ているので詳しくはそちらを参照してください。

 この文書中にあるBlock diagramを見るとSCL(SIO_C)とSDA(SIO_D)はどちらもプルアップされていないことが分かります。

 オープンドレイン接続ではなさそうなのでI2Cとは違うのが分かると思います。

またSIO_D(SDA)にはI2Cでは使用されない抵抗が入っています。

 これは左図の様にプログラムでミスをした場合に貫通電流が流れる場合があるため、ICを保護する用途のようです。

 コントロールするマイコンSTM32F103の場合最大ソース電流が8mAなので3.3V/8mA=412.5Ω以上であればいいので、管理人は470Ωを入れてみたのですがここで紹介しているOV7670モジュールではプルアップ抵抗が接続されているためかうまく通信できませんでした。

通信仕様

 SCCBは通信仕様もI2Cに類似しています。下に送信プロトコルを示しますが最初にデバイスのアドレス(0x21)を送り、書き込みたいレジスタアドレスと値を続けて書くだけです。

 ただ注意したいとした点としては各フェーズの最後にあるXマークはACKではなく、Don't-Care bitです。一応Slave(OV7670)は0を示しているはずですが、下に示すように実際には0Vまで電圧は降下しません。

STM32マイコンでのSCCB通信

 上記のようなSCCBの仕様ですが、まず多くのサイトで紹介されているようにI2Cペリフェラルを使用して通信できると思って試してみました。その結果、ACKが戻ってこないというエラーが発生してうまく通信できませんでした。その際の信号を見てみたのが下の図です。

 左がロジアナの出力ですが、最後のACKビットが0になっておらず通信エラーが発生します。この時の通信をオシロで見たものが右の図です。

 見てもらってわかるように9番目のビットで0にまで電圧がっておらず、中途半端な電圧になっています。これはOV7670は0にしようとしているのに対し、モジュール基板に接続されているプルアップ抵抗が電圧を持ち上げられているのではないかと思います。もちろんこの時はSIO_Dには保護抵抗は入れていません。

 ペリフェラルの設定をいろいろと変えて頑張ってみたのですが、うまくSTM32F103のI2Cペリフェラルを使用してこの問題を回避することができませんでした。

 ということで最後は諦めてこちらで紹介しているソフトウェアI2Cを使用することでこの問題を回避しました。実際に動いた図が以下です。

 せっかくI2Cペリフェラルがあるのに使えないのは納得がいかず、いろいろと頑張ったのですが残念です。基板のプルアップ抵抗4.7kΩを変更するという手もあったのかもしれませんが、面倒なのでソフト対応としました。

コメント: 0