SPIプロトコル
SPI プロトコルと Typhoon HIL ツールチェーンでのその実装について説明します。
SPIプロトコルの紹介
シリアル ペリフェラル インターフェイス (SPI) は、主に組み込みシステムにおける短距離通信に使用される同期シリアル通信インターフェイス仕様です。
SPIデバイスは、通常単一のマスターデバイスによるマスタースレーブアーキテクチャを用いて全二重モードで通信します。マスター(コントローラ)デバイスは、読み取りおよび書き込み用のフレームを生成します。複数のスレーブデバイスは、個別のチップセレクト(CS)ライン(スレーブセレクト(SS)ラインと呼ばれることもあります)によって選択できます。
インタフェース
SPIバスは4つの論理信号を指定する
- SCLK: シリアルクロック(マスターからの出力)
- MOSI: マスター出力スレーブ入力(マスターからのデータ出力)
- MISO: マスター入力スレーブ出力(スレーブからのデータ出力)
- CS /SS : チップ/スレーブ選択(データが送信されていることを示すマスターからの出力)
マスターの MOSI はスレーブの MOSI に接続します。マスターの MISO はスレーブの MISO に接続します。
クロックの極性と位相
SPIには4つの動作モードがあり、それぞれが4つのクロック構成に対応しています。これらの構成は、クロック極性(CPOL)とクロック位相(CPHA)によって定義されます。
- モード0: データは、非反転クロック極性のクロックパルスの立ち上がりエッジでサンプリングされます(CPOL = 0、CPHA = 0)
- モード1: データは、非反転クロック極性のクロックパルスの立ち下がりエッジでサンプリングされます(CPOL = 0、CPHA = 1)
- モード2: データはクロック極性反転のクロックパルスの立ち下がりエッジでサンプリングされます (CPOL = 1、CPHA = 0)
- モード3: データはクロック極性反転のクロックパルスの立ち上がりエッジでサンプリングされます(CPOL = 1、CPHA = 1)

独立したスレーブ構成
独立スレーブ構成では、各スレーブに独立したチップセレクトラインが存在します。マスターは一度に1つのチップセレクトのみをアサートします。すべてのスレーブのMISOピンは相互に接続されているため、トライステートピン(ハイ、ロー、またはハイインピーダンス)である必要があります。スレーブが選択されていない場合は、ハイインピーダンス出力を適用する必要があります。
デイジーチェーン構成
SPI を実装する製品の中には、デイジー チェーン構成で接続され、最初のスレーブ出力が 2 番目のスレーブ入力に接続されるものがあります。各スレーブの SPI ポートは、最初のクロック パルス グループで受信したデータの正確なコピーを 2 番目のクロック パルス グループで送信するように設計されています。チェーン全体は通信シフト レジスタとして機能します。デイジー チェーンは、SPI を介して入力または出力のバンクを提供するために、シフト レジスタを使用して行われることがよくあります。各スレーブは、アクティブ ローの SS ラインがハイになるまで、次のクロック サイクルで入力を出力にコピーします。このような機能には、各スレーブに個別の SS ラインではなく、マスターからの単一の SS ラインのみが必要です。
Typhoon HILツールチェーンのSPIプロトコル
現在、Typhoon HIL の SPI スレーブ機能は、HIL デバイス (次の Typhoon HIL デバイスでサポートされています: HIL101、HIL404、HIL506、および HIL606 ) に直接実装されるか、ACE ボード( Automotive Communication Extender )を介して実装されます。
HILデバイス経由でSPIを使用する場合、SPIはGPIOコネクタを使用して実装されます。そのため、このプロトコルの使用は、このタイプのコネクタを備えたデバイスに限定されます。各HILデバイスモデルで利用可能なポートに関する情報は、各デバイスのハードウェアマニュアルの「一般仕様」セクションに記載されています。HILデバイスごとのGPIOコネクタのピン配置についても、「メカニカル」セクションに記載されています。
SPI を ACE ボード経由で使用する場合、HIL デバイスは Ethernet 接続を介して ACE ボードに接続しますが、SPI プロトコル自体は ACE ボード上の GPIO ピンを使用して実装されます( 「自動車用通信エクステンダー カードのピン配置」で説明) 。
ACE SPI セットアップ
ACE SPIセットアップコンポーネントを図1に示します。これは、車載通信エクステンダ(ACE)に搭載されているSPIコントローラの設定に使用されます。各ACEデバイスには4つのSPIコントローラが搭載されています。
- デバイスID
- 設定を適用する ACE ボードに対応するデバイス ID を選択します。
- イーサネットポート
- ACE ボードが接続されているイーサネット ポートを選択します。
- 実行率
- 信号処理の実行速度。実行速度は、モデルで使用される他のコンポーネントと一致する必要があります。
SPIスレーブ
SPIスレーブコンポーネントは、SPIプロトコルのスレーブ部分を実装します。このコンポーネントは、 SPIプロトコルの概要で説明されているようにSPIスレーブの動作モードを設定し、レジスタマップとメッセージフレームを定義するために使用されます。
- SPIコントローラ
- ACE SPIセットアップコンポーネントが回路図に存在する場合にのみ使用できます。ACE SPIセットアップコンポーネントが回路図に存在しない場合、デフォルトのSPIコントローラはHIL SPIコントローラになります。
- 使用するSPIコントローラを定義します。コンボボックスとして表示され、HIL GPIOとACEx-SPIy( xはSPIコントローラのシリアル番号、 yはACEボードで選択したデバイスID)を選択できます。
- ACE SPI セットアップ コンポーネントが回路図に表示されていない場合、SPI 通信は HIL コントローラを介して処理されます。
- 実行率
- 信号処理実行率。
- SPIモード
- SPI 通信がHIL GPIOコントローラーを介して処理される場合に使用できます。
- SPI 動作モード (0、1、2、または 3) を定義します。
- モシ
- SPI 通信がHIL GPIOコントローラーを介して処理される場合に使用できます。
- MOSI 信号に使用する GPIO ピンを定義します。
- MIS0ピン
- SPI 通信がHIL GPIOコントローラーを介して処理される場合に使用できます。
- MISO 信号に使用する GPIO ピンを定義します。
- SCLKピン
- SPI 通信がHIL GPIOコントローラーを介して処理される場合に使用できます。
- SCLK 信号に使用する GPIO ピンを定義します。
- CS/SCピン
- SPI 通信がHIL GPIOコントローラーを介して処理される場合に使用できます。
- CS/SS 信号に使用する GPIO ピンを定義します。
- デイジーチェーン
- SPI 通信がACE SPIコントローラを介して処理される場合に使用できます。
- SPI がデイジー チェーン モードで動作するように構成されているかどうかを定義します。
- デイジーチェーン内のスレーブの数
- デイジー チェーンオプションを選択した場合に使用できます。
- デイジー チェーン モードで動作する SPI スレーブの数を定義します。
- デフォルトの戻り値
- デフォルトの戻り値の型が定数の場合に使用できます。
- レジスタ データ用に予約されていないメッセージの部分で SPI スレーブによって送信される 1 バイトの値を定義します。
- デフォルトの戻り値の型
- デフォルトの戻り値が定数か変数かを定義します。
- 戻り値の型が定数の場合、デフォルトの戻り値には、「デフォルトの戻り値」フィールドで定義された定義済みの固定値が設定されます。
- 戻り値の型が変数の場合、「サイズ」というラベルの付いた編集ボックスが表示され、デフォルトの戻り値を構成するバイト数を定義できます。
- デフォルトの戻り値が定数か変数かを定義します。
- サイズ
- デフォルトの戻り値の型が変数の場合に使用できます。
- デフォルトの戻り値のバイト数を定義します。
- サイズ フィールドで定義されたバイト数が、メッセージ内でデフォルト バイトで埋める必要のあるバイト数より小さい場合、デフォルト バイトのシーケンスが繰り返されます。
- フレームを書き込む
- 書き込みフレームの構造を定義します。このプロパティはPython辞書のリストとして定義されます。
- フレームを読み込む
- リードフレームの構造を定義します。このプロパティはPython辞書のリストとして定義されます。
- メッセージ出力
- リードフレームへの応答として返されるデータの構造を定義します。このプロパティは、Python辞書のリストとして定義されます。
- 出力を受け取る
- メッセージ出力を送信するかどうかを選択します
- 読み取りフレームと同じメッセージ内(これにより出力フレームが読み取りフレームに追加されます)
- 次のメッセージの一部として(出力は次のメッセージの先頭に送信されます)
- メッセージ出力を送信するかどうかを選択します
- メッセージ構造を生成する
- このオプションを選択すると、メッセージ フレームをより直感的に指定するための追加のダイアログ ウィンドウが有効になります。
- レジスター
- SPI スレーブ レジスタ マップの定義。
- このプロパティはPython辞書として定義されています。レジスタマップの仕様の詳細については、 「レジスタマップ」を参照してください。
- レジスタを生成する
- このオプションを選択すると、レジスタ マップをより直感的に指定するための追加のダイアログ ウィンドウが有効になります。
メッセージフレーム
- 書き込みフレーム - SPIマスターからの書き込みコマンドを表します。このメッセージを使用して、マスターは指定されたアドレスのスレーブレジスタの値を変更することができます。
- リードフレーム - SPIマスターからの読み取りコマンドを表します。このメッセージを使用して、マスターは指定されたアドレスのスレーブにデータを要求します。
- 出力フレーム - マスターからの読み取りメッセージに対するスレーブの応答を表す
これらのメッセージフレームは、ユーザーの要件に基づいて定義できるカスタマイズ可能な構造を持っています。この構造が機能するには、以下の要件を満たす必要があります。
- 書き込みフレームと読み取りフレームにはコマンドとアドレス部分が含まれている必要があります
- コマンド部分とアドレス部分の合計長さは8の倍数である必要があります
- 書き込みフレームと出力フレームにはレジスタデータフィールドが含まれている必要があります
- 書き込みフレームと読み取りフレームのコマンド部分とアドレス部分は同じビットから始まり、同じ長さでなければなりません。
- 出力フレームが次のメッセージで送信される場合、読み取りフレームと書き込みフレームのサイズは出力フレームのサイズ以上である必要があります。
- 出力フレームの最初の部分の開始ビットは、読み取りフレームの合計サイズと等しくなければなりません。
- 各フレームの合計長さは8の倍数でなければなりません
分野 | 説明 |
---|---|
メッセージ部分 | パーツがコマンド、アドレス、レジスタデータ、または入力データであるかどうかを定義します(入力データはフィラーとして使用され、その内容は無視されます) |
スタートビット | メッセージフレーム内のそのメッセージ部分の最初のビットの位置 |
長さ | メッセージ部分のサイズ(ビット単位で定義) |
論理 | コマンドのロジックを定義します(他のフレームパーツでは使用できません) |
価値 | コマンドの値を定義します(他のフレームパーツでは使用できません) |
レジスターマップ
レジスタマップは、スレーブデバイス上のレジスタのリスト、アドレス、タイプ、長さ、エンディアンを定義します。これらのレジスタは、SPIスレーブコンポーネントの入力と出力を定義します。
分野 | 説明 |
---|---|
信号名 | レジスタの名前を定義します |
登録住所 | レジスタデータにアクセスするために使用するレジスタアドレスを定義します |
IOタイプ | レジスタを入力または出力として定義します(定数型レジスタは出力としてのみ定義できます) |
信号の種類 | レジスタを変数または定数として定義します(入力レジスタは変数としてのみ定義できます) |
データ型 | レジスタが保持するデータの型を定義します(定数として定義されたレジスタのみが文字列データ型を持つことができます) |
長さ | レジスタのサイズをバイト単位で定義します(レジスタのデータ型によって異なります) |
エンディアン | レジスタデータのエンディアンを定義します |
信号値 | 初期レジスタ値を定義します(値は出力レジスタに対してのみ設定できます) |
レジスタへのアクセス
レジスタデータには、ユーザー定義のレジスタアドレス、またはレジスタの各バイトごとに生成されたアドレスを使用してアクセスできます。これらのアドレスは、ユーザー定義のレジスタアドレスに基づいて1バイト単位で自動的に生成されます。図4にその例を示します。
レジスタ間の相互作用
ユーザー定義レジスタはC言語の配列としてメモリに格納され、その順序は定義順序と同じになります(レジスタアドレスは順序に影響を与えません)。これにより、1回の書き込みまたは読み出しコマンドで複数のレジスタのデータにアクセスできるようになります。
例えば、レジスタが図4のように定義されている場合、アドレス0x10で2バイトのデータを要求する読み取りフレームを送信できます。応答にはレジスタ2と3のデータが含まれます。
SPIリセット
シミュレーション実行中にリセット入力に0以外の値を入力すると、SPIスレーブアプリケーションを無効化できます。これによりアプリケーションはリセットされ、リセット入力で0が検出されるまで無効化された状態を維持します。SPIスレーブアプリケーションをリセットすると、アクティブなSPIステータスコードがすべてクリアされます。
SPIステータス
SPIステータス出力は、潜在的なエラーのトラブルシューティングに役立つSPIステータスの監視に使用されます。表3に、発生する可能性のあるエラーコードとその説明を示します。各エラーには、エラーコードの状態を表す専用のビット値が割り当てられています。
価値 | エラー |
---|---|
64 (0x40) | 転送バッファアンダーフロー |
32 (0x20) | 受信バッファがいっぱいです |
16 (0x10) | 転送バッファがいっぱいです |
2 (0x02) | モッドフェイル |
1 (0x01) | 受信バッファオーバーフロー |
SPIスレーブの例
この例では、SCADA入力を使用して入力レジスタの値を設定し、プローブを使用して出力レジスタの値を読み取ります。SPIスレーブコンポーネントは、次の図に示すように構成されています。
メッセージ構造の定義を図5に示します。
レジスタの定義を図 6に示します。
メッセージフレームのタイミング図
指定されたメッセージ構造のタイミング図は次のとおりです。
- フレームを書き込む
- 出力フレームと同じメッセージ内の読み取りフレーム
- 新しいメッセージの出力フレーム