?? audio_aic23.c
字號:
/**************************************************************程序說明 :AIC23數字音頻處理控制系統實驗類 型 :Nios II作 者 :柳軍勝公 司 :杭州自由電子科技 :http://www.freefpga.com電 話 :0571-85084089修 改 :20070110日期時間 :20060522說 明 : FreeDev 數字應用開發板采用了TI公司的TVL320AIC23 1、控制接口使用I2C,Quartus中將CS置低(器件地址0011010)。 2、數字音頻接口使用了組件FreeDev_aic23,可實現輪訓方式讀寫, 中斷方式讀寫,錄音、和放音 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 0x80000extern void *dma_base;extern int gControl_bits;unsigned int infifo_count;/*********************************************函數名:audio_irq功 能:音頻中斷處理函數輸 入:context:相關內容指針,中斷號返 回: 備 注: 讀取音頻外設數據,并回放寫入到音頻外設中**********************************************/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參數 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); /* 注冊音頻中斷處理函數 */ 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( "進入測試系統? Y OR N",'y','n' ); if(ch=='n') exit(0); //復位音頻處理芯片 aic23_reset(); ch=ShowSelect( "需要測試模擬環路音頻處理嗎?y OR n",'y','n' ); if(ch=='y'){ // 屏蔽輸入中斷 IOWR(FREEDEV_AIC23_0_BASE,0x02,0x03); //模擬環路測試參數設置,如需要測試模擬環路,打開下列函數注解 //模擬環路說明:模擬信號由LINE IN接入,經TLV320AIC23內部 //模擬開關短接到LINE OUT和PHONE OUT輸出 aic23_analog_bypass_test(); goto menu; }else{ // 屏蔽輸入中斷 IOWR(FREEDEV_AIC23_0_BASE,0x02,0x03); //TLV320AIC23常規工作參數設置 aic23_normal_setup(); //FreeDev_aic模塊工作模式切換實驗 ch=ShowSelect( "需要測試NIOS II系統軟件輪訓方式實時采集和回放處理嗎?y OR n",'y','n' ); if(ch=='y'){ //FreeDev_aic接口模塊控制切換到DMA模式 //DMA模式說明:FreeDev_aic模塊通過TLV320AIC23的串行數字接口接收數據,變換成32BIT左右 //聲道數據,經異步FIFO送到Avalone接口端,供Nios II DMA方式讀取數據。Nios II輸出數據經 //Avalone接口寫入FIFO傳輸到并串轉換模塊,由TLV320AIC23串行數字接口輸出。 IOWR(FREEDEV_AIC23_0_BASE,0x00,0x0201); //復位FreeDev_aic23外設FIFO IOWR(FREEDEV_AIC23_0_BASE,0x01,0x01); IOWR(FREEDEV_AIC23_0_BASE,0x01,0x00); // 啟動數據接收 IOWR(FREEDEV_AIC23_0_BASE,0x01,0x02); //循環讀入并輸出音頻信號 while(1){ //讀音頻外設狀態 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系統中斷方式實時采集和回放處理嗎?y OR n",'y','n' ); if(ch=='y'){ //FreeDev_aic接口模塊控制切換到DMA模式 //DMA模式說明:FreeDev_aic模塊通過TLV320AIC23的串行數字接口接收數據,變換成32BIT左右 //聲道數據,經異步FIFO送到Avalone接口端,供Nios II DMA方式讀取數據。Nios II輸出數據經 //Avalone接口寫入FIFO傳輸到并串轉換模塊,由TLV320AIC23串行數字接口輸出。 IOWR(FREEDEV_AIC23_0_BASE,0x00,0x0201); //復位FreeDev_aic23外設 IOWR(FREEDEV_AIC23_0_BASE,0x01,0x01); IOWR(FREEDEV_AIC23_0_BASE,0x01,0x00); // 開放輸入中斷 IOWR(FREEDEV_AIC23_0_BASE,0x02,0x02); // 啟動數據接收 IOWR(FREEDEV_AIC23_0_BASE,0x01,0x02); } ch=ShowSelect( "需要測試NIOS II系統錄音和回放處理嗎?y OR n",'y','n' ); if(ch=='y'){ IOWR(FREEDEV_AIC23_0_BASE,0x00,0x0201); // 屏蔽輸入中斷 IOWR(FREEDEV_AIC23_0_BASE,0x02,0x03); //復位FreeDev_aic23外設 IOWR(FREEDEV_AIC23_0_BASE,0x01,0x01); IOWR(FREEDEV_AIC23_0_BASE,0x01,0x00); // 啟動數據接收 IOWR(FREEDEV_AIC23_0_BASE,0x01,0x02); for(i=0;i<AUDIO_BUFF_SIZE;) { //讀音頻外設狀態 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;) { //讀音頻外設狀態 v1=IORD(FREEDEV_AIC23_0_BASE,0x03); // 輸出FIFO不為滿 if(!(v1 & 0x01)) { IOWR(FREEDEV_AIC23_0_BASE,0x07,audioBuff[i]); i++; } } } ch=ShowSelect( "錄音數據保存到文件audio.dat?y OR n \n 存取HOSTFS需要較長時間,請耐心等待",'y','n' ); if(ch=='y'){ // 打開主機文件 hostfile = fopen("/mnt/host/audio.dat", "w"); // 寫音頻數據 for(i=0;i<AUDIO_BUFF_SIZE;i++) { fwrite(audioBuff[i],4,1,hostfile); } // 關閉文件 fclose(hostfile); } } ch=ShowSelect( "播放音頻文件audio.dat?y OR n \n存取HOSTFS需要較長時間,請耐心等待",'y','n' ); if(ch=='y'){ // 屏蔽輸入中斷 IOWR(FREEDEV_AIC23_0_BASE,0x02,0x03); // 打開主機文件 hostfile = fopen("/mnt/host/audio.dat", "r"); // 讀音頻數據到內存 for(i=0;i<AUDIO_BUFF_SIZE;i++) { fread(audioBuff[i],4,1,hostfile); } // 關閉文件 fclose(hostfile); //播放內存音頻數據 for(i=0;i<AUDIO_BUFF_SIZE;) { //讀音頻外設狀態 v1=IORD(FREEDEV_AIC23_0_BASE,0x03); // 輸出FIFO不為滿 if(!(v1 & 0x01)) { IOWR(FREEDEV_AIC23_0_BASE,0x07,audioBuff[i]); i++; } } } goto menu; } return 0; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -