📄 pac97.c
字号:
/*
单片机式的声卡测试程序
功能:
1、对硬件做最简单的初始化
2、往调制芯片中不停发数据产生声音
*/
#define AC97_INTERNAL_CLOCK_ENABLE (1<<20)
#define loop 4000
#define AC97_READ_COMMAND (1<<23)
#define AC97_CMD_ADDR_SHIFT (16)
#define AC97_CMD_DATA_SHIFT (0)
/* Defines for the STAC9766 registers*/
#define AC97_RESET 0x0000
#define AC97_MASTER_VOL_STEREO 0x0002
#define AC97_HEADPHONE_VOL 0x0004
#define AC97_PHONE_VOL 0x000c
#define AC97_PCMOUT_VOL 0x0018
#define AC97_EXT_AUDIO_CONTROL 0x002A
#define AC97_POWER_CONTROL 0x0026
/* useful power states*/
#define AC97_PWR_D0 0x0000 /*everything on*/
UINT32 *rCLKCON,*rAC_GLBCTRL;
rCLKCON=0x4c00000c; /*clock control register*/
rAC_GLBCTRL=0x5b000000; /*ac97 global control register*/
UINT32 *rAC_PCMDATA; /*ac97 pcm out fifo register*/
rAC_PCMDATA=0x5b000018;
AC97_GPIO_Init();
{
UINT32 *rGPECON,*rGPEUP;
rGPECON=0x56000040; /*port e control rgister*/
rGPEUP=0x56000048;
(*rGPECON)|=0x3ff;
(*rGPEUP) |= 0x1f;
}
void Delay(USHORT count)
{
volatile int i, j;
for(;count > 0;count--)
for(i=0;i < loop; i++) { j++; }
}
ac97_controller_init() /*ac97 控制器初始化*/
{
(*rCLKCON )|= AC97_INTERNAL_CLOCK_ENABLE; /*Enable the CPU clock to the AC97 controller*/
AC97_GPIO_Init();
*rAC_GLBCTRL=0;
Delay();
/*Cold Reset*/
*rAC_GLBCTRL = 0x1;
Delay();
*rAC_GLBCTRL = 0x0;
Delay();
/*AC-link On*/
*rAC_GLBCTRL = (1<<2);
Delay();
/*Transfer data enable using AC-link*/
(*rAC_GLBCTRL )|= (1<<3);
Delay();
/*Disable the Codec ready Interrupt*/
(*rAC_GLBCTRL) |= (1<<22);
Delay();
(*rAC_GLBCTRL) &= ~(0x400000); /* codec ready interrupt disable*/
Delay();
(*rAC_GLBCTRL) |=(1<<12);
}
WriteCodecRegister(UCHAR Reg, USHORT Val)
{
UINT32 *rAC_CODEC_CMD;
rAC_CODEC_CMD=0x5b000008;
*rAC_CODEC_CMD = (Reg << AC97_CMD_ADDR_SHIFT) | (Val << AC97_CMD_DATA_SHIFT);
Delay(100);
}
ac97_codec_init()
{
/* write the Codec software reset (00h)*/
WriteCodecRegister(AC97_RESET, 0x01);
/* disable the VRA (2Ah)*/
WriteCodecRegister(AC97_EXT_AUDIO_CONTROL, 0);
/* Turn Power on for sections (26h)*/
WriteCodecRegister( AC97_POWER_CONTROL, AC97_PWR_D0 );
/*volume control*/
WriteCodecRegister( AC97_MASTER_VOL_STEREO, 0x0101 );
WriteCodecRegister( AC97_HEADPHONE_VOL, 0x0101 );
WriteCodecRegister( AC97_PHONE_VOL, 0x0101 );
WriteCodecRegister( AC97_PCMOUT_VOL, 0x0101 );
}
ac97_send() /*send data to pcm_out fifo untill full*/
{
int fcount, L_fifo[15]={},R_fifo[15]={};
for(fcount=0;fcount<16;fcount++)
{
*rAC_PCMDATA=(L_fifo[fcount]<<16)|(R_fifo[fcount])
}
(*rAC_GLBCTRL )|= (1<<21); /*enable pcm out channel empty interrupt*/
}
ac97_send_int() /*send interrupt handle:send data to send data to pcm_out fifo untill full*/
{
(*rAC_GLBCTRL )&=(~ (1<<21)); /*disable interrupt*/
int fcount, L_fifo[15]={},R_fifo[15]={};
for(fcount=0;fcount<16;fcount++)
{
*rAC_PCMDATA=(L_fifo[fcount]<<16)|(R_fifo[fcount])
}
(*rAC_GLBCTRL )|= (1<<21); /*enable pcm out channel empty interrupt*/
}
main()
{
ac97_controller_init();
ac97_codec_init();
ac97_send();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -