- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
サンプルコードのfx3_uvc.cyfxを改造しての使用を考えています。
プログラム的にはカメラモジュールをUSBに変換するようにしたいのですが、
サンプルには無いクロックとスタンバイ信号を制御する必要があります。
GPIF IIで上記の信号の追加を回路に合わせてしたのですが、何処のコードを
触ればいいのか不明です。
初歩的な質問で申し訳ないですが、ご教示ください。
解決済! 解決策の投稿を見る。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
NCM03-Vのデータシートを見てみた限り、MCLKとSTDBY信号はInputだったので、FX3からクロック信号とスタンバイ信号を出力すると認識しました。
それを前提に以下記述しております。
★任意の信号(STDBY信号)をFX3から出力する
GPIO21に割り当てたSTDBY信号は、CyFxUVCApplnInit()内で、FX3からの出力信号として定義し、出力値をLOWに固定するのが良い方法と思われます。
以下、コード例です。
GPIO 21からLOWを出力(Overrideを利用) |
---|
/* Override GPIO pin */ apiRetStatus = CyU3PDeviceGpioOverride (21, CyTrue); if (apiRetStatus != 0) { CyU3PDebugPrint (4, "GPIO Override failed, Error Code = %d\n", apiRetStatus); CyFxAppErrorHandler (apiRetStatus); } /* STDBY GPIO is the Sensor reset pin */ gpioConfig.outValue = CyFalse; // Set to Low gpioConfig.driveLowEn = CyTrue; gpioConfig.driveHighEn = CyTrue; gpioConfig.inputEn = CyFalse; // Set as Output pin gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR; apiRetStatus = CyU3PGpioSetSimpleConfig (21, &gpioConfig); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "GPIO Set Config Error, Error Code = %d\n", apiRetStatus); CyFxAppErrorHandler (apiRetStatus); } |
★CLK信号をFX3で作成し出力する
GPIO23のMCLKは、CyFxUVCApplnInit()内で、FX3からの出力信号として定義し、27MHzに近い疑似クロックを生成するのが良いかと思います。
SYS_CLKが403.2 MHzで動作しており、GPIO blockは、fastClkDivで2を指定することで、SYS_CLK/2 = 201.6 MHzで動作します。
このfastClkから、27MHzに近いクロックを生成します。
GPIOには、Simple GPIOとComplex GPIOがあり、Complex GPIOではPWMが利用可能です。
適切な周期を設定し、PWMのduty比を50%にすることで、擬似的に27MHzに近い信号が生成できます。
27MHzの1クロックサイクル:1/(27 * 10^6) = 0.037037 μs
fastClkの1クロックサイクル:1/(GPIO fast clock frequency) = (1/201.6) μs
fastClkから27MHzに近いクロックサイクルを算出するためにperiodに7 (8-1)を設定する:(8*1*10^-6)/(201.6) = 0.039683 μs = 25.2 MHz
計算式は以下のとおりです。
・SYS_CLK frequency = 403.2 MHz
・GPIO fast clock frequency = (SYS_CLK frequency)/2 = 201.6 MHz
・One clock period = 1/(GPIO fast clock frequency) = (1/201.6) μs
・gpioComplexConfig.period = (Desired PWM waveform period/One clock period)
以下のKBAに同様の説明がございます。
Calculating PWM Period and Duty Cycle in FX3 – KBA226759
コード例としては、以下のようになります。
GPIO23から任意の疑似クロック信号を出力 |
---|
/* MCLK is the 27MHz Sensor clk */ CyU3PGpioComplexConfig_t gpioComplexConfig; gpioComplexConfig.outValue = CyFalse; // Set to Low gpioComplexConfig.driveLowEn = CyTrue; gpioComplexConfig.driveHighEn = CyTrue; gpioComplexConfig.inputEn = CyFalse; // Set as Output pin gpioComplexConfig.pinMode = CY_U3P_GPIO_MODE_PWM; gpioComplexConfig.intrMode = CY_U3P_GPIO_NO_INTR; gpioComplexConfig.timerMode = CY_U3P_GPIO_TIMER_HIGH_FREQ; // Use the GPIO fast clock for generating the PWM gpioComplexConfig.timer = 0; gpioComplexConfig.period = 7; // Set the period to 8 timer ticks (8*1/201.6 us) ~= 0.039683us -> 25.2 MHz gpioComplexConfig.threshold = 4; // Set the threshold such that the duty cycle is 50% apiRetStatus = CyU3PGpioSetComplexConfig (23, &gpioComplexConfig); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "Complex GPIO Set Config Error, Error Code = %d\n", apiRetStatus); CyFxAppErrorHandler (apiRetStatus); } |
Complex GPIOもOverride出来ますが、今回は予め CyU3PIoMatrixConfig_t でEnableしておきました(上記例にはその記述はありません)。それを含め、AN75779ベースでサンプルコードを作成したので添付致します。参考にしていただけましたら幸いです。
GPIOについての詳細が書かれたマニュアルとしては、FX3 Technical Reference Manual (C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\doc\firmware にあります) の"8.9 GPIO"が役立ちます。
GPIOの使い方についてのサンプルコードとしては、以下の2つが役立ちます。
C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\firmware\serialif_examples\cyfxgpioapp
C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\firmware\serialif_examples\cyfxgpiocomplexapp
よろしくお願い致します。
Hirotaka Takayama
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
AN75779のサンプルをダウンロードし、ご利用いただいていると認識しております。
現状としては、GPIF II DesignerのInterface Definitionで信号を追加した状態ということでしょうか。
スタンバイ信号はFX3から制御したいということでしょうか?(FX3から信号を出力し、カメラ側がそれを受け取る)
その場合、Interface Definitionで指定したGPIOピンをFX3ファームウェア上で制御できます。
AN75779のサンプルだとFX3からの出力信号としてGPIO22を利用しています。
SENSOR_RESET_GPIOという名前でsensor.hにて宣言されており、uvc.cで使用されています。ご参考になれば幸いです。
また、Firmwareのサンプルコードは以下のフォルダパスに多数ございますので、こちらもご参考になるかと思います。
C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\firmware
やりたいことを詳細にご連絡いただければ、もう少し具体的なご提案が出来るかと思います。
よろしくお願い致します。
Hirotaka Takayama
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
日本ケミコンのNCM03-Vの接続をします。
GPIO23にMCLKに接続
GPIO21にSTDBY信号を接続しています。
(GPIFのコンフィグレーションで上記割り当てもしています)
MCLKはMAX27MHzを出力する必要があり、STDBYはアクティブHighでの出力が必要です。
通常スタンバイモードにはしないので、STDBY信号はLOWのままでOKです。
上記の処理を追加するにはどのようにしたらいいでしょうか?
できるだけ詳しく教えて頂けると助かります。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
NCM03-Vのデータシートを見てみた限り、MCLKとSTDBY信号はInputだったので、FX3からクロック信号とスタンバイ信号を出力すると認識しました。
それを前提に以下記述しております。
★任意の信号(STDBY信号)をFX3から出力する
GPIO21に割り当てたSTDBY信号は、CyFxUVCApplnInit()内で、FX3からの出力信号として定義し、出力値をLOWに固定するのが良い方法と思われます。
以下、コード例です。
GPIO 21からLOWを出力(Overrideを利用) |
---|
/* Override GPIO pin */ apiRetStatus = CyU3PDeviceGpioOverride (21, CyTrue); if (apiRetStatus != 0) { CyU3PDebugPrint (4, "GPIO Override failed, Error Code = %d\n", apiRetStatus); CyFxAppErrorHandler (apiRetStatus); } /* STDBY GPIO is the Sensor reset pin */ gpioConfig.outValue = CyFalse; // Set to Low gpioConfig.driveLowEn = CyTrue; gpioConfig.driveHighEn = CyTrue; gpioConfig.inputEn = CyFalse; // Set as Output pin gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR; apiRetStatus = CyU3PGpioSetSimpleConfig (21, &gpioConfig); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "GPIO Set Config Error, Error Code = %d\n", apiRetStatus); CyFxAppErrorHandler (apiRetStatus); } |
★CLK信号をFX3で作成し出力する
GPIO23のMCLKは、CyFxUVCApplnInit()内で、FX3からの出力信号として定義し、27MHzに近い疑似クロックを生成するのが良いかと思います。
SYS_CLKが403.2 MHzで動作しており、GPIO blockは、fastClkDivで2を指定することで、SYS_CLK/2 = 201.6 MHzで動作します。
このfastClkから、27MHzに近いクロックを生成します。
GPIOには、Simple GPIOとComplex GPIOがあり、Complex GPIOではPWMが利用可能です。
適切な周期を設定し、PWMのduty比を50%にすることで、擬似的に27MHzに近い信号が生成できます。
27MHzの1クロックサイクル:1/(27 * 10^6) = 0.037037 μs
fastClkの1クロックサイクル:1/(GPIO fast clock frequency) = (1/201.6) μs
fastClkから27MHzに近いクロックサイクルを算出するためにperiodに7 (8-1)を設定する:(8*1*10^-6)/(201.6) = 0.039683 μs = 25.2 MHz
計算式は以下のとおりです。
・SYS_CLK frequency = 403.2 MHz
・GPIO fast clock frequency = (SYS_CLK frequency)/2 = 201.6 MHz
・One clock period = 1/(GPIO fast clock frequency) = (1/201.6) μs
・gpioComplexConfig.period = (Desired PWM waveform period/One clock period)
以下のKBAに同様の説明がございます。
Calculating PWM Period and Duty Cycle in FX3 – KBA226759
コード例としては、以下のようになります。
GPIO23から任意の疑似クロック信号を出力 |
---|
/* MCLK is the 27MHz Sensor clk */ CyU3PGpioComplexConfig_t gpioComplexConfig; gpioComplexConfig.outValue = CyFalse; // Set to Low gpioComplexConfig.driveLowEn = CyTrue; gpioComplexConfig.driveHighEn = CyTrue; gpioComplexConfig.inputEn = CyFalse; // Set as Output pin gpioComplexConfig.pinMode = CY_U3P_GPIO_MODE_PWM; gpioComplexConfig.intrMode = CY_U3P_GPIO_NO_INTR; gpioComplexConfig.timerMode = CY_U3P_GPIO_TIMER_HIGH_FREQ; // Use the GPIO fast clock for generating the PWM gpioComplexConfig.timer = 0; gpioComplexConfig.period = 7; // Set the period to 8 timer ticks (8*1/201.6 us) ~= 0.039683us -> 25.2 MHz gpioComplexConfig.threshold = 4; // Set the threshold such that the duty cycle is 50% apiRetStatus = CyU3PGpioSetComplexConfig (23, &gpioComplexConfig); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "Complex GPIO Set Config Error, Error Code = %d\n", apiRetStatus); CyFxAppErrorHandler (apiRetStatus); } |
Complex GPIOもOverride出来ますが、今回は予め CyU3PIoMatrixConfig_t でEnableしておきました(上記例にはその記述はありません)。それを含め、AN75779ベースでサンプルコードを作成したので添付致します。参考にしていただけましたら幸いです。
GPIOについての詳細が書かれたマニュアルとしては、FX3 Technical Reference Manual (C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\doc\firmware にあります) の"8.9 GPIO"が役立ちます。
GPIOの使い方についてのサンプルコードとしては、以下の2つが役立ちます。
C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\firmware\serialif_examples\cyfxgpioapp
C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\firmware\serialif_examples\cyfxgpiocomplexapp
よろしくお願い致します。
Hirotaka Takayama