用过M62446AFP的朋友进来看看
搞了好几天,实在不知道我写的这个写函数到底有什么地方错了。它就是无法控制音量。请大哥们指点指点。看看什么地方错了,或者有更好的写法的话告诉小弟一声。不胜感激。void WRITE(int a,int b,int c) //a为音量控制字,比如值为40,b为音调中的低音控制字,比如值为+5,c为音调控制中的高音控制字
{
int x=0; //保存各声道待传的数据
int tone=0,v=0; //tone为音调控制字,v为音量控制字。
int temp;
c=c<<12;
b=b<<4;
if((n=1)||(n=0)) //n为模式,模式为2.0直通模式或者2.1声道模式的时候关音调控制
tone=0x0004;
else
tone=b|c;
CS=1;
delay(); //CS为片选线,SCK为时钟线,MOSI为数据线
CS=0;
delay();
for(temp=16;temp>0;temp--) //该for为传送音调控制字
{
MOSI=(bit)(tone&0x8000);
SCK=0;
delay();
SCK=1;
tone=tone<<1;
;
}
delay();
CS=1;
delay();
CS=0;
DELAY(5);
v=a<<9; //前置两声道音量控制字的合成
a=a<<2;
v=v|a;
x=v|0x0001;
CS=1;
delay();
CS=0;
for(temp=0;temp<16;temp++) //传送前置两声道的音量控制字
{
MOSI=(bit)(x&0x8000);
delay();
SCK=0;
delay();
SCK=1;
x=x<<1;
delay();
}
CS=1;
delay();
CS=0;
DELAY(5);
if(n==3) //当为模式3时(5.1声道模式),后置两声道开,否则送80使衰减无穷大,即静音
x=v|2;
elsex=0x5052;
CS=1;
delay();
CS=0;
for(temp=0;temp<16;temp++)
{
MOSI=(bit)(x&0x8000);
delay();
SCK=0;
delay();
SCK=1;
x=x<<1;
delay();
}
CS=1;
delay();
CS=0;
DELAY(5);
if(n==3) //当为模式3时(5.1声道模式),中置和低音两声道开,否则送80使衰减无穷大,即静音
x=v|0x0003;
else x=0x5053;
CS=1;
delay();
CS=0;
for(temp=0;temp<16;temp++)
{
MOSI=(bit)(x&0x8000);
delay();
SCK=0;
delay();
SCK=1;
x=x<<1;
delay();
}
CS=1;
delay();
CS=0;
}
另附M62446AFP PDF:http://www.datasheet5.com/datasheet_pdf/EIVEYHYIVHGA 不懂,等高手出现 真的没人懂啊,高手们不要吝啬嘛。我只是个学生,求学而已。请高手们帮帮忙啊:sa :22fs 62446没有片选信号的,那个信号叫LATCH,这个信号应该放在每串数据的最后,即每送完16bit数据后,再给LATCH一个脉冲的.数据手册上就写得很清楚的呀 刚好前几天在朋友家拆过一部用M62446作音量音调控制的机子,有2.1/3.1/5.1声道可选,朋友想将2.1改为2.0声道来听音乐,保留3.1/5.1声道看碟,大伙有什么方法? 汇编语言!:victory: :victory: :victory: 原帖由 zzp19 于 2009-4-17 13:40 发表 http://bbs.hifidiy.net/images/common/back.gif
http://bbs.hifidiy.net/viewthread.php?tid=217418&extra=&page=2
我写过一个M62493 的 时序是一样的,你看看有什么帮助没有
谢谢,
对驱动程序不是很懂 妖!上D唔上D边个太得明啊???叫谭浩强来啦??? 注释又写D唔写D!!! 音量是:7位音量+7位音量+2位地址=16位。高位在前,看看你自己的是否正确。时钟脉冲3.2uS.
页:
[1]