シリアル ペリフェラルインターフェイス(S PI ) 23
23.4 オーディオ プロトコル インターフェイス モード
23.4.4 フレーム /LRCK エラー
23.4.5.1 I 2 S モード
I2S (Inter-IC Sound)プロトコルを使うと、2チャンネルのデジタル オーディオデータを1つの シリアル インターフェイスを介して送信できます。I2Sプロトコルは、WS/LRCKラインを使っ てステレオデータを処理する3線式インターフェイスを定義します。I2S仕様は、常に送信ま たは受信のどちらか一方だけをサポートする半二重インターフェイスを定義しています。SPI モジュールはSDOとSDIの両方を備えるため、全二重動作をサポートします(図23-22参照)。
• データ送信のタイミング
- トランスミッタは、LRCKの状態遷移より後の最初のSCK立ち上がりエッジで、オーディ オ サンプルデータのMSbをシフトします。
- レシーバは、2番目のSCK立ち上がりエッジでMSbをサンプリングします。
- 左チャンネルのデータは、LRCKのLOW期間中にシフトアウトされ、右チャンネルのデー タはLRCKのHIGH期間中にシフトアウトされます。
- 左および右チャンネルのデータは1つのフレームにより構成されます。
• 必要な設定
モジュールをI2Sモードに設定するには、下記のビットを設定する必要があります。
- AUDMOD<1:0> = 00 (SPIxCON2<1:0>) - FRMPOL = 0 (SPIxCON<29>)
- CKP = 1 (SPIxCON<6>)
これらのビット設定により、SCK (BCLK)の立ち下がりエッジでSDOとLRCK (SSx)の状態が 遷移し、SCKの立ち上がりエッジでSDIのサンプリングが発生します。図23-22を参照して ください。
図23-22: I2S (16ビットデータ/チャンネルまたは32ビットデータ/チャンネル)
Note: 一部のデバイスではこの機能を利用できません。詳細は各デバイスのデータシー
トを参照してください。
SSx (LRCK) SCKx (BCLK)
SDOx/SDIx MSb MSb-1 LSb+1 LSb MSb MSb-1 LSb+1 LSb
LEFT CHANNEL RIGHT CHANNEL
Transmit Sample
Left Channel LSb
Sample Transmit
Right Channel LSb
シリアル ペリフェラル インターフェイス (S PI ) 23
23.4.5.1.1 I2Sオーディオ スレーブモードの動作
SPIモジュールをI2Sオーディオ スレーブモードに設定する手順は下記の通りです。
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レジスタに適切な設定を書き込む。
a) AUDMOD<1:0>ビット(SPIxCON2<1:0>) = 00 b) AUDENビット(SPIxCON2<7>) = 1
9. SPIxCONレジスタに適切な設定を書き込む。
a) MSTEN (SPIxCON<5>) = 0 b) CKP (SPIxCON<6>) = 1
c) MODE<32,16> (SPIxCON<11:10>) = 0 (16ビット オーディオ チャンネル データ) d) ONビット(SPIxCON<15>)をセットしてSPIの動作を有効にする。
10.マスタがBCLKとLRCKの供給を開始するとただちに送信(および受信)が始まる。
例23-3: I2Sスレーブモード(16ビット チャンネルデータ/32ビットフレーム)
/* 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 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
SPI1CON =0x00008040; // Slave mode, SPI ON, CKP = 1, 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.1.2 I2Sオーディオ マスタモードの動作
典型的なアプリケーション例として、コーデック スレーブデバイスに接続してPCMデータ (サンプリング周波数: 8 kHz、16ビットデータ、32ビット フレームサイズ)を再生する場合 を想定します。この場合、256 kbpsのBCLKを生成するようSPIモジュールを初期化します。
周辺モジュール用バスクロックの周波数は40 MHz (FPB = 40e6)とします。baudレートの計算 式を式23-2に示します。
式23-2:
上式から、SPIxBRGは式23-3のように計算できます。
式23-3:
Baud Rateは256e3です。従ってSPIxBRGの値は式23-4のように求まります。
式23-4:
式23-4から求めたSPIxBRGの値に最も近い整数は77です。この値を使って、実効baudレー トは式23-5のように求まります。
式23-5:
この結果は目標値よりも0.16%高速ですが、ほとんどのシステムでは許容範囲内です(0.16%
は正確に1/625)。一部のデバイスでは、REFOTRIMレジスタを使ってこの誤差を修正でき、正
確に目標周波数のマスタクロックを出力できます。
SPIモジュールをI2Sオーディオ マスタモード向けに設定する手順は以下の通りです。
1. 割り込みが有効になっている場合、対応するIECxレジスタでSPI割り込みを無効にする。
2. ONビット(SPIxCON<15>)をクリアしてSPIモジュールを停止/リセットする。
3. SPIオーディオ コンフィグレーション レジスタ(SPIxCON2)をリセットする。
4. baudレートレジスタ(SPIxBRG)をリセットする。
5. 受信バッファをクリアする。
6. ENHBUFビット(SPIxCON<16>)をクリア(標準バッファモードを使う場合)またはセッ ト(拡張バッファモードを使う場合)する。
7. 割り込みを使う場合は以下を実行する。
a) 対応するIFSxレジスタのSPIx割り込みフラグ/イベントをクリアする。
b) 対応するIPCxレジスタのSPIx割り込み優先度および副優先ビットを設定する。
c) 対応するIECxレジスタのSPIx割り込みイネーブルビットをセットする。
8. SPIROVビット(SPIxSTAT<6>)をクリアする。
9. SPIxCON2レジスタに適切な設定を書き込む。I2Sモードに設定するには、AUDMOD<1:0>
ビット(SPIxCON2<1:0>)を「00」に設定し、AUDENビット(SPIxCON2<7>)を「1」に セットしてオーディオ プロトコルを有効にする必要がある。
10. SPIxBRG baudレート レジスタを0x4Dに設定する(40 MHzのPBCLKから約256 kbpsの サンプリング レートを生成)。
Baud Rate FPB 2SPIxBRG+1
---=
SPIxBRG FPB 2Baud Rate ---–1
=
SPIxBRG 40e6 2 256e3
---–1=77.125
=
40e6 277+1
--- 40e6
---156 256410.25 bits per second
= =
シリアル ペリフェラル インターフェイス (S PI ) 23
11. SPIxCONレジスタに適切な設定を書き込む。
a) MSTEN (SPIxCON<5>) = 1 b) CKP (SPIxCON<6>) = 1
c) MODE<32,16> (SPIxCON<11:10>) = 0 (16ビット オーディオ チャンネル データ) d) ONビット(SPIxCON<15>)をセットしてSPIの動作を有効にする。
12. ONビットをセットすると送信(および受信)が即座に始まる。
例23-4: I2Sマスタモード(256 kbps BCLK、16ビット チャンネルデータ、32ビットフレーム) /* The following code example will initialize the SPI1 Module in I2S 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 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) SPI1CON =0x00008060; // Master mode, SPI ON, 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.*/
23.4.5.2 左寄せモード
左寄せモードはI2Sモードに似ていますが、SPIはLRCKの遷移と同時に発生するSCKエッジ でオーディオデータのMSbをシフトします。レシーバ側のSPIモジュールは、その次のSCK エッジでMSbをサンプリングします。
一般的に左または右寄せプロトコルを使うコーデックは、「SCK 立ち上がりエッジでデータ送 信/SCK立ち下がりエッジでデータ受信」を既定値とします。
• 必要な設定
モジュールを左寄せモードに設定するには、下記のビットを設定する必要があります。
- AUDMOD<1:0> = 01 (SPIxCON2<1:0>) - FRMPOL = 1 (SPIxCON<29>)
- CKP = 0 (SPIxCON<6>)
これにより、SDOとLRCKはSCK立ち上がりエッジに同期して遷移します。16/24/32ビット オーディオデータ転送のサンプル波形を図23-23と図23-24に示します。
図23-23: 左寄せモード(16ビット データ/チャンネルまたは32ビット データ/チャンネル)
図23-24: 左寄せモード(16/24ビットデータ、32ビット チャンネル)
SSx (LRCK) 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) SCKx (BCLK)
SDOx/SDIx MSb LSb MSb LSb
LEFT CHANNEL RIGHT CHANNEL
Transmit Sample TransmitSample
0
0 0 0
シリアル ペリフェラル インターフェイス (S PI ) 23
23.4.5.2.1 左寄せオーディオ スレーブモードの動作
SPIモジュールを左寄せオーディオ スレーブモードに設定する手順は下記の通りです。
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レジスタに適切な設定を書き込む。左寄せモードに設定するには、AUDMOD<1:0>
ビット(SPIxCON2<1:0>)を「01」に設定し、AUDENビット(SPIxCON2<7>)を「1」に セットしてオーディオ プロトコルを有効にする必要がある。
9. SPIxCONレジスタに適切な設定を書き込む。
a) スレーブモード(MSTEN (SPIxCON<5>) = 0)に設定する b) クロック極性を設定する(CKP (SPIxCON<6>) = 0) c) フレーム極性を設定する(FRMPOL (SPIxCON<29>) = 1)
d) 16ビット オーディオ チャンネル データ(MODE<32,16> (SPIxCON<11:10>) = 0)に 設定する
e) ONビット(SPIxCON<15>)をセットしてSPIの動作を有効にする。
10.マスタがBCLKとLRCKの供給を開始するとただちに送信(および受信)が始まる。
例23-5: 左寄せスレーブモード(16ビット チャンネルデータ、32ビットフレーム)
/* The following code example will initialize the SPI1 Module in Left-Justified 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=0x00000081; // Left-Justified Mode, AUDEN = 1, AUDMON = 0 SPI1CON =0x20008000; // Slave mode, SPI ON, CKP = 0, FRMPOL = 1, // 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.2.2 左寄せオーディオ マスタモードの動作
SPIモジュールを左寄せオーディオ マスタモードに設定する手順は下記の通りです。
1. 割り込みを有効にしている場合、対応するIECxレジスタでSPI割り込みを無効にする。
2. ONビット(SPIxCON<15>)をクリアしてSPIモジュールを停止/リセットする。
3. SPIオーディオ コンフィグレーション レジスタ(SPIxCON2)をリセットする。
4. baudレートレジスタ(SPIxBRG)をリセットする。
5. 受信バッファをクリアする。
6. ENHBUFビット(SPIxCON<16>)をクリア(標準バッファモードを使う場合)またはセッ ト(拡張バッファモードを使う場合)する。
7. SPI割り込みを使う場合は下記を行う。
a) 対応するIFSxレジスタのSPIx割り込みフラグ/イベントをクリアする。
b) 対応するIPCxレジスタのSPIx割り込み優先度および副優先ビットを設定する。
c) 対応するIECxレジスタのSPIx割り込みイネーブルビットをセットする。
8. SPIROVビット(SPIxSTAT<6>)をクリアする。
9. SPIxCON2レジスタに適切な設定を書き込む。左寄せモードに設定するには、AUDMOD<1:0>
ビット(SPIxCON2<1:0>)を「01」に設定し、AUDENビット(SPIxCON2<7>)を「1」に セットしてオーディオ プロトコルを有効にする必要がある。
10. SPIxBRG baudレート レジスタを0x4Dに設定する(40 MHzのPBCLKから約256 kbpsの サンプリング レートを生成)。
11. SPIxCONレジスタに適切な設定を書き込む。
a) マスタモード(MSTEN (SPIxCON<5>) = 1)に設定する b) クロック極性を設定する(CKP (SPIxCON<6>) = 0) c) フレーム極性を設定する(FRMPOL (SPIxCON<29>) = 1)
d) 16ビット オーディオ チャンネル データ(MODE<32,16> (SPIxCON<11:10>) = 0)に 設定する
e) ONビット(SPIxCON<15>)をセットしてSPIの動作を有効にする。
12. ONビットをセットすると、送信(および受信)が即座に始まる。
例23-6: 左寄せマスタモード(16ビット チャンネルデータ、32ビットフレーム)
/* The following code example will initialize the SPI1 Module in Left-Justified 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 SPI1BRG = 0;
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=0x00000081; // Left-Justified Mode, AUDEN = 1, AUDMON = 0
SPI1BRG =0x4D; // (to generate 256 kbps sample rate, PBCLK @ 40 MHz) SPI1CON =0x20008040; // Master mode, SPI ON, CKP = 0, FRMPOL = 1, MSTEN = 1
// 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.*/