• 検索結果がありません。

割り込み

ドキュメント内 Section 23. Serial Peripheral Interface (SPI) (ページ 50-54)

シリアル ペリフェラルインターフェイス(S PI ) 23

23.5 割り込み

SPI モジュールはデータ通信中に発生したイベントに対応して下記の割り込みを生成できま す。

• 受信データ読み出し可能割り込みが発生すると、SPI1RXIFおよび SPI2RXIFビットがセッ トされます。このイベントは、SPIxBUF受信バッファへの新しいデータの書き込みが完了す ると発生します。

• 送信データエンプティ割り込みが発生すると、SPI1TXIFおよびSPI2TXIFビットがセットさ れます。このイベントは、SPIxBUF送信バッファに新しいデータを書き込める空き位置がで きると発生します。

• エラー割り込みが発生すると、SPI1EIFおよびSPI2EIFビットがセットされます。このイベ

ントは、SPIxBUF受信バッファでオーバーフロー条件が発生した場合(次のデータの受信を

完了したが、先に受信したデータがまだ読み出されていない場合)、 送信バッファでアンダー ランが発生した場合、FRMERRイベントが発生した場合に発生します。

これら全ての割り込みフラグは IFSx レジスタに格納されており、ソフトウェアでクリアする 必要があります。詳細は各デバイスのデータシートを参照してください。

SPI割り込みを有効にするには、対応するIECxレジスタ内の各SPI割り込みイネーブルビッ ト(SPIxRXIE、SPIxTXIE、SPIxFIE)をセットします。

加えて、IPCxレジスタ内の割り込み優先度ビット(SPIxIP)と割り込み副優先度ビット(SPIxIS) も設定する必要があります。

拡張バッファモードを使う場合、SPI制御(SPIxCON<3:2>)レジスタのSPI送信バッファ エン プティ割り込みモードビット(STXISEL<1:0>)を使って送信バッファ エンプティ割り込みの生 成条件(非フル、1/2以上エンプティ、完全にエンプティ、最後の転送データをシフトアウト) を設定できます。

同様に、拡張バッファモードを使う場合、SPI制御(SPIxCON<1:0>)レジスタのSPI受信バッ ファフル割り込みモードビット(SRXISEL<1:0>)を使って受信バッファフル割り込みの生成条 件(フル、1/2以上フル、非エンプティ、最後のワードの読み出し)を設定できます。

詳細は『セクション08.割り込み』(DS61108)を参照してください。

23.5.1 割り込みの設定

各SPIモジュールには、それぞれ3つの割り込みフラグビット(SPIxEIF、SPIxRXIF、SPIxTXIF) と、それらに対応する割り込みイネーブル/マスクビット(SPIxEIE、SPIxRXIE、SPIxTXIE)が 割り当てられています。割り込みフラグビットを使って割り込みを引き起こした要因を特定で き、割り込みイネーブルビットを使って対応する割り込み要因を有効または無効にできます。

特定のSPI モジュールに関連付けられた全ての割り込み要因は、1つの割り込みベクタを共有

する事に注意してください。各SPIモジュールには別々に優先度を設定できます。

SPI送信バッファがエンプティになるとSPIxTXIFがセットされ、新しいデータをSPIxBUFレ ジスタに書き込めます。SPIxBUF内に読み出し可能な受信データが存在すると、SPIxRXIFが セットされます。受信オーバーフロー条件が発生すると、SPIxEIFがセットされます。

SPIxTXIF、SPIxRXIF、SPIxEIF ビットは対応するイネーブルビットの状態に関係なくセット

される事に注意してください。割り込みフラグビットは必要に応じてソフトウェアでポーリン グできます。

SPIxEIE、SPIxTXIE、SPIxRXIEビットはそれぞれ SPIxEIF、SPIxTXIF、SPIxRXIFビットが セットされた時の割り込みコントローラの挙動を定義します。割り込みイネーブルビットをク リアすると、割り込みコントローラは対応するイベントが発生しても CPU 割り込みを生成し ません。割り込みイネーブルビットをセットした場合、割り込みコントローラは対応する割り 込みフラグビットがセットされるとCPUに対して割り込みを生成します(この動作は後述の優 先度および副優先度の設定に従います)。

割り込みをサービスするユーザ ソフトウェア ルーチンは、サービスルーチンを完了する前に 適切な割り込みフラグビットをクリアする必要があります。

各SPIモジュールの割り込み優先度は、SPIxIP<2:0>ビットを使って別々に設定できます。こ の優先度は、割り込み要因をどの優先度グループに割り当てるのかを定義します。各優先度グ ループは7 (最優先)から0 (割り込みを生成しない)の優先度を持ちます。ある割り込みをサー ビスしている時に、より高い優先度グループに属する割り込みが発生した場合、サービス中の 割り込みは保留されます。エラー割り込みの各要因は、SPIxCON2 レジスタの FRMERREN、

SPIROVEN、SPITURENビットによって別々に制御されます。

Note: 拡張バッファモードは一部のデバイスだけで利用できます。詳細は各デバイスの

データシートを参照してください。

シリアル ペリフェラル インターフェイス (S PI ) 23

副優先度ビットにより、同一優先度グループに属する割り込み要因に異なる優先度を設定でき ます。副優先度の値(SPIxIS<1:0>)は、3 (最優先)から0 (最低優先度)の間で設定できます。

ある割り込みのサービス中に、優先度グループが同じで副優先度がより高い割り込みが発生し ても、サービス中の副優先度の低い割り込みは保留されません。

複数の割り込み要因に同一の優先度と副優先度を割り当てる事もできます。そのように設定し た複数の割り込みが同時に発生した場合、それらの各割り込み要因が持つ自然順序優先度に よって、生成される割り込みが決まります。自然順序優先度は割り込み要因のベクタ番号に基 づきます。ベクタ番号が小さいほど、割り込みの自然順序優先度は高くなります。自然順序優 先度に従って保留された割り込み要因は、サービス中の割り込みの割り込みフラグがクリアさ れた後に、優先度、副優先度、自然順序優先度に基づいて、順番に割り込みを生成します。

有効な割り込みが発生すると、CPUはその割り込みに割り当てられているベクタへジャンプし ます。割り込みのベクタ番号がそのまま自然優先順位となります。CPUはジャンプ先のベクタ アドレスからコードの実行を始めます。このベクタアドレスから始まるユーザコードは、要求 されたアプリケーション動作を実行し、終了する前に割り込みフラグ (SPIxEIF、SPIxTXIF、

SPIxRXIF)をクリアする必要があります。割り込みの詳細については、『セクション08.割り込

み』(DS61108)内のベクタアドレス テーブルを参照してください。

23-12: 割り込みを有効にするSPI初期化サンプルコード

23-13: SPI1 ISRのサンプルコード

デバイスが拡張バッファモードを備えている場合、ユーザ アプリケーションは割り込み条件に 対応した後に割り込み要求フラグをクリアする必要があります。

SPI割り込みが発生した場合、ISRはSPIデータバッファ(SPIxBUF)レジスタを読み出した後 にSPI割り込みフラグをクリアする必要があります(例23-14参照)。

/*

The following code example illustrates an SPI1 interrupt configuration.

When the SPI1 interrupt is generated, the cpu will jump to the vector assigned to SPI1 interrupt.

It assumes that none of the SPI1 input pins are shared with an analog input.If so, the AD1PCFG and corresponding TRIS registers have to be properly configured.

*/

intrData;

IEC0CLR=0x03800000; // disable all SPI interrupts SPI1CON = 0; // Stops and resets the SPI1.

rData=SPI1BUF; // clears the receive buffer IFS0CLR=0x03800000; // clear any existing event IPC5CLR=0x1f000000; // clear the priority IPC5SET=0x0d000000; // Set IPL=3, Subpriority 1

IEC0SET=0x03800000; // Enable RX, TX and Error interrupts

SPI1BRG=0x1; // use FPB/4 clock frequency SPI1STATCLR=0x40; // clear the Overflow

SPI1CON=0x8220; // SPI ON, 8 bits transfer, SMP=1, Master mode

/*

The following code example demonstrates a simple interrupt service routine for SPI1

interrupts.The user’s code at this vector should perform any application specific operations and must clear the SPI1 interrupt flags before exiting.

*/

void __ISR(_SPI_1_VECTOR, ipl3)__SPI1Interrupt(void) {

// ... perform application specific operations in response to the //interrupt

IFS0CLR = 0x03800000; // Be sure to clear the SPI1 interrupt flags // before exiting the service routine. }

23-14: 拡張バッファモードを備えたデバイス向けのSPI1 ISRサンプルコード /*

The following code example demonstrates a simple interrupt service routine for SPI1

interrupts.The user’s code at this vector should perform any application specific operations and must clear the SPI1 interrupt flags before exiting.

*/

void __ISR(_SPI_1_VECTOR, ipl3)__SPI1Interrupt(void) {

int Data; // Read SPI data buffer Data = SPI1BUF;

// ... perform application specific operations in response to the //interrupt

IFS0CLR = 0x03800000; // Be sure to clear the SPI1 interrupt flags // before exiting the service routine.

}

Note: SPI1 ISRサンプルコードはMPLAB® C32 Cコンパイラ向けの構文で書かれてい ます。ISR のサポートについては、ご使用になるコンパイラのマニュアルを参照 してください。

シリアル ペリフェラル インターフェイス (S PI ) 23 23.6 省電力およびデバッグモード中の動作

23.6.1 スリープモード

デバイスがスリープに移行するとシステムクロックは停止します。スリープ中のSPIモジュー ルの動作は、スリープへの移行前のモジュール動作モードによって異なります。以下では、動 作モード別にスリープ挙動について説明します。

23.6.1.1 マスタモードでのスリープ

スリープ中は下記の点に注意が必要です。

• baudレート ジェネレータは停止し、リセットされる場合がある(デバイス データシートで

確認してください)。

• 実行中の送受信シーケンスは中止される。スリープ終了時にモジュールは中止されたシーケ ンスを再開しない(デバイス データシートで確認してください)

• スリープに移行すると、モジュールは新しいデータを一切送受信しない。

23.6.1.2 スレーブモードでのスリープ

スレーブモードの場合、SPIモジュールは外部の SPIマスタが供給するSCKを使って動作し ます。SCKx クロックパルスは外部から供給されるため、モジュールはスリープ中も機能し続 けます。スリープへの移行中のトランザクションは全て完全に実行されます。トランザクショ ンが完了するとSPIRBFフラグがセットされます。その結果、SPIxRXIFビットがセットされ ます。SPI割り込みが有効(SPIxRXIE = 1)かつその優先度が現在のCPU優先度よりも高い場 合、デバイスはスリープから復帰し、SPIx 割り込みベクタ アドレスからコード実行を再開し ます。SPI割り込み優先度が現在のCPU優先度以下である場合、CPUはスリープを継続します。

スレーブデバイスとして動作中のモジュールはスリープへの移行時にリセットされません。

SPIx モジュールがスリープに移行する際もスリープから復帰する際もレジスタの内容は影響 を受けません。

23.6.2 アイドルモード

デバイスがアイドルに移行してもシステムクロック源は機能し続けます。

23.6.2.1 マスタモードでのアイドル

アイドル中にモジュールの動作を停止するか継続するかはSIDLビット(SPIxCON<13>)で選択 します。

• SIDL = 1の場合、モジュールはアイドル中に動作を停止します。この場合、モジュールはス

リープ中と同様に機能します。

• SIDL = 0の場合、モジュールはアイドル中も動作を続けます。

23.6.2.2 スレーブモードでのアイドル

SIDLの設定に関係なく、モジュールはアイドル中も動作を継続します。モジュールの挙動はス リープ中と同じです。

23.6.3 デバッグモード

23.6.3.1 SPIxBUFの動作

23.6.3.1.1 デバッグモード中の読み出し

デバッグモード中も SPIxBUF を読み出せます。しかし、読み出し動作はどのステータスビッ トにも影響しません。例えば、デバッグモードへの移行時にSPIRBFビット(SPIxSTAT<0>)を セットした場合、デバッグモード中に SPIxBUF を読み出しても、デバッグモード終了時に

SPIRBFビットはセットされたままです。

Note: 送受信シーケンスの不用意な中止を防ぐには、実行中の転送が完了してからス

リープに移行する必要があります。

ドキュメント内 Section 23. Serial Peripheral Interface (SPI) (ページ 50-54)

関連したドキュメント