使ったカメラ
OV5642使用500万画素カメラ M12レンズ付き B0020: カメラ 秋月電子通商-電子部品・ネット通販
使ったボード
STM32 Nucleo Board STM32F446RE: マイコン関連 秋月電子通商-電子部品・ネット通販
SCCBはI2Cに似ているが、今回はソフトで実装した。
バスは3.3kΩで吊ってる(今回使ったカメラにはプルアップは実装されていないっぽい)。
データシートとか読んでないので間違ったこと書いてる可能性大。
基本的に、ACKビットはSCKの立ち下がりエッジで開放される。
時々ACKビットが終わってもSDAが開放されず、Lowに固定される場合がある。
その場合、もう1クロック送ってやると開放される。
ある程度の時間待っても開放されないし、追加クロックではほぼ確実に開放されるので、、OV側でACKbitのクロックのエッジを取り逃してる?
当然、次の1バイトは破壊されるので、再送が必要(ACKクロックを取り逃してるだけなら、次のデータを送れば受け取ってくれる? 未確認)。
連続して大量のレジスタを書き換える場合は、なんとなく、1msec周期くらい開けて転送してやると成功率が高い気がする。
スレーブアドレスやデータの途中でNACKが帰ることがある。
適当な時間(5msec以上を目安に)開けて再送してやると成功する場合が高い。
複数回連続でNACKを返すときもある。
コンフィグでNACKやACK開放不良があったときは初期設定がうまくできない場合がある(破壊された画像が送られてくる)。
NACKの場合は比較的大丈夫な場合が多い気がする。
NACKやACK開放不良が1回もなくても(=すべてのパラメータが確実に送信できていても)破損画像が送られてくる場合がある。
パラメータ転送以外の問題?
STM32F446REは128KiBのRAMを持っている。
RTOSでDCMIで受けてPCに転送する、といった簡単な処理の場合、画像の保存に使えるのは100KiBくらい。
JPEGで転送した場合、VGAだと画像サイズは30KiB程度で、100KiBあれば余裕で入る。QVGAは100KiBだとまず足りない。
446RE単体で使う場合、VGAが限界かな? JPEGカメラっぽいモジュールを作るなら、FMCを積んだチップに外部RAMを接続する必要がある。
おとなしくフレームバッファ付きを買ったほうが楽そう。。