M62429音量控制


(*特別注意:最后D10位當時鐘線位下降沿時,數據線為高,以此判斷數據傳輸結束,否則,沒有音頻輸出)
stm32程序
#define SET_CLK1 (GPIOD->BSRR = GPIO_Pin_10)//AUX
#define RESET_CLK1 (GPIOD->BRR = GPIO_Pin_10)
#define SET_DAT (GPIOD->BSRR = GPIO_Pin_11)
#define RESET_DAT (GPIOD->BRR = GPIO_Pin_11)
#define SET_CLK2 (GPIOD->BSRR = GPIO_Pin_12)//CMMB
#define RESET_CLK2 (GPIOD->BRR = GPIO_Pin_12)
#define SET_CLK(no) {(no==2)?SET_CLK2:SET_CLK1;}
#define RESET_CLK(no) {(no==2)?RESET_CLK2:RESET_CLK1;}
const u8 vol_H4[]={0x03,0x01,0x20,0x0}; //D7.D8=0dB--(-3)dB
const u8 vol_l5[]={0x15,0x05,0x19,0x09,0x11,0x01,0x1e,0x0e,0x16,0x06, //D2--D6
0x1a,0x0a,0x12,0x02,0x1c,0x0c,0x14,0x04,0x18,0x08, //0dB-(-80dB)
0x10,0x00
}; typedef enum
{
AUX =1,
CMMB=2
}CHANNEL;static void delay(u16 value)
{
u8 i,j,k;
for(i=value;i>0;i--)
for(j=2;j>0;j--)
for(k=4;k>0;k--);
}
void set_volume(CHANNEL channel,u8 db)//AUX/CMMB
{
u8 L,H,i;
u16 volume;
volume=db;
volume=80-db;
L=volume/4;
H=volume%4;
volume=((0x00+vol_l5[L])<<4)+((vol_H4[H]<<2)+0x03);
volume=volume<<5;
RESET_DAT;
RESET_CLK(channel);
for(i=0;i<11;i++)
{
RESET_DAT;
delay(5);
RESET_CLK(channel);
delay(5);
if(volume&0x8000) SET_DAT;
else RESET_DAT;
delay(5);
SET_CLK(channel);
delay(5);
volume=volume<<1;
}
SET_DAT;
delay(5);
RESET_CLK(channel);
delay(5);
}