2 Replies Latest reply on May 21, 2020 1:26 AM by keni_4440091

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

    keni_4440091

      Hi

       

      I want to translate KBA229105, please confirm to my work.

       

      Regards,

      Nino

        • 1. Re: Community Translation - Interfacing Multiple SPI Slaves with FX3/CX3/FX3S - KBA229105
          AikoO_51

          Hi Nino-san,

           

          I confirmed the KBA.

          Please work to do.

           

          Regards,

          Aiko

          • 2. Re: Community Translation - Interfacing Multiple SPI Slaves with FX3/CX3/FX3S - KBA229105
            keni_4440091

            FX3/CX3/FX3Sとの多重SPIインターフェース- KBA229105

            バージョン 2

            ChaitanyaV_61 2019/12/16 2:13 に作成。ChaitanyaV_61 2019/12/16 2:19 に変更。

            Author: HemanthR_06          Version: **

             

            質問:

            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ラインはスレーブの数と等しくしなくてはいけません。                                 

             

            121 閲覧 カテゴリ: USB: SuperSpeed Peripherals タグ: spi, fx3, ss_usb, spi-ssn, mutiple slaves