FX3/CX3/FX3Sとの多重SPIインターフェース - KBA229105 - Community Translated (JA)
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
Community Translated by keni_4440091 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の設定方法を示しています。FX3と2つのスレーブ間のソフトウェア制御SSN(スレーブセレクト-アクティブlow)ラインとしてFX3 GPIOを使用できます。図1に本ユースケースのブロック図を示します。
図1.FX3と多重SPIスレーブのインターフェース
データ転送フロー:
1. SPIスレーブ1のSSNラインとしてGPIO[33]と言う、シンプルなGPIOを設定します; SPIスレーブ2のSSNラインとしてGPIO[34]と言う、もう一つの簡単なGPIOを設定します。
2 マスターがスレーブと通信する時は常にこれらのステップに従って下さい:
- CyU3PGpioSetValue(GPIO_NUMBER,
CyFalse)を使用してスレーブセレクトGPIOをlow出力して下さい。 - SPIデータを送/受信して下さい。
- CyU3PGpioSetValue(GPIO_NUMBER,
CyTrue)を使用してスレーブセレクトGPIOをhigh出力して下さい。
ファームウェア変更:
- ソフトウェアスレーブ選択ラインとして使用する2つのGPIOを定義します。
#define GPIO_SSN1 (33)
#define GPIO_SSN2 (34)
- ファームウェアの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ラインを使用したFX3と2つのスレーブをインターフェースするために、上記変更を加えたUsbSpiRegMode例を使用できます。
注意:アプリケーションで更に多くのスレーブが必要となる場合、要求されるソフトウェア-制御SSNラインはスレーブの数と等しくしなくてはいけません。