Mini210S 開発キットOSなしのプログラム開発手順連載(28)

Mini210S/Tiny210等開発ボード関連のフォラーム

Mini210S 開発キットOSなしのプログラム開発手順連載(28)

投稿記事by dwtechadm » 月 5 13, 2013 12:05 pm

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の起動音がループで聞こえます。




---続く
dwtechadm
 
記事: 60
登録日時: 月 2 25, 2013 1:35 pm

Return to Cortex-A8関連

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[0人]

cron