S3C6410裸机AC97驱动
扫描二维码
随时随地手机看文章
目前能够初始化AC97,能够进入就绪中断,说明能够检测到WM9714,但是无法读取WM9714,不知道哪里出错了,目前正在解决中...
AC97.c
/*************************************************************************************************************
*文件名:AC97.c
*功能:S3C6410AC97底层驱动函数
*作者:cp1300@139.com
*创建时间:2012年10月6日20:41
*最后修改时间:2012年10月6日
*详细:AC97控制器底层驱动
*************************************************************************************************************/
#include"system.h"
#include"ac97.h"
#include"delay.h"
//使能AC97-LINK传输数据
#defineAC97_EnTraansferACLink()(AC97->GLBCTRL|=BIT3)
//使能AC97-LINK
#defineAC97_ACLinkOn()(AC97->GLBCTRL|=BIT2)
//AC97中断定义
#defineAC97_ALL_INT(0x7f<<16)//全部中断
#defineCODE_READY_INT(1<<22)//编解码器准备就绪中断
#definePCM_OUT_UNDER_INT(1<<21)//PCM输出通道FIFO空中断
#definePCM_IN_OVER_INT(1<<20)//PCM输入通道FIFO满中断
#defineMIC_IN_OVER_INT(1<<19)//MIC输入通道FIFO满中断
#definePCM_OUT_THRES_INT(1<<18)//PCM输出通道FIFO半满中断
#definePCM_IN_THRES_INT(1<<17)//PCM输入通道FIFO半满中断
#defineMIC_IN_THRES_INT(1<<16)//MIC输入通道FIFO半满中断
//延时控制,单位US
#defineAC97_WARMRESET_DELAY2//系统热复位延时
#defineAC97_COLDRESET_DELAY2//系统冷复位延时
#defineAC97_CMDREAD_DELAY2000//读取延时
#defineAC97_CMDWRITE_DELAY22//写命令延时
/*************************************************************************************************************************
*函数:voidAC97_WarmReset(void)
*功能:AC97控制器热复位
*参数:无
*返回:无
*依赖:底层宏定义
*作者:cp1300@139.com
*时间:20121006
*最后修改时间:20121006
*说明:用于从关闭电源唤醒编解码器
*************************************************************************************************************************/
voidAC97_WarmReset(void)
{
AC97->GLBCTRL&=~(0xf);//清除设置
AC97->GLBCTRL|=BIT1;//开始复位
Delay_US(AC97_WARMRESET_DELAY);//延时,大于1US
AC97->GLBCTRL&=~BIT1;//结束复位
AC97_ACLinkOn();
AC97_EnTraansferACLink();
Delay_US(1);
}
/*************************************************************************************************************************
*函数:voidAC97_ColdReset(void)
*功能:AC97控制器冷复位
*参数:无
*返回:无
*依赖:底层宏定义
*作者:cp1300@139.com
*时间:20121006
*最后修改时间:20121006
*说明:用于复位编解码器和控制器的逻辑,复位时间最小1us
*************************************************************************************************************************/
voidAC97_ColdReset(void)
{
AC97->GLBCTRL|=BIT0;//开始复位
Delay_US(AC97_COLDRESET_DELAY);
AC97->GLBCTRL&=~BIT0;//结束复位
AC97_WarmReset();
Delay_US(1);
}
/*************************************************************************************************************************
*函数:u8AC97_Init(void)
*功能:AC97控制器初始化
*参数:无
*返回:1:初始化失败;0:初始化成功
*依赖:底层宏定义
*作者:cp1300@139.com
*时间:20121006
*最后修改时间:20121006
*说明:无
*************************************************************************************************************************/
u8AC97_Init(void)
{
u16i=0;
//初始化AC97硬件接口
rGPDPUD=0x1<<2;//AC97BITCLKCDCLKPullDownEnable
rGPDCON=0x44444;
Set_GateClk(PCLK_AC97,ENABLE);//使能AC97控制器门控时钟
AC97_ColdReset();//AC97控制器冷复位
AC97_IntClear(CODE_READY_INT);//清除准备就绪中断
AC97_IntEnable(CODE_READY_INT,ENABLE);//使能准备就绪中断
while(!(AC97_GetIntStatus()&CODE_READY_INT))//等待准备就绪中断
{
i++;
if(i>1000)
{
DEBUG("AC97WaintTimeOut!n");
return1;
}
Delay_MS(1);
}
AC97_IntEnable(CODE_READY_INT,DISABLE);//关闭准备就绪中断
AC97_IntClear(CODE_READY_INT);//清除准备就绪中断
Delay_MS(1);
return0;
}
/*************************************************************************************************************************
*函数 : u16 AC97_CodeCMD(AC97_CMD AC97_RW,u8 RegAddr,u1