クロックの生成

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
user_3987996
Level 3
Level 3
25 replies posted 10 replies posted 5 replies posted

サンプルコードのfx3_uvc.cyfxを改造しての使用を考えています。

プログラム的にはカメラモジュールをUSBに変換するようにしたいのですが、

サンプルには無いクロックとスタンバイ信号を制御する必要があります。

GPIF IIで上記の信号の追加を回路に合わせてしたのですが、何処のコードを

触ればいいのか不明です。

初歩的な質問で申し訳ないですが、ご教示ください。

0 件の賞賛
1 解決策
lock attach
Attachments are accessible only for community members.

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

元の投稿で解決策を見る

0 件の賞賛
3 返答(返信)
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

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

0 件の賞賛

日本ケミコンのNCM03-Vの接続をします。

GPIO23にMCLKに接続

GPIO21にSTDBY信号を接続しています。

(GPIFのコンフィグレーションで上記割り当てもしています)

MCLKはMAX27MHzを出力する必要があり、STDBYはアクティブHighでの出力が必要です。

通常スタンバイモードにはしないので、STDBY信号はLOWのままでOKです。

上記の処理を追加するにはどのようにしたらいいでしょうか?

できるだけ詳しく教えて頂けると助かります。

0 件の賞賛
lock attach
Attachments are accessible only for community members.

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

0 件の賞賛