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

PCM/DSP モード

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

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

23.4 オーディオ プロトコル インターフェイス モード

23.4.4 フレーム /LRCK エラー

23.4.5.4 PCM/DSP モード

PCM/DSP プロトコルモードは、特定のコーデックおよび DSP デバイスとの通信用に使いま

す。このモードは、LRCKの挙動とオーディオデータの間隔を変更します。PCM/DSP モード の場合、LRCKは1ビット幅(つまり1 SCK)またはオーディオデータと同じ幅(16、24、32 ビット)に設定できます。右チャンネルのオーディオデータは、左チャンネルデータの直後に 続けてフレームに格納されます。デバイスがマスタである場合、フレーム長は 32または64ク ロックです。

PCM/DSPモードの場合、トランスミッタはLRCKの遷移と同時または遷移後最初の SCK送

信エッジで左チャンネル オーディオデータのMSbを駆動します(SPIFEビット(SPIxCON<17>)

参照)。トランスミッタは、左チャンネルのLSbの直後に右チャンネルのMSbを駆動します。

• 必要な設定

モジュールをPCM/DSPモードに設定するには、下記のビットを設定する必要があります。

- AUDMOD<1:0>ビット(SPIxCON2<1:0>) = 11

16/24/32ビット オーディオデータ転送のサンプル波形を図23-27と図23-28に示します。

23-27: PCM/DSPモード(16ビット データ/チャンネルまたは32ビット データ/チャンネル)

23-28: PCM/DSPモード(16/24ビットデータ、32ビット チャンネル) (FRMSYPW = 1)

SCKx (BCLK)

SDOx/SDIx MSb MSb-1 LSb+1 LSb MSb MSb-1 LSb+1 LSb

LEFT CHANNEL RIGHT CHANNEL

Transmit Sample TransmitSample

SSx (LRCK) (FRMSYPW = 0)

LEFT CHANNEL RIGHT CHANNEL

SSx (LRCK)

(SPIFE = 1)

SSx (LRCK) SCKx (BCLK)

SDOx/SDIx MSb LSb MSb LSb

LEFT CHANNEL RIGHT CHANNEL

Transmit Sample TransmitSample

0 0

0

SSx (LRCK) LEFT CHANNEL RIGHT CHANNEL

(FRMSYPW = 1) (FRMSYPW = 0)

0

(SPIFE = 0)

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

23.4.5.4.1 PCM/DSPオーディオ スレーブモードの動作

SPIモジュールをPCM/DSPオーディオ スレーブモードに設定する手順は下記の通りです。

1. 割り込みを有効にしている場合、対応するIECxレジスタでSPI割り込みを無効にする。

2. ONビット(SPIxCON<15>)をクリアしてSPIモジュールを停止/リセットする。

3. SPIオーディオ コンフィグレーション レジスタ(SPIxCON2)をリセットする。

4. 受信バッファをクリアする。

5. ENHBUFビット(SPIxCON<16>)をクリア(標準バッファモードを使う場合)またはセッ ト(拡張バッファモードを使う場合)する。

6. SPI割り込みを使う場合は下記を行う。

a) 対応するIFSxレジスタのSPIx割り込みフラグ/イベントをクリアする。

b) 対応するIPCxレジスタのSPIx割り込み優先度および副優先ビットを設定する。

c) 対応するIECxレジスタのSPIx割り込みイネーブルビットをセットする。

7. SPIROVビット(SPIxSTAT<6>)をクリアする。

8. SPIxCON2 レジスタに適切な設定を書き込む。PCM/DSP モードに設定するには、AUDMOD<1:0>

ビット(SPIxCON2<1:0>)を「11」に設定し、AUDENビット(SPIxCON2<7>)を「1」に セットしてオーディオ プロトコルを有効にする必要がある。

9. SPIxCONレジスタに適切な設定を書き込む。

a) スレーブモード(MSTEN (SPIxCON<5>) = 0)に設定する。

b) 16ビット オーディオ チャンネル データ(MODE<32,16> (SPIxCON<11:10>) = 0)に 設定する

c) ONビット(SPIxCON<15>)をセットしてSPIの動作を有効にする。

10.マスタがBCLKとLRCKの供給を開始するとただちに送信(および受信)が始まる。

23-9: PCM/DSPスレーブモード(16ビット チャンネルデータ、32ビットフレーム)

/* The following code example will initialize the SPI1 Module in PCM/DSP Slave Mode.*/

/* It assumes that none of the SPI1 input pins are shared with an analog input.*/

unsigned int rData;

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

SPI1CON2 = 0; // Reset audio settings 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 SPI1STATCLR=0x40; // clear the Overflow

SPI1CON2=0x00000083; // PCM/DSP Slave Mode, AUDEN = 1, AUDMON = 0 SPI1CON =0x00008000; // Slave mode, SPI ON, FRMSYPW = 0

// 16-bit audio data, 32 bits per frame // from here, the device is ready to receive and transmit data

/* Note:A few of bits related to frame settings are not required to be set in the SPI1CON */

/* register during audio mode operation.Please refer to the notes in the SPIxCON2 register.*/

23.4.5.4.2 PCM/DSPオーディオ マスタモードの動作

SPIモジュールをPCM/DSPオーディオ マスタモードに設定する手順は下記の通りです。

1. 割り込みを有効にしている場合、対応するIECxレジスタでSPI割り込みを無効にする。

2. ONビット(SPIxCON<15>)をクリアしてSPIモジュールを停止/リセットする。

3. SPIオーディオ コンフィグレーション レジスタ(SPICON2)をリセットする。

4. baudレートレジスタ(SPIxBRG)をリセットする。

5. 受信バッファをクリアする。

6. ENHBUFビット(SPIxCON<16>)をクリア(標準バッファモードを使う場合)またはセッ ト(拡張バッファモードを使う場合)する。

7. 割り込みを使う場合、以下を実行する。

a) 対応するIFSxレジスタのSPIx割り込みフラグ/イベントをクリアする。

b) 対応するIPCxレジスタのSPIx割り込み優先度および副優先ビットを設定する。

c) 対応するIECxレジスタのSPIx割り込みイネーブルビットをセットする。

8. SPIROVビット(SPIxSTAT<6>)をクリアする。

9. SPIxCON2レジスタに適切な設定を書き込む。PCM/DSP モードに設定するには、AUDMOD<1:0>

ビット(SPIxCON2<1:0>)を「11」に設定し、AUDENビット(SPIxCON2<7>)を「1」に セットしてオーディオ プロトコルを有効にする必要がある。

10. SPIxBRG baudレート レジスタを0x4Dに設定する(40 MHzのPBCLKから約256 kbpsの サンプリング レートを生成)。

11. SPIxCONレジスタに適切な設定を書き込む。

a) マスタモード(MSTEN (SPIxCON<5>) = 1)に設定する

b) 16ビット オーディオ チャンネル データ(MODE<32,16> (SPIxCON<11:10>) = 0)に 設定する

c) ONビット(SPIxCON<15>)をセットしてSPIの動作を有効にする

12. ONビットをセットすると、送信(および受信)が即座に始まる。

23-10: PCM/DSPマスタモード(16ビット チャンネルデータ、32ビットフレーム)

/*The following code example will initialize the SPI1 Module in PCM/DSP Master Mode.*/

/* It assumes that none of the SPI1 input pins are shared with an analog input.*/

unsigned int rData;

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

SPI1CON2 = 0; // Reset audio settings 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 SPI1STATCLR=0x40; // clear the Overflow

SPI1CON2=0x00000083; // PCM/DSP Master Mode, AUDEN =1, AUDMON=0

SPI1BRG =0x4D; // (to generate 256 kbps sample rate, PBCLK @ 40 MHz) SPI1CON =0x00008020; // Master mode, SPI ON, FRMSYPW = 0

// 16-bit audio data, 32 bits per frame // from here, the device is ready to receive and transmit data

/* Note:A few of bits related to frame settings are not required to be set in the SPI1CON */

/* register during audio mode operation.Please refer to the notes in the SPIxCON2 register.*/

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

23.4.6 オーディオ プロトコルモードの機能

23.4.6.1 BCLK/SCKとLRCKの生成

マスタモードではBCLKとLRCKの生成が重要要件です。SCKとLRCKのフレーム周波数は MODE<32,16>ビット(SPIxCON<11:10>)の設定によって決まります。フレームが64 bitの場 合、SCKの周波数はLRCKの64倍です。フレームが32 bitの場合、SCKの周波数はLRCKの 32倍です。SCKの周波数は、LRCKのトグルレートとフレームサイズから求める必要があり ます。

例えばPBCLK = 36.864 MHzの場合、16ビット チャンネルデータを8 kHzでサンプリングす るには、SPIxBRGレジスタを「0x47」に設定して8 kHzのLRCKを生成します。

23.4.6.2 マスタモードのクロックとMCLK

マスタモードのSPIモジュールは、PBCLK (MCLKSEL = 0)を使って内部でBCLKとLRCK を生成できます。参照出力(REFCLKO)機能を使うと、SPIモジュールから外部コーデックデ バイスにクロックを供給できます(図23-29参照)。しかし、一部のコーデックは水晶振動子 を使って内部でMCLKを生成し、より正確なオーディオ サンプリングレートを生成できます。

図23-30に示すREFCLKOクロックは、コーデックでMCLKINとして使えます。

23-29: SPIマスタクロックの生成

参照クロック出力インターフェイスの詳細については、各デバイスのデータシートを参照して ください。

図 23-30 に、MCLK 入力インターフェイスからクロックの供給を受けるコーデックマスタと

SPIスレーブ間の接続を示します。

23-30: SPIスレーブとコーデックマスタの接続 – SPIスレーブからMCLKを供給 Baud Rate

Generator BCLK

USB-PLL SOSC

LPRC FRC POSC

PBCLK System Clock

MCLK

MCLKSEL

ReferenceClock Output

REFCLKO

SCKx

SSx

SDIx SDOx

BCLK

LRCK

ADCDAT DACDAT PIC32

[SPI Slave]

Codec [Master]

REFCLKO MCLKIN

23.4.6.2.1 REFCLKOを使うI2Sオーディオ マスタモードの動作

MCLKを使うI2Sオーディオ マスタモード向けにSPIモジュールを設定する手順について説明

します。BCLK (256 kbps)を生成するようSPIモジュールを初期化し、参照オシレータ出力コン

フィグレーション レジスタを使ってPBCLKからMCLKを生成します。典型的なアプリケーショ ン例として、コーデック スレーブデバイスに接続してPCMデータ (サンプリング周波数: 8 kHz、

16ビットデータ、32ビット フレーム)を再生する場合を想定します。

1. 割り込みを有効にしている場合、対応するIECxレジスタでSPI割り込みを無効にする。

2. ONビット(SPIxCON<15>)をクリアしてSPIモジュールを停止/リセットする。

3. SPIオーディオ コンフィグレーション レジスタ(SPIxCON2)をリセットする。

4. 参照オシレータ コントローラ レジスタ(REFOCON)をリセットする。

5. baudレートレジスタ(SPIxBRG)をリセットする。

6. 受信バッファをクリアする。

7. ENHBUFビット(SPIxCON<16>)をクリア(標準バッファモードを使う場合)またはセッ ト(拡張バッファモードを使う場合)する。

8. SPI割り込みを使う場合は下記を行う。

a) 対応するIFSxレジスタのSPIx割り込みフラグ/イベントをクリアする。

b) 対応するIPCxレジスタのSPIx割り込み優先度および副優先ビットを設定する。

c) 対応するIECxレジスタのSPIx割り込みイネーブルビットをセットする。

d) SPIROVビット(SPIxSTAT<6>)をクリアする。

9. SPIxCON2レジスタに適切な設定を書き込む。I2Sモードに設定するには、AUDMOD<1:0>

ビット(SPIxCON2<1:0>)を「00」に設定し、AUDENビット(SPIxCON2<7>)を「1」に セットしてオーディオ プロトコルを有効にする必要がある。

10.参照オシレータ コントローラ レジスタ(REFOCON)を設定する。

a) RODIV<14:0> (REFOCON<30:16>) = 0

b) ON (REFOCON<15>) = 1 (参照オシレータ有効) c) OE (REFOCON<4>) = 1 (出力有効)

11. SPIxBRG baudレート レジスタを0x4Dに設定する(40 MHzのPBCLKから約256 kbpsの サンプリング レートを生成)。

12. SPIxCONレジスタに適切な設定を書き込む。

a) MSTEN (SPIxCON<5>) = 1 b) CKP (SPIxCON<6>) = 1

c) MODE<32,16> (SPIxCON<11:10>) = 0 (16ビット オーディオ チャンネル データ) d) MCLKSEL (SPIxCON<23>) = 1 (マスタモード)

e) ONビット(SPIxCON<15>)をセットしてSPIの動作を有効にする。

13.マスタがBCLKとLRCKの供給を開始するとただちに送信(および受信)が始まる。

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

23-11: I2Sマスタモード(256 kbps BCLK、16ビット チャンネルデータ、32ビットフレーム)

23.4.7 モノラルモードとステレオモード

SPIモジュールはAUDMONOビット(SPIxCON2<3>)の設定に従ってモノラルまたはステレオ モードでオーディオデータを転送できます。AUDMONOビットを「0」(ステレオモード)に設 定すると、シフトレジスタから FIFO の各バッファ位置に一度ずつ書き込みます。つまり、ス テレオデータの各チャンネルに対して別々のデータストリームを割り当てます。AUDMONO ビットを「1」(モノラルモード)に設定すると、シフトレジスタからFIFO の各位置に二度書 き込みます。つまり、両方のチャンネルに対して同じモノラル データストリームを割り当てま す。

23.4.8 ストリーミング データのサポートとエラー処理

ほとんどのオーディオ ストリーミング アプリケーションは、データを連続的に送信または受 信します。これは動作中にチャンネルをアクティブ状態に維持し、最大限の精度を保証するた めに必要です。オーディオデータのストリーミングに起因して集中的なデータ供給やパケット の損失が生じ、モジュールにアンダーランに似た状況が発生する場合があります。ソフトウェ アはアンダーラン状態からの回復に関与する必要があります。

送信アンダーラン無視(IGNTUR)ビット(SPIxCON2<8>)を「1」にセットすると、アンダーラ ン条件は無視されます。この設定は、ソフトウェアによるアンダーラン条件の検出と対応が不 要な場合に便利です。SPITUREN ビット (SPIxCON2<10>) を「1」にセットした場合、 アン ダーランが発生するとSPIモジュールはSPITURビット(SPIxSTAT<8>)をセットし、ソフト ウェアがエラー状態をクリアするかONビット(SPIxCON<15>)が「0」にクリアされるまでエ ラー状態を維持します。

アンダーラン条件中、SPIモジュールはSPIxTXBレジスタからSPIxSRレジスタにデータを転 送せず、かわりにゼロを書き込んでゼロを送信し続けます。エラー条件がクリアされると(つ

まりSPIxTXBレジスタがエンプティではなくなると)、SPIモジュールは次のLRCKフレーム

境界で送信バッファからSPIxSRレジスタにオーディオデータを転送します。ソフトウェアは、

常に左右チャンネルのオーディオデータをペアにしてFIFOに転送する必要があります。

受信オーバーフロー無視(IGNROV)ビット(SPIxCON2<9>)を「1」にセットすると、受信オー バーフロー条件を無視します。この設定は、ソフトウェアで適切に対処する必要のある一般的 な性能上の問題がシステムに存在する場合に便利です。また、システムがオーディオデータを 受信する必要がない場合、DISSDIビット(SPIxCON<4>)を「1」にセットすれば受信オーバー フローの発生を防げます。動作中にDISSDIビットを変更すると、受信シフトレジスタはLRCK /* The following code example will initialize the SPI1 Module in I2S Slave mode.

/* It assumes that none of the SPI1 input pins are shared with an analog input.*/

unsigned int rData;

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

SPI1CON2 = 0; // Reset audio settings

REFOCON = 0x0; // Reset reference oscillator register SPI1BRG=0; // Reset Baud rate register

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 SPI1STATCLR=0x40; // clear the Overflow

SPI1CON2=0x00000080; // I2S Mode, AUDEN =1, AUDMON=0

SPI1BRG =0x4D; // (to generate 256 kbps sample rate, PBCLK @ 40 MHz) REFOCON = 0x8001; // ON = 1, ROSEL = 1 for PBCLK

SPI1CON =0x00808060; // MCLKSEL = 1, MSTEN = 1, ON = 1, CKP = 1, 16-bit audio channel // data, 32-bits per frame

// from here, the device is ready to receive and transmit data

/* Note:A few of bits related to frame settings are not required to be set in the SPI1CON */

/* register during audio mode operation.Please refer to the notes in the SPIxCON2 register.*/

Note: 参照クロック出力を使ってコーデックにMCLKを供給する方式は最善の選択とは

言えません。I/Oピンでクロックを出力するとジッタが生じるため、コーデックの 音質に劣化を招く可能性があります。コーデックをマスタ I2S オーディオデバイ スにして水晶振動子を使うのが最善の方法です。

Note: AUDMONOビットの設定は受信データに影響しません。

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

関連したドキュメント