设为首页 加入收藏

TOP

S3C6410裸机AC97驱动(一)
2014-11-24 07:40:30 来源: 作者: 【 】 浏览:0
Tags:S3C6410 裸机 AC97 驱动

目前能够初始化AC97,能够进入就绪中断,说明能够检测到WM9714,但是无法读取WM9714,不知道哪里出错了,目前正在解决中...


AC97.c


/*************************************************************************************************************
* 文件名: AC97.c
* 功能: S3C6410 AC97底层驱动函数
* 作者: cp1300@139.com
* 创建时间: 2012年10月6日20:41
* 最后修改时间:2012年10月6日
* 详细: AC97控制器底层驱动
*************************************************************************************************************/
#include "system.h"
#include "ac97.h"
#include "delay.h"



//使能AC97-LINK传输数据
#define AC97_EnTraansferACLink() (AC97->GLBCTRL |= BIT3)
//使能AC97-LINK
#define AC97_ACLinkOn() (AC97->GLBCTRL |= BIT2)



//AC97中断定义
#define AC97_ALL_INT (0x7f << 16)//全部中断
#define CODE_READY_INT (1 << 22) //编解码器准备就绪中断
#define PCM_OUT_UNDER_INT (1 << 21) //PCM输出通道FIFO空中断
#define PCM_IN_OVER_INT (1 << 20) //PCM输入通道FIFO满中断
#define MIC_IN_OVER_INT (1 << 19) //MIC输入通道FIFO满中断
#define PCM_OUT_THRES_INT (1 << 18) //PCM输出通道FIFO半满中断
#define PCM_IN_THRES_INT (1 << 17) //PCM输入通道FIFO半满中断
#define MIC_IN_THRES_INT (1 << 16) //MIC输入通道FIFO半满中断



//延时控制,单位US
#define AC97_WARMRESET_DELAY 2 //系统热复位延时
#define AC97_COLDRESET_DELAY 2 //系统冷复位延时
#define AC97_CMDREAD_DELAY 2000//读取延时
#define AC97_CMDWRITE_DELAY 22 //写命令延时




/*************************************************************************************************************************
*函数 : void AC97_WarmReset(void)
*功能 : AC97控制器热复位
*参数 : 无
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121006
*最后修改时间: 20121006
*说明 : 用于从关闭电源唤醒编解码器
*************************************************************************************************************************/
void AC97_WarmReset(void)
{
AC97->GLBCTRL &= ~(0xf); //清除设置
AC97->GLBCTRL |= BIT1; //开始复位
Delay_US(AC97_WARMRESET_DELAY); //延时,大于1US
AC97->GLBCTRL &= ~BIT1; //结束复位
AC97_ACLinkOn();
AC97_EnTraansferACLink();
Delay_US(1);
}



/*************************************************************************************************************************
*函数 : void AC97_ColdReset(void)
*功能 : AC97控制器冷复位
*参数 : 无
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121006
*最后修改时间: 20121006
*说明 : 用于复位编解码器和控制器的逻辑,复位时间最小1us
*************************************************************************************************************************/
void AC97_ColdReset(void)
{
AC97->GLBCTRL |= BIT0; //开始复位
Delay_US(AC97_COLDRESET_DELAY);
AC97->GLBCTRL &= ~BIT0; //结束复位
AC97_WarmReset();
Delay_US(1);
}



/*************************************************************************************************************************
*函数 : u8 AC97_Init(void)
*功能 : AC97控制器初始化
*参数 : 无
*返回 : 1:初始化失败;0:初始化成功
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121006
*最后修改时间: 20121006
*说明 : 无
*************************************************************************************************************************/
u8 AC97_Init(void)
{
u16 i = 0;

//初始化AC97硬件接口
rGPDPUD = 0x1 << 2; //AC97BITCLK CDCLK Pull Down Enable
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("AC97 Waint Time Out!\n");
return 1;
}
Delay_MS(1);
}
AC97_IntEnable(CODE_READY_INT,DISABLE); //关闭准备就绪中断
AC97_IntClear(CODE_READY_INT); //清除准备就绪中断
Delay_MS(

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇S3C6410 硬件JPEG解码无关代码影.. 下一篇S3C6410图形旋转裸机驱动

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Java 并发工具类:提 (2025-12-25 20:25:44)
·Java面试技巧:如何 (2025-12-25 20:25:41)
·Java并发编程中的线 (2025-12-25 20:25:38)
·C 语言 - cppreferen (2025-12-25 19:50:27)
·《C 语言入门教程》 (2025-12-25 19:50:23)