Mini210S 開発キット詳細URL
第XXII章 WM8960 オーディオ再生
第一節 音频播放原理オーディオ再生の原理
S5PV210はI2S/i2cを通じてオーディオコーデックチップwm8960と交信します。I2S機能は音声データの送信;I2Cの機能は制御情報を伝送します(例えば、ボリュームコントロール、ミュートなど)、wm8960機能はエンコードとデコード。 wm8960を駆動されるには、手順は3つあります::(1) i2s初期化、 (2) i2c初期化、 (3) wm8960初期化。
Mini210S 回路図:
第二節 プログラム説明
完全なコードは、ディレクトリ22.audioご参照ください。
1. Makefile
makefile でプログラムのリンクアドレスを0x21000000と設定します、すなわちプログラムは0x21000000でしか作動できません、よって、プログラムは最初にメモリ0x21000000にダウンロードする必要があります。
2. main.c
コード:
void main(void)
{
printf("Audio Test\r\n");
int offset = 0x2E; // オーディオデータ開始アドレス
short * p = (short *)0x22000000; // オーディオファイルの開始位置
iic_init(); // i2c初期化
wm8960_init(); // wm8960初期化
iis_init(); // iis初期化
//オーディオファイルのループ再生
while (1)
{
// polling Primary Tx FIFO0 full status indication.
while((IISCON & (1<<8)) == (1<<8));
IISTXD = *(p+offset); // 毎回 2byteデータを送信
offset++;
if (offset > (882046-0x2e) /2) // 2byteの数 = (ファイルサイズ - オフセット)/2
offset = 0x2E;
}
}
main 関数に手順は4つあります:
ステップ 1 iic_init()関数を呼び出し、i2cを初期化;
ステップ 2 wm8960_init()関数を呼び出し、wm8960を初期化;
ステップ 3 iis_init()関数を呼び出し、i2sを初期化;
ステップ 4 i2s でオーディオデータを送信、オーディオファイルのループ再生します;
3. audio.c
audio.c のコア関数を説明します。
関数一 iic_init():
void iic_init(void)
{
GPD1CON |= 0x22; //ピン•コンフィギュレーション
GPD1PUD |= 0x5;
I2CCON0 = (1<<7) | (0<<6) | (1<<5) | (0xe);
I2CSTAT0 = 0x10;
}
i2c 初期化は3つの手順があります:
ステップ 1 ピンをコンフィグし、i2c機能を有効にします;
ステップ 2 i2cコントローラをコンフィグし、クロック設定、ackを有効にするなど;
ステップ 3 受信/送信機能を有効にします;
関数二 iic_write ():
void iic_write(int slave_addr、 int addr、 int data)
{
// アドレス
I2CDS0 = slave_addr;
// s シングルとアドレス送信
I2CSTAT0 = 0xf0;
// 待ち
while ((I2CCON0 & 0x10) == 0); // データ送信待ち
while ((I2CSTAT0 & 0x1)); //スレーブからACKの返信待ち
// 7bitのアドレスと9bit のデータ
I2CDS0 = addr<<1 | ((data>>8) & 0x0001);
I2CCON0 &= ~(1<<4); // 割り込みクリア
while ((I2CCON0 & 0x10) == 0); // データ送信待ち
while ((I2CSTAT0 & 0x1)); // スレーブからACKの返信待ち
I2CDS0 = (data & 0x00FF);
I2CCON0 &= ~(1<<4); // 割り込みクリア
while ((I2CCON0 & 0x10) == 0); // データ送信待ち
while ((I2CSTAT0 & 0x1)); // スレーブからACKの返信待ち
// p情報送信
I2CSTAT0 = 0xd0;
I2CCON0 &= ~(1<<4); //割り込みクリア
//待ち遅延
int i=0;
for(i=0; i<50; i++);
return;
}
i2c 書き込みは3つの手順があります:
ステップ 1 s シングルとアドレスを送信します、 slave_addr の bit[0:6]は 7bitのデバイスアドレス、bit[7]=0は送信;送信終了後、ACK応答を待ちます;
ステップ 2 16bitのデータを送信的数据、先頭7bitのデータはレジスタのオフセットアドレス、次の 9bitはレジスタの値です;
ステップ 3 p シングル送信、終了を表示します;
ステップ 4 遅延、p シングル送信完了を待ちます;
関数三 wm8960_init ():
void wm8960_init(void)
{
#define WM8960_DEVICE_ADDR
0x34
// リセット
iic_write(WM8960_DEVICE_ADDR、 0xf、 0x0);
// 電源設定
iic_write(WM8960_DEVICE_ADDR、 0x19、 1<<8 | 1<<7 | 1<<6);
iic_write(WM8960_DEVICE_ADDR、 0x1a、 1<<8 | 1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<3);
iic_write(WM8960_DEVICE_ADDR、 0x2F、 1<<3 | 1<<2);
// クロック設定
iic_write(WM8960_DEVICE_ADDR、 0x4、 0x0);
// ADC-DAC設定
iic_write(WM8960_DEVICE_ADDR、 0x5、 0x0);
…
}
wm8960_init()は iic_write()を呼び出して wm8960チップを初期化します、手順は wm8960チップマニュアルご参照ください:
ステップ 1 wm8960のデバイスアドレスを確認します、wm8960チップマニュアルで検索して、そのデバイスアドレスは0x1aです。左に1bitを移動し、低位(最後尾)に0(送信後)を変更します。WM8960_DEVICE_ADDR = 0x34、 reset;
ステップ 2 power1 2 3を設定;
ステップ 3 クロックをを設定;
ステップ 4 ADC-DACを設定、(非静音);
ステップ 5 audio interfaceを設定;
ステップ 6 volumeを設定;
ステップ 7 mixerを設定;
関数四 iis_init ():
void iis_init(void)
{
int N;
// ピン・コンフィギュレーション、 i2s機能を有効にする;
GPICON = 0x22222222;
// i2s 関連クロックを設定;
EPLL_CON0 = 0xa8430303; // MPLL_FOUT = 67.7Mhz
EPLL_CON1 = 0xbcee; // from linux kernel setting
CLK_SRC0 = 0x10001111;
CLK_CON = 0x1; // 1 = FOUT_EPLL MUXI2S_A 00 = Main CLK
// i2sコントローラを設定;
N = 5;
IISPSR = 1<<15 | N<<8;
IISCON |= 1<<0 | (unsigned)1<<31;
IISMOD = 1<<9 | 0<<8 | 1<<10;
}
}
i2s初期化は3つの手順があります:
ステップ 1 ピンをコンフィグし、 i2s機能を有効にします;
ステップ 2 i2s 関連クロックを設定します: EPLL_CON0設定、EPLLに67.7Mhzを出力され、クロックスイッチCLK_SRC0を設定します;
ステップ 3 i2sコントローラを設定します:分周設定、クロック選択、受送信モード設定;
第三節 コードコンパイルとプログラミングの実行
コードをコンパイルし、Fedora端末で下記のコマンドを実行します:
# cd 22.audio
# make
22.audioのディレクトリ下にaudio.binを生成し、それを開発ボードにプログラムします。
プログラムshell.binを使用し、audio.bin とオーディオファイルをDRAMにプログラミングします:
loadb について:
loadb ファイルサイズ メモリアドレス、 loadbを実行後、シリアルポートでファイルを発送できます。
loadb 11056 0x21000000: audio.binをメモリ 0x21000000 までダウンロードします。
loadb 882046 0x22000000: WindowsXP.wavをメモリ0x22000000までダウンロードします。
最後にgoコマンドを実行し、0x2100000にジャンプしaudio.binのコードを実行します。
第四節 実験現象
開発ボードにヘッドフォンをプラグインし、Windows XPの起動音がループで聞こえます。
---続く