日本語参考資料
最新版英語アプリケーション・ノートはこちら

AN-1479
アプリケーション・ノート
ADuCM4050 の SPI フロー制御モード
はじめにシリアル・ペリフェラル・インターフェース（SPI）は業界標準の同期シリアル・リンクで、A/D コンバータ（ADC）、D/A コンバータ（DAC）、デジタル・ポテンショメータ、不揮発性メモリ（NVM）、センサー、マイクロコントローラ・ユニット（MCU）などの他の SPI 互換デバイスへの全二重動作が可能です。これらのデバイスの中には、高速化、イベント通知、コマンド応答メカニズムの実現など、特定目的のための特別な機能を備えているものがあります。

ADuCM4050 の SPI 動作モードは強化されており、半二重動作とフロー制御オプションを柔軟に使用できます。これにより、SPIブロックは、ペリフェラルに固有のこれらの特性のほとんどをハードウェアで自動的に使用できます。このため、ユーザ・コードが簡略化され、電力量効率を改善できます。
このアプリケーション・ノートでは、ADuCM4050 MCU で使用可能な SPI フロー制御モードについて説明し、使用例をいくつか示します。

アナログ・デバイセズ社は、提供する情報が正確で信頼できるものであることを期していますが、その情報の利用に関して、あるいは利用によって生じる第三者の特許やその他の権利の侵害に関して一切の責任を負いません。また、アナログ・デバイセズ社の特許または特許の権利の使用を明示的または暗示的に許諾するものでもありません。仕様は、予告なく変更される場合があります。本紙記載の商標および登録商標は、それぞれの所有者の財産です。※日本語版資料は REVISION が古い場合があります。最新の内容については、英語版をご参照ください。

Rev. 0©2019 Analog Devices, Inc. All rights reserved.

社／〒105-6891 東京都港区海岸 1-16-1 ニューピア竹芝サウスタワービル 10F
電話 03（5402）8200
大 阪営業所／〒532-0003 大阪府大阪市淀川区宮原 3-5-36 新大阪トラストタワー 10F
電話 06（6350）6868
名古屋営業所／〒451-6038 愛知県名古屋市西区牛島町 6-1 名古屋ルーセントタワー 38F
電話 052（569）6300本AN-1479

アプリケーション・ノート
目次
はじめに ........................................................................................... 1
改訂履歴 ........................................................................................... 2
背景 ................................................................................................... 3
ピンベースのフロー制御 ............................................................ 3
タイマーベースのフロー制御..................................................... 3
ソース・コード ................................................................................ 4
タイマーベースのフロー制御の例 ............................................. 4
ピンベースのフロー制御の例..................................................... 6
まとめ ............................................................................................... 8

改訂履歴5/2019—Revision 0: Initial Version

Rev. 0－ 2/8 －AN-1479

アプリケーション・ノート
背景RDY ピンがアサートされたときに読出しを実行するバイト数を構成できます。この構成を実行するには、SPI フロー制御レジス
タ（SPI_FLOW_CTL）の RDBURSTSZ フィールドを設定します。
MISO でこのバイトのバーストを受信した後、SPI マスタは、次の RDY ピンのアサーションを待機し、次のバイトのセットを受信します。このプロセスは、SPI カウント・レジスタ（SPI_CNT）のセットのすべてのバイトが受信されるまで繰り返されます。

フロー制御は、マスタとスレーブ間のデータ・フローの同期に必要です。ADuCM4050 MCU は、差別化機能であるフロー制御を SPI で提供します。読出しコマンド・モードでは、フロー制御を使用して複数のデータ・バイトを受信できます。
フロー制御では、SPI マスタとスレーブ間のデータ転送は、定期的なデータ読出しまたはオンデマンドのデータ読出しに関するアプリケーション条件に基づいて制御されます。

読出しコマンド・モードを使用すると、最大 16 バイトを転送できます。この転送は、SPI 読出し制御レジスタ（SPI_RD_CTL）の TXBYTES フィールドを使用して構成されます。フロー制御を使用した場合に 1 回のバーストで受信されたバイト数は、SPI読出し制御レジスタ（SPI_FLOW_CTL）の RDBURSTSZ フィー
ルドで設定されます。ただし、受信バイトの合計数に上限は課せられません。

ADuCM4050 の SPI マスタは、次のモードのフロー制御をサポートします。
••

ピンベースのフロー制御、SPI スレーブで制御。
•MISO ピンを使用。
•RDY ピンを使用。
タイマーベースのフロー制御、SPI マスタで制御。

MISO ピンの使用

フロー制御モードについては、次のセクションで詳細に説明します。SPI フロー制御レジスタ（SPI_FLOW_CTL）のモード・フィールドは、フロー制御モードを 3 つのモードのいずれかに構成します。SPI_FLOW_CTL レジスタを図 1 に示します。

一部の SPIスレーブには専用の RDYピンがありませんが、MISOピンを再利用して MISO でデータを送信する準備が整ったことを SPI マスタに通知する手法をとっています。これは、AD7798などの一部の ADC では一般的です。

フロー制御機構は、ADuCM4050 が SPI マスタとして構成されている場合に限り使用できます。

ADuCM4050 SPI マスタは、MISO ラインのアクティブ・レベルの遷移まで待機し、これが検出されると、RDBURSTSZ + 1 個のバイトの読出しを実行して、次のアクティブ・レベルが MISOで検出されるまで待機状態に戻ります。

ピンベースのフロー制御
専用の RDY ピンの使用
一 部 の SPI ス レ ー ブ に は 、 SPI マ ス タ （ こ の 場 合 は 、ADuCM4050）の SPI_RDY ピンに接続する専用の RDY ピンがあります。SPI_RDY ピンは、各 SPI インスタンスに専用のピン（汎用入出力（GPIO）の代替機能）です。

MISO/RDY ピンの極性は、SPI 読出し制御レジスタの RDYPOLフィールド（SPI_FLOW_CTL）を使用して構成できます。

タイマーベースのフロー制御

例えば、ON Semiconductor®の CAT64LC40 シリアル・フラッシ
ュは、専用の RDY ピンを使用して、SPI マスタにデータが使用できるかどうかを信号で通知します。

専用ピンがないスレーブから、マスタにデータが使用できるかどうかを通知するには、MCU で 16 ビット・タイマーを使用してデータの読出し中に待機状態を導入します。タイマーがトリガすると、マスタはバイトのバースト（RDBURSTSZ + 1）の読出しを実行し、タイマーを再起動します。タイマーは SPI クロック・レート（SCK）で出力され、タイマーのトリガを待機す
る SCK サイクルの数は、SPI_WAIT_TMR レジスタを使用して設定できます。例については、図 2 を参照してください。

ス レーブ が専用 の RDY ピ ンを サポー トして いな い場合 、ADuCM4050 の RDY ピンは SPI スレーブの割込みピンに配線できます。スレーブは、RDY ピンを使用して、アクイジションとデータ処理が完了したことを示します。マスタは、このピンのアクティブなレベルが表示されるまで SPI クロックを提供しません。

このスキームを、フロー制御で SCK の待機と駆動に使用する場
合は、最後の SCK エッジをサンプリング・エッジにする必要があります。待ち時間が終わったら、SCK 駆動エッジが次のデータ転送を実行します。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
RDBURSTSZ (R/W)

FLOW CONTROL MODE

RDYPOL (R/W)

POLARITY OF RDY/MISO LINE

14165-001

MODE (R/W)

READ DATA BURST SIZE - 1

図 1. SPI_FLOW_CTL レジスタ
0X9F0x00

0x00

0x00

0x05
SPI_WAIT_TMR
SCK CYCLESSPI_WAIT_TMR
SCK CYCLESSCKMOSI

0xEF

0x40

0x16

MISO

図 2. ソフトウェア・フロー制御とタイマー

Rev. 00xFF
14165-002

0XFF－ 3/8 －AN-1479

アプリケーション・ノート
ソース・コード

結果を図 3 と図 4 に示します。これらの図は、あるバーストと次のバーストの間の遅延を制御する WAIT_TMR レジスタ値を変更することによって作成されています。

このセクションでは、ハードウェア・フロー制御モードを使用して、フロー制御機能によりユーザ・コードとシステム内の電力節約を簡素化する方法を説明します。
このセクションでは 2 つの例を示します。1 つはタイマーベースの概念を示し、もう 1 つはピンベースの例を示します。

タイマーベースのフロー制御の例

1

SPI フロー・オプションを介してデバイスを自動的に制御する第1 の方法はタイマーです。タイマーベースのフロー制御のセクションで説明したように、SPI ブロックは連続する転送間に設定可能な遅延を追加します。この方法は、固定周波数のサンプリング・レートとデータ・レートでデータ・ストリームを提供するような ADC やセンサーでは一般的です。

23

SPI フローの方法は SPI_FLOW_CTL レジスタで示されます。この場合、SPI_FLOW_CTL.MODE でタイマー・オプションは 1 に設定します。

CH2 2.00V
CH4 2.00V

M2.00ms
A CH3
T
3.92000ms

1.15V

14165-004

CH1 2.00VCH3 2.00V

1.15V

14165-005

4

遅延は、PCLK 周波数と SPI_WAIT_TMR レジスタに依存します。
こ の レ ジ ス タ の 値 は 、 新 し い SPI 動 作 の 実 行 を 待 機 す る
SPI_CLK サイクル数（PCLK/SPI_DIV）を指定します。

図 3. WAIT_TMR = 200

この他に考慮すべきオプションは次のとおりです。
•••

SPI_CTL.CONTINUOUS ビット・フィールド：すべてのデータが転送されるまで転送シーケンスを継続する。
SPI_CNT レジスタ：転送するバイト数。
SPI_FLOW_CTL.RDBURSTSZ ビット・フィールド：転送ごとに読出しバイト数から 1 を引いた数。

12

これらのフィールドの効果を図 5 に示します。
この例では、プログラムは固定数のワードを読み出し、タスクが完了するとプログラムが終了します。コードは、コード例 1のセクションに示しています。

3

受信データは割込みハンドラで読み出されます。この場合、読出しバッファが一杯になり、values 変数が増加されます（コード例 2 を参照）。

4

CH1 2.00VCH3 2.00V

CH2 2.00V
CH4 2.00V

M2.00ms
A CH3T3.92000ms

図 4. WAIT_TMR = 20

READ COMMAND WITH CPHA = 1, CPOL = 0, TXBYTES = 0, CNT = 4, RDBURSTSZ = 1, WAIT_TMR = 10 (USING TIMER)
CS

X/Z

MISO

X

Tx0

X/Z
X

Rx0

Rx1

X

Rx2

Rx3

SCLK
10 SCLK CYCLES

10 SCLK CYCLES

図 5. ADuCM4050 ハードウェア・リファレンス・マニュアルでの SPI フローの例

Rev. 0－ 4/8 －X

14165-003

MOSI

AN-1479

アプリケーション・ノート
コード例 1#define NUM_VALUES

50

volatile uint16_t values = 0;

uint16_t buffer[NUM_VALUES] = {0};[…]NVIC_EnableIRQ(SPI0_EVT_IRQn);
pADI_SPI0->CS_OVERRIDE = 0;
pADI_SPI0->CTL =(1 << BITP_SPI_CTL_CON) |//連続(1 << BITP_SPI_CTL_CPOL) |//極性(1 << BITP_SPI_CTL_CPHA) |//フェーズ(1 << BITP_SPI_CTL_MASEN) |//マスタ(1 << BITP_SPI_CTL_SPIEN);//イネーブル

pADI_SPI0->IEN =(1 << BITP_SPI_IEN_IRQMODE);//2 バイトごとに tx 割込み

pADI_SPI0->CNT =NUM_VALUES * 2;//転送バイト数（サンプルあたり 2 バイト）

pADI_SPI0->RD_CTL = (0 << BITP_SPI_RD_CTL_TXBYTES) |(1 << BITP_SPI_RD_CTL_CMDEN);//読出しコマンドでは、tx -1//コマンド・モード

pADI_SPI0->FLOW_CTL = (1 << BITP_SPI_FLOW_CTL_RDBURSTSZ) |(1 << BITP_SPI_FLOW_CTL_MODE);//WAIT_TMR ベースのフロー制御

pADI_SPI0->WAIT_TMR = 20;//待機するサイクル数

tmp = pADI_SPI0->RX;//転送を開始するためのダミー読出し

while(values < NUM_VALUES);//すべてのサンプルまで待機

コード例 2
void SPI0_Int_Handler(){uint16_t aux = 0;if((pADI_SPI0->STAT & 0x20) == 0x20){//TX 終了}else if((pADI_SPI0->STAT & 0x40) == 0x40){//RX

pADI_SPI0->STAT = 0x22;

pADI_SPI0->STAT = 0xFFFF;//割込みをクリア

aux = (pADI_SPI0->RX << 8);

aux |= pADI_SPI0->RX;}//バースト -1}

buffer[values++] = aux;Rev. 0－ 5/8 －AN-1479

アプリケーション・ノート
ピンベースのフロー制御の例

コードは、コード例 3 のセクションに示しています。

SPI フローの第 2 の方法は、新しい転送を信号で通知する方法ですこの例では、MISO ラインがレディ信号として使用されています。

読出しは、割込みハンドラの関数でも実行できます（コード例4 のセクションを参照）。
この結果、図 6 に示すようなデータ・ストリームになります。
AD7798 ADC は新しいサンプルが使用できることを通知し、この デ ー タ を MISO ラ イ ン に 出 力 し ま す 。 各 読 出 し で 、
ADuCM4050 はクロック（青色）を生成し、転送全体が終了するまでチップ・セレクト・ラインをローに保ちます（ピンク色）。MOSI ラインは初期設定後は必要ありません（緑色）。

この例では、AD7798 ADC へのインターフェースを実装しています。この ADC は、サンプルを自動的に送信する自律モードで動作するように設定できます。新しいサンプルが準備できると、MISO ラインにより通知されます。連続モードを選択する設定は、0x5C の値を書き込むことで行います。これは、連続モードで次に読み出す対象がデータ・レジスタであることを COM レジ
スタで示します。
連続モードは、AD7798 からサンプルを連続的に読み出す手段です。各サンプルは 16 ビット・ワードで、ADC によって MISO ラインがグラウンドに接続された後でのみ使用できます。ワークフローを図 7 に示します。

1

2

SPI_FLOW_CTL.CTL_MODE ビット・フィールドに 3 を書き込
むことにより、SPI フロー・オプションとして ADuCM4050 のSPI を MISO モードに設定する必要があります。この方法でも、同じレジスタ内の RDYPOL ビット・フィールドが考慮されます。
この場合、ローの値がトリガとなるため、1 を書き込む必要があります。

4

各転送は 16 ビット幅ワードであるため、SPI_CTL.IRQMODE に1 の値を設定する必要があります。これは、RX バッファに 2 バイトが入ったときに割込みを通知するのに使用されます。更に、
SPI_FLOW_CTL.RDBUSTSZ が 1 になることは、転送ごとに 16ビットクロック・サイクルが完了したことを示します。

CH1 2.00VCH3 2.00V

CH2 2.00V
CH4 2.00V

M2.00ms
A CH3T
3.92000ms

1.15V

14165-007

3

図 6. 連続モードでの AD7798 への SPI 転送

最後に、デバイスを正しく設定するために、AD7798 に設定ワード（0x5C）を書き込む必要があります。

CS

DOUT/RDY

0x5C

DATA

SCLK

図 7. AD7798、連続モード

Rev. 0DATA

DATA

14165-006

DIN－ 6/8 －AN-1479アプリケーション・ノート
コード例 3
NVIC_EnableIRQ(SPI0_EVT_IRQn);
pADI_SPI0->CS_OVERRIDE = 0;
pADI_SPI0->CTL =(1 << BITP_SPI_CTL_CON) |//連続(1 << BITP_SPI_CTL_CPOL) |//極性(1 << BITP_SPI_CTL_CPHA) |//フェーズ(1 << BITP_SPI_CTL_MASEN) |//マスタ(1 << BITP_SPI_CTL_SPIEN);//イネーブル

pADI_SPI0->IEN =(1 << BITP_SPI_IEN_IRQMODE);//2 バイトごとに tx 割込み

pADI_SPI0->CNT =NUM_VALUES * 2;//転送バイト数

pADI_SPI0->RD_CTL = (0 << BITP_SPI_RD_CTL_TXBYTES) |//読出しコマンドでは tx -1(1 << BITP_SPI_RD_CTL_CMDEN);//コマンド・モード

pADI_SPI0->FLOW_CTL = (1 << BITP_SPI_FLOW_CTL_RDBURSTSZ) |(1 << BITP_SPI_FLOW_CTL_RDYPOL) |//レディ信号の極性：ロー(3 << BITP_SPI_FLOW_CTL_MODE);//MISO ベースのフロー制御

pADI_SPI0->TX = 0x5C;//AD7798 を連続モードに設定

tmp = pADI_SPI0->RX;//転送を開始するためのダミー読出し

while(values < NUM_VALUES);

コード例 4
void SPI0_Int_Handler(){uint16_t aux = 0;if((pADI_SPI0->STAT & 0x20) == 0x20){//TX 終了}else if((pADI_SPI0->STAT & 0x40) == 0x40){//RX

pADI_SPI0->STAT = 0x22;

pADI_SPI0->STAT = 0xFFFF;//割込みをクリア

aux = (pADI_SPI0->RX << 8);
aux |= pADI_SPI0->RX;}//バースト -1}

buffer[values++] = aux;Rev. 0－ 7/8 －AN-1479

アプリケーション・ノート
まとめ
読出しコマンド・モードやフロー制御などの ADuCM4050 SPI の種々の機能により、このデバイスは、SPI ペリフェラルで MCUの負担を軽減するバッテリ駆動システムに最適で、データ収集に個別に使用できます。
これらの特性をハードウェアで実装することで、遅延やライン操作などの一部の動作が設定不要になるため、ユーザ・コードを 簡 略 化 で き ま す 。 ま た 、 MCU が 不 要 に な る た め 、ADuCM4050 の特性により電力量消費を高効率化できます。
ADuCM4050 の特性を、ダイレクト・メモリ・アクセス（DMA）およびフレキシ・モードと組み合わせて実装することにより、電力量効率と生産性を大幅に向上させることができます。

Rev. 0－ 8/8 －