S3C6410裸機AC97驅(qū)動
目前能夠初始化AC97,能夠進入就緒中斷,說明能夠檢測到WM9714,但是無法讀取WM9714,不知道哪里出錯了,目前正在解決中...
AC97.c
/*************************************************************************************************************
*文件名:AC97.c
*功能:S3C6410AC97底層驅(qū)動函數(shù)
*作者:cp1300@139.com
*創(chuàng)建時間:2012年10月6日20:41
*最后修改時間:2012年10月6日
*詳細:AC97控制器底層驅(qū)動
*************************************************************************************************************/
#include"system.h"
#include"ac97.h"
#include"delay.h"
//使能AC97-LINK傳輸數(shù)據(jù)
#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//系統(tǒng)熱復位延時
#defineAC97_COLDRESET_DELAY2//系統(tǒng)冷復位延時
#defineAC97_CMDREAD_DELAY2000//讀取延時
#defineAC97_CMDWRITE_DELAY22//寫命令延時
/*************************************************************************************************************************
*函數(shù):voidAC97_WarmReset(void)
*功能:AC97控制器熱復位
*參數(shù):無
*返回:無
*依賴:底層宏定義
*作者:cp1300@139.com
*時間:20121006
*最后修改時間:20121006
*說明:用于從關閉電源喚醒編解碼器
*************************************************************************************************************************/
voidAC97_WarmReset(void)
{
AC97->GLBCTRL&=~(0xf);//清除設置
AC97->GLBCTRL|=BIT1;//開始復位
Delay_US(AC97_WARMRESET_DELAY);//延時,大于1US
AC97->GLBCTRL&=~BIT1;//結(jié)束復位
AC97_ACLinkOn();
AC97_EnTraansferACLink();
Delay_US(1);
}
/*************************************************************************************************************************
*函數(shù):voidAC97_ColdReset(void)
*功能:AC97控制器冷復位
*參數(shù):無
*返回:無
*依賴:底層宏定義
*作者:cp1300@139.com
*時間:20121006
*最后修改時間:20121006
*說明:用于復位編解碼器和控制器的邏輯,復位時間最小1us
*************************************************************************************************************************/
voidAC97_ColdReset(void)
{
AC97->GLBCTRL|=BIT0;//開始復位
Delay_US(AC97_COLDRESET_DELAY);
AC97->GLBCTRL&=~BIT0;//結(jié)束復位
AC97_WarmReset();
Delay_US(1);
}
/*************************************************************************************************************************
*函數(shù):u8AC97_Init(void)
*功能:AC97控制器初始化
*參數(shù):無
*返回: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;
}
/*************************************************************************************************************************
*函數(shù) : u16 AC97_CodeCMD(AC97_CMD AC97_RW,u8 RegAddr,u1