« RasPiカメラ V2.1のCSI信号の詳細 | トップページ | RasPiカメラをFPGAにつないで、初めて信号が出た »

2017.04.19

RasPiカメラ V2.1のI2C操作方法

昨日に引き続き、RasPiカメラV2の使い方を調べています。今日はI2Cの信号やGPIOの信号をどう操作するかを解明しました。

まずRasPiカメラからSDA、SCL、GPIO1、GPIO0の信号を引き出して、それをプローブにつなぎます。

Raspicam_1

そして、カメラを起動したときのこれらの4種類の信号の波形をオシロでキャプチャします。

Csi39

こんな感じの信号になりました。黄色と青はI2CのSCLとSDAで、赤と緑がGPIO0,1です。GPIOが立ち上がる前からI2Cは動作しているように見えます。

解析してみた結果は次の図です。

I2c_1

I2Cの信号は、カメラ以外のデバイスにもつながっているようで、57Hzくらいの頻度で常に出ています。カメラを操作しているI2C信号は、GPIOが立ち上がった後に出ているもののみなので、GPIOより前の信号は解析しないでも大丈夫です。

また、差動プローブを使って高速差動信号とのタイミングも見てみます。

Raspicam_2

I2c_2

GPIOを立ち上げて、I2Cで初期化した後で、D0に信号が来ているのがわかります。また、毎回のフレームの間にI2Cのアクセスが入っていますが、これはアナログゲインやライン中のピクセル数などを設定しているコマンドが入っています。

さて、GPIOのタイミング等を詳しくみてみましょう。オシロで見たところ、GPIO1が先に立ち上がって、300ns後にGPIO0が立ち上がっていました。

I2c_4

このカメラ(Sony IMX219)のデータシートに記載されている電源投入シーケンスを見てみます。データシートはネットを検索すれば見つかると思います。

I2c_3

電源を投入して、クロックを入れてから内部のXCLRが解除されるまでに200usの時間がかかり、I2Cのコマンド設定受け入れまでに5.3msかかるらしきことがわかります。

また、XCLRの解除後、スタンバイモードを解除するまでに少なくとも6ms必要であることもわかります。

したがって、GPIO0はXCLRで、GPIO1はクロック許可か電源コントロールではないかと考えられます。

次に起動中に行われているI2Cのシーケンスを解析しました。

ざっくりと描くと次の図のようになっていました。

I2c_5_2


まず、GPIOを立ち上げた後、5ms待ってからIDCODEのチェックを行っています。

その後、ソフトウェアリセット、ソフトウェアスタンバイ状態の設定を行い、24ms待ってからレジスタ設定を行っています。

レジスタ設定が終わった後4ms待ってから、アナログゲインの設定などを行い、最後にストリーミング開始(スタンバイ解除)を行うというものでした。

レジスタ設定では、最初にこのようなシーケンスを実行しています。

I2c_6

ただ、このシーケンスは謎が多く、最初の6620,6621,6622,6623のレジスタはデータシートには存在しておらず、アクセスコマンドシーケンスは0Cと05が入れ替わっているなど、不可解な点が多くありました。

ネット上で検索すればSony IMX219のCドライバソースを見つけることができると思います。そういったものとほぼ一致していましたが、部分的に一致していない箇所があるので引き続き調査が必要そうです。

そして、PLLの設定を行ったあと、不明なレジスタをたくさん叩いて、最後にStreaming開始のコマンドを送っていました。

I2c_7

さて、これと同じのをFPGAで出せばよさそうですね。

希望が見えてきました。

|

« RasPiカメラ V2.1のCSI信号の詳細 | トップページ | RasPiカメラをFPGAにつないで、初めて信号が出た »

コメント

コメントを書く



(ウェブ上には掲載しません)




« RasPiカメラ V2.1のCSI信号の詳細 | トップページ | RasPiカメラをFPGAにつないで、初めて信号が出た »