FX3/CX3/FX3Sとの多重SPIインターフェース - KBA229105 - Community Translated (JA)

Version 1

    Community Translated by  keni_4440091 Expert        Version: **

     

    Translation - English: Interfacing Multiple SPI Slaves with FX3/CX3/FX3S - KBA229105

     

    質問:

    FX3とどのようにして多重SPIインターフェースを行うのか?

     

    回答:

    下記のパスで利用可能な規定SDK例のUsbSpiRegModeは、一つのSPIスレーブでのみのインターフェースをサポートします。これは複数のスレーブがインターフェースする際のアプリケーションには不適切となるかもしれません。

     

    ファームウェア例のパス:FX3_Installation_path\EZ-USB
    FX3 SDK\1.3\firmware\serialif_examples\cyfxusbspiregmode

     

    この図は複数のSPIスレーブ(2つのスレーブ)で動作するFX3の設定方法を示しています。FX32つのスレーブ間のソフトウェア制御SSN(スレーブセレクト-アクティブlow)ラインとしてFX3 GPIOを使用できます。図1に本ユースケースのブロック図を示します。


    1FX3と多重SPIスレーブのインターフェース

     

    データ転送フロー:

      1.  SPIスレーブ1SSNラインとしてGPIO[33]と言う、シンプルなGPIOを設定します; SPIスレーブ2SSNラインとしてGPIO[34]と言う、もう一つの簡単なGPIOを設定します。

     

      2  マスターがスレーブと通信する時は常にこれらのステップに従って下さい:

      • CyU3PGpioSetValue(GPIO_NUMBER,
        CyFalse)
        を使用してスレーブセレクトGPIOlow出力して下さい。
      • SPIデータを送/受信して下さい。
      • CyU3PGpioSetValue(GPIO_NUMBER,
        CyTrue)
        を使用してスレーブセレクトGPIOhigh出力して下さい。

     

    ファームウェア変更:

     

    1. ソフトウェアスレーブ選択ラインとして使用する2つのGPIOを定義します。

    #define GPIO_SSN1 (33) 

    #define GPIO_SSN2 (34)

    1. ファームウェアのGPIOブロックを初期化し、下記のようにソフトウェアスレーブセレクト機能として使用される、簡単なGPIOとして2つのGPIOを設定します:

        /* Configure GPIO 33 as output(GPIO_SSN1). */

    gpioConfig.outValue = CyTrue;

    gpioConfig.inputEn = CyFalse;

    gpioConfig.driveLowEn = CyTrue;

    gpioConfig.driveHighEn = CyTrue;

    gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR;


    apiRetStatus = CyU3PGpioSetSimpleConfig(GPIO_SSN1, &gpioConfig);

    if (apiRetStatus != CY_U3P_SUCCESS) 

    {

    /* Error handling */

    CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig for GPIO Id %d failed, error code = %d\n",

    GPIO_SSN1, apiRetStatus);

    CyFxAppErrorHandler(apiRetStatus);  

    }

     

    /* Configure GPIO 34 as output(GPIO_SSN2) */

    gpioConfig.outValue = CyTrue;

    gpioConfig.inputEn = CyFalse;

    gpioConfig.driveLowEn = CyTrue;

    gpioConfig.driveHighEn = CyTrue;

    gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR;

     

    apiRetStatus = CyU3PGpioSetSimpleConfig(GPIO_SSN2, &gpioConfig);  

    if (apiRetStatus != CY_U3P_SUCCESS) 

          {

              /* Error handling */

    CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig for GPIO Id %d failed, error code = %d\n",

    GPIO_SSN1, apiRetStatus);

    CyFxAppErrorHandler(apiRetStatus);

         } 

              }

     

      3. SPI初期化ブロックで、下記を付加します:

         a.  spiConfig.ssnCtrl = CY_U3P_SPI_SSN_CTRL_FW; and

         b.  spiConfig.cpol = CyTrue;

     

         これはファームウェアを使って設定されるスレーブセレクトを有効にします(アクティブlow極性のソフトウェア-制御SSNライン)。

     

      4. ソフトウェア-制御SSNラインを使ったデータ転送のために、下記を行って下さい:

     

    /* For slave 1*/

                  /* Drive GPIO low- GPIO_SSN1*/

                                CyU3PGpioSimpleSetValue (GPIO_SSN1, CyFalse);

                                /* Send or Receive data*/           

                                status = CyU3PSpiTransmitWords (location, 4);        

                                if (status != CY_U3P_SUCCESS)

                                {

    CyU3PDebugPrint (2, "SPI WRITE command failed\r\n");

    /* drive GPIO high - GPIO_SSN1*/

    CyU3PGpioSimpleSetValue (GPIO_SSN1, CyTrue);

    return status;

                                }

                    status = CyU3PSpiTransmitWords (buffer, glSpiPageSize);

                  if (status != CY_U3P_SUCCESS)

                                {

    CyU3PGpioSimpleSetValue (GPIO_SSN1, CyTrue);

    return status;

                                }

    /* Drive GPIO high - GPIO_SSN1*/

    CyU3PGpioSimpleSetValue (GPIO_SSN1, CyTrue);       

     

    上記プロセスは前述のようにGPIをアサートおよびデアサートすることで、CyU3PSpiReceiveWords()APIを使用するのと同様に、スレーブからデータを読むために使用されます。

     

    上記の断片コードはGPIO_SSN1の代わりにGPIO_SSN2を使用してスレーブ2で使用されるために変更可能です。

    ソフトウェア-制御SSNラインを使用したFX32つのスレーブをインターフェースするために、上記変更を加えたUsbSpiRegMode例を使用できます。

    注意:アプリケーションで更に多くのスレーブが必要となる場合、要求されるソフトウェア-制御SSNラインはスレーブの数と等しくしなくてはいけません。