?? audio_aic23.c
字號:
/**************************************************************
程序說明 :AIC23數(shù)字音頻處理控制系統(tǒng)實(shí)驗(yàn)
說 明 :
FreeDev 數(shù)字應(yīng)用開發(fā)板采用了TI公司的TVL320AIC23
1、控制接口使用I2C,Quartus中將CS置低(器件地址0011010)。
2、數(shù)字音頻接口使用了組件FreeDev_aic23,可實(shí)現(xiàn)輪訓(xùn)方式讀寫,
中斷方式讀寫,錄音、和放音
3、I2C IP 和 FreeDev_aic23 IP分別在Quartus 工程目錄中
**************************************************************/
#include <stdio.h>
#include <system.h>
#include <io.h>
#include <alt_types.h>
#include <sys/alt_irq.h>
#include <sys/alt_dma.h>
#include "fast_dma.h"
#include <altera_avalon_dma_regs.h>
#define AUDIO_BUFF_SIZE 0x80000
extern void *dma_base;
extern int gControl_bits;
unsigned int infifo_count;
/*********************************************
函數(shù)名:audio_irq
功 能:音頻中斷處理函數(shù)
輸 入:context:相關(guān)內(nèi)容指針,中斷號
返 回:
備 注:
讀取音頻外設(shè)數(shù)據(jù),并回放寫入到音頻外設(shè)中
**********************************************/
void audio_irq(void *context,alt_u32 interrupt)
{
unsigned int fifo_status;
unsigned int len;
fifo_status=IORD(FREEDEV_AIC23_0_BASE,0x03);
infifo_count=IORD(FREEDEV_AIC23_0_BASE,0x04);
if(fifo_status & 0x04)
len=512;
else
len=infifo_count;
// 啟動DMA傳輸
IOWR_ALTERA_AVALON_DMA_LENGTH(dma_base,len);
IOWR_ALTERA_AVALON_DMA_CONTROL(dma_base, gControl_bits|ALTERA_AVALON_DMA_CONTROL_GO_MSK);
}
int main()
{
FILE * hostfile ;
int iRet;
unsigned char ch;
unsigned int v1,v2,v3,v4,i;
static int irq_flag=0;
unsigned int *audioBuff=(unsigned int *)(SDRAM_BASE+0x200000);
// 初始化DMA參數(shù)
iRet=fast_dma_init(
DMA_BASE,
4,
__IO_CALC_ADDRESS_NATIVE(FREEDEV_AIC23_0_BASE, 0x07),
__IO_CALC_ADDRESS_NATIVE(FREEDEV_AIC23_0_BASE, 0x07),
512,
ALTERA_AVALON_DMA_CONTROL_RCON_MSK|ALTERA_AVALON_DMA_CONTROL_WCON_MSK);
//初始化I2C控制器
init_i2c(FREEDEV_I2C_0_BASE);
// 屏蔽音頻中斷
IOWR(FREEDEV_AIC23_0_BASE,0x02,0x03);
/* 注冊音頻中斷處理函數(shù) */
if (alt_irq_register( FREEDEV_AIC23_0_IRQ, NULL,audio_irq))
{
printf("alt_irq_register audio_irq error\n");
return -1;
}
// 提示菜單
menu:
MenuHeader();
ch=ShowSelect( "進(jìn)入測試系統(tǒng)? Y OR N",'y','n' );
if(ch=='n')
exit(0);
//復(fù)位音頻處理芯片
aic23_reset();
ch=ShowSelect( "需要測試模擬環(huán)路音頻處理嗎?y OR n",'y','n' );
if(ch=='y'){
// 屏蔽輸入中斷
IOWR(FREEDEV_AIC23_0_BASE,0x02,0x03);
//模擬環(huán)路測試參數(shù)設(shè)置,如需要測試模擬環(huán)路,打開下列函數(shù)注解
//模擬環(huán)路說明:模擬信號由LINE IN接入,經(jīng)TLV320AIC23內(nèi)部
//模擬開關(guān)短接到LINE OUT和PHONE OUT輸出
aic23_analog_bypass_test();
goto menu;
}else{
// 屏蔽輸入中斷
IOWR(FREEDEV_AIC23_0_BASE,0x02,0x03);
//TLV320AIC23常規(guī)工作參數(shù)設(shè)置
aic23_normal_setup();
//FreeDev_aic模塊工作模式切換實(shí)驗(yàn)
ch=ShowSelect( "需要測試NIOS II系統(tǒng)軟件輪訓(xùn)方式實(shí)時采集和回放處理嗎?y OR n",'y','n' );
if(ch=='y'){
//FreeDev_aic接口模塊控制切換到DMA模式
//DMA模式說明:FreeDev_aic模塊通過TLV320AIC23的串行數(shù)字接口接收數(shù)據(jù),變換成32BIT左右
//聲道數(shù)據(jù),經(jīng)異步FIFO送到Avalone接口端,供Nios II DMA方式讀取數(shù)據(jù)。Nios II輸出數(shù)據(jù)經(jīng)
//Avalone接口寫入FIFO傳輸?shù)讲⒋D(zhuǎn)換模塊,由TLV320AIC23串行數(shù)字接口輸出。
IOWR(FREEDEV_AIC23_0_BASE,0x00,0x0201);
//復(fù)位FreeDev_aic23外設(shè)FIFO
IOWR(FREEDEV_AIC23_0_BASE,0x01,0x01);
IOWR(FREEDEV_AIC23_0_BASE,0x01,0x00);
// 啟動數(shù)據(jù)接收
IOWR(FREEDEV_AIC23_0_BASE,0x01,0x02);
//循環(huán)讀入并輸出音頻信號
while(1){
//讀音頻外設(shè)狀態(tài)
v1=IORD(FREEDEV_AIC23_0_BASE,0x03);
// 輸入FIFO不為空 或 輸入FIFO為滿
if(!(v1 & 0x08) || (v1 & 0x04) )
{
v2=IORD(FREEDEV_AIC23_0_BASE,0x07);
IOWR(FREEDEV_AIC23_0_BASE,0x07,v2);
}
}
}
ch=ShowSelect( "需要測試NIOS II系統(tǒng)中斷方式實(shí)時采集和回放處理嗎?y OR n",'y','n' );
if(ch=='y'){
//FreeDev_aic接口模塊控制切換到DMA模式
//DMA模式說明:FreeDev_aic模塊通過TLV320AIC23的串行數(shù)字接口接收數(shù)據(jù),變換成32BIT左右
//聲道數(shù)據(jù),經(jīng)異步FIFO送到Avalone接口端,供Nios II DMA方式讀取數(shù)據(jù)。Nios II輸出數(shù)據(jù)經(jīng)
//Avalone接口寫入FIFO傳輸?shù)讲⒋D(zhuǎn)換模塊,由TLV320AIC23串行數(shù)字接口輸出。
IOWR(FREEDEV_AIC23_0_BASE,0x00,0x0201);
//復(fù)位FreeDev_aic23外設(shè)
IOWR(FREEDEV_AIC23_0_BASE,0x01,0x01);
IOWR(FREEDEV_AIC23_0_BASE,0x01,0x00);
// 開放輸入中斷
IOWR(FREEDEV_AIC23_0_BASE,0x02,0x02);
// 啟動數(shù)據(jù)接收
IOWR(FREEDEV_AIC23_0_BASE,0x01,0x02);
}
ch=ShowSelect( "需要測試NIOS II系統(tǒng)錄音和回放處理嗎?y OR n",'y','n' );
if(ch=='y'){
IOWR(FREEDEV_AIC23_0_BASE,0x00,0x0201);
// 屏蔽輸入中斷
IOWR(FREEDEV_AIC23_0_BASE,0x02,0x03);
//復(fù)位FreeDev_aic23外設(shè)
IOWR(FREEDEV_AIC23_0_BASE,0x01,0x01);
IOWR(FREEDEV_AIC23_0_BASE,0x01,0x00);
// 啟動數(shù)據(jù)接收
IOWR(FREEDEV_AIC23_0_BASE,0x01,0x02);
for(i=0;i<AUDIO_BUFF_SIZE;)
{
//讀音頻外設(shè)狀態(tài)
v1=IORD(FREEDEV_AIC23_0_BASE,0x03);
// 輸入FIFO不為空 或 輸入FIFO為滿
if(!(v1 & 0x08) || (v1 & 0x04) )
{
audioBuff[i]=IORD(FREEDEV_AIC23_0_BASE,0x07);
IOWR(FREEDEV_AIC23_0_BASE,0x07,audioBuff[i]);
i++;
}
}
ch=ShowSelect( "播放剛才的錄音嗎?y OR n",'y','n' );
if(ch=='y'){
for(i=0;i<AUDIO_BUFF_SIZE;)
{
//讀音頻外設(shè)狀態(tài)
v1=IORD(FREEDEV_AIC23_0_BASE,0x03);
// 輸出FIFO不為滿
if(!(v1 & 0x01))
{
IOWR(FREEDEV_AIC23_0_BASE,0x07,audioBuff[i]);
i++;
}
}
}
ch=ShowSelect( "錄音數(shù)據(jù)保存到文件audio.dat?y OR n \n 存取HOSTFS需要較長時間,請耐心等待",'y','n' );
if(ch=='y'){
// 打開主機(jī)文件
hostfile = fopen("/mnt/host/audio.dat", "w");
// 寫音頻數(shù)據(jù)
for(i=0;i<AUDIO_BUFF_SIZE;i++)
{
fwrite(audioBuff[i],4,1,hostfile);
}
// 關(guān)閉文件
fclose(hostfile);
}
}
ch=ShowSelect( "播放音頻文件audio.dat?y OR n \n存取HOSTFS需要較長時間,請耐心等待",'y','n' );
if(ch=='y'){
// 屏蔽輸入中斷
IOWR(FREEDEV_AIC23_0_BASE,0x02,0x03);
// 打開主機(jī)文件
hostfile = fopen("/mnt/host/audio.dat", "r");
// 讀音頻數(shù)據(jù)到內(nèi)存
for(i=0;i<AUDIO_BUFF_SIZE;i++)
{
fread(audioBuff[i],4,1,hostfile);
}
// 關(guān)閉文件
fclose(hostfile);
//播放內(nèi)存音頻數(shù)據(jù)
for(i=0;i<AUDIO_BUFF_SIZE;)
{
//讀音頻外設(shè)狀態(tài)
v1=IORD(FREEDEV_AIC23_0_BASE,0x03);
// 輸出FIFO不為滿
if(!(v1 & 0x01))
{
IOWR(FREEDEV_AIC23_0_BASE,0x07,audioBuff[i]);
i++;
}
}
}
goto menu;
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -