シリアル ペリフェラルインターフェイス(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ビットの設定は受信データに影響しません。