こんにちは。umetsuと申します。
RX72NのPDC(パラレルデータキャプチャ)を使用するために、動作を調べていて気がついたので、投稿しておきます。
現象
PIXCLKが入力されていない状態で、R_PDC_Open()を呼ぶと失敗します。更にこの状態で、PIXCLKが入力されている状態でR_PDC_Open()を呼び出しても失敗します。2回目以降の失敗要因はPIXCLKとは別の要因のため、使用時に注意が必要になります。
発生するしくみ
わかりにくいので要約すると R_PDC_Open処理がパラメータチェック ↓ハードウェアロック試行 (2回目以降はここで失敗。PIXCLK入力状態に関係ない) ↓初期化処理 (初回呼び出しはここで失敗。PIXCLK入力状態に依る) ↓終了ということです。
問題になるケース
対処方法
外部のカメラ(等)から信号を出すようなってから、R_PDC_Open()を呼び出します。または、下記のようにしても、ロックによる失敗の問題は回避できるようです。
static int open_succeed = 0; :if (open_succeed == 0){ if (R_PDC_Open(&s_pdc_config) != PDC_SUCCESS) { R_BSP_HardwareUnlock((mcu_lock_t) (BSP_LOCK_PDC)); } else { open_succeed = 1; }}
ただ、FITモジュール内で持っているis_opendの変数と、上記のopen_succeedが同じような意味合いになるところと、FIT内でやっているR_BSP_HardwareLock()の後始末的なUnlock呼び出しをAPI呼び出し側でやるところが、美しくないなあと思います。
その他
R_PDC_Open()が失敗したなら、R_PDC_Close()を呼べばR_BSP_HardwareUnlock()が呼ばれそうに思いましたが、FITドライバ内のis_opendがtruenになっていないため、アンロック処理は呼ばれません。ハードウェアロックし、失敗するとアンロックしないで抜ける構造は、他のFITドライバにもありますが、外部要因で失敗しないので、問題にならないようです。
個人的にはFITドライバの方が、生成コードに手を入れなくて済むので好きなのですが、CGドライバが出てくるのを待った方がいいのかもしれません。RXクラスのマイコンで画像データを扱うのは(メモリ的に)結構厳しいので、PDCのCGドライバが出てくるのを待つのは厳しいかもしれないですが。