924ac97Word文档格式.docx
《924ac97Word文档格式.docx》由会员分享,可在线阅读,更多相关《924ac97Word文档格式.docx(13页珍藏版)》请在冰点文库上搜索。
电路图如下(P2):
44(DETECT)引脚检测耳机有没有插入,39,41为耳机插口,8是输入端口(放音),5是输出端口(录音),10是贞同步信号,11重启声卡。
5-11连接s3c6410主芯片(P4如下图),
6410P1140,P1151为AC寄存器,
P308配置GPD0-GPD4为声卡专用,GPDCON=0X44444;
设置AC_GLBCTRL寄存器:
AC_GLBCTRL|=1;
delay
(1);
AC_GLBCTRL&
=~1;
//冷启动,必须关掉,否则一直重启
AC_GLBCTRL|=1<
<
1;
=~(1<
1);
//热启动
2;
//祯同步使能
3;
//AC-Linkon使能AC_CODEC_CMD|=1<
23;
[29]位清PCM out中断,[12]位设置PCM out为PIO
方式,[21]位使能PCM out,(FIFOisempty数据发送完产生中断)。
还强调一点,声卡的声音不能调到0,现实中的调0其实是将[2]位置为0(AC-Linkon)。
P1153设置AC_GLBSTAT
[23]设置为1,可读,读声卡状态查看声卡有没有准备好。
只有当AC_GLBSTAT [2:
0]位为011:
Active时才能说明声卡初始化完成,才能进行下面的步骤。
[22:
26]位为要写入的命令地址,[15:
0]为要写入的数据。
下面看一看声卡手册,WM9714 P38
stereo(双声道立体声),与P1153 AC_CODEC_CMD配合。
0Ch DAC Volume 声音控制[15]为耳机屏蔽位,[14]为喇叭屏蔽位,[13]为单声道混音,[12:
8][4:
0]为左右声道声音大小(既能控制喇叭又能控制耳机)。
5Ch Additional Functions [7]位无输入自动关闭,20h DACTone Control声调控制,P4040hGeneralPurpose3D声音,P43 2AhExtendedAudioStat/Ctrl采样频率变化使能,如不使能,采样频率为固定值48KHZ,2ChAudioDACSampleRate 采样频率设置为44.1KHZ,
[7:
6][5:
4]分别为为耳机左右混音,选10(P54),
04h HeadphoneVolume为耳机声音调节,1Ch OutputPGAMuxSelect(P56)
选011,SPKMIX。
上图02h SpeakerVolume为喇叭声音调节,1Ch OutputPGAMuxSelect 不配置(没有接),out3/out4。
24hOutputVolumeMapping(JackInsert)第四位检测耳机有没有插入,如下图。
(P76)打开电源,26hPowerdown/Statusregister,3Ch Powerdown
(1),3Eh Powerdown
(2)全部置1,打开电源。
PLAY_MUSIC
P1152[13:
12]置1,选为PIO,[21]位置1使能。
AC_GLBCTRL|=(1<
12)|(1<
21);
P411查中断号,36号AC97interrupt,P1152AC_GLBSTAT查询[21]位判断是否中断,P1151清中断,AC_GLBCTRL [29]位。
第11章DMA
P384通过查询
ac97为6号中断源,P391为配置DMA的过程,如下图:
P158配置SDMA_SEL,SDMA_SEL|=1<
22;
,P393配置DMA通道,配哪个用哪个,如下图。
DMACC0SrcAddr=saddr;
//P401
DMACC0DestAddr=daddr;
DMACC0Control0=(1<
26)|(1<
25)|(2<
21)|(2<
18)|(1<
15)|(3);
//P401
DMACC0Control1=((len+3)>
>
2);
//传输长度对齐
DMACC0Configuration=(1<
11)|(6<
6)|
(1);
P401设置DMACC0Control0,如下图:
[27]每次读完数据后目的地址是否增加,[26]每次读完数据后源地址是否增加,[25]目的是内存还是外设,[24]源是内存还是外设,[23:
21]目的传输宽度,[20:
18]源传输宽度,[17:
15]目的突发长度,[14:
12]源突发长度,参考下图。
DMACCxControl1(P404)[24:
0]传输长度要对齐。
DMACC0Configuration(P405)[15]传输完成中断,[14]传输出错中断,[13:
11]选择流控及传输方式我们选01memory-to-periphera参考下图。
[9:
6]几号请求源我们是6号,[4:
1]源外设,[0]使能位。
最后重点看看第六步,
structnext_work{
unsignedintsaddr;
unsignedintdaddr;
unsignedintnext;
unsignedintcontrol0;
unsignedintcontrol1;
}next_lli;
next_lli.saddr=saddr;
next_lli.daddr=daddr;
next_lli.next=(unsignedint)&
next_lli;
next_lli.control0=(1<
next_lli.control1=((len+4-1)>
DMACC0LLI=(unsignedint)&
先定义一个结构体,以保证地址连续性,将下一个指向的目标指向自己,这样的话就可以一直循环了。