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

cross mob

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

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

GeethaP_31
Employee
Employee
50 questions asked 10 questions asked 5 questions asked

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に本ユースケースのブロック図を示します。

pastedImage_1.png

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

0 件の賞賛
240 件の閲覧回数
寄稿者