M62429驱动笔记
M62429是一款串行数据控制的双声道电子音量控制器芯片,它的规格书(中文),三菱(英文), RENESAS(英文)
1.功能框图
2.引脚说明
Pin no. | Symbol | Function |
---|
1 | VIN 1 | 声道 1 输入脚 | 2 | VOUT1 | 声道 1 输出脚输 | 3 | GND | 地 | 4 | DATA | 控制数据输入脚,与时钟同步数据输入脚 | 5 | CLOCK | 传输串行数据地时钟入脚 | 6 | VCC | 电源,必须接滤波容到地电源 | 7 | VOUT2 | 声道 2 输出脚 | 8 | VIN2 | 声道 2 输入脚输 |
3.驱动电路
详细说明见规格书。
4.驱动数据说明
要想驱动M62429,需要在CLOCK发出11个周期时钟,DATA脚发出11位数据
D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 |
---|
0/1 | 0/1 | | | | 音量 | | | | 1 | 1 |
其中:
BIT | 说明 |
---|
D0 | 0:选择声道1 1:选择声道2 | D1 | 0:同时控制两个声道 1:只能控制一个声道 | D2~D8 | 音量控制码,Volume 0 to -83dB (1dB/step), -∞ | D9 | 默认为1,不可改变 | D10 | 默认为1,不可改变 |
音量控制器可以将声音衰减0 ~ -83dB,其中D2~D6控制步长为4dB,加上D7、D8才能达到控制步长为1dB的要求;
最大音量时衰减值为0dB,即D2 ~ D8的数据为:1010111,假如只使用通道1,只控制一个声道,则D0~D10为:01101011111;
再例如将音量衰减值-36dB,D2 ~ D8为:0011011,则D0~D10为:01001101111,D0在低位,D10在高位,在计算器中得出数据为: 0x7B2,使用单片机驱动音量控制芯片是,DATA上发送的数据为0X07B2。
端口仿真波形:
5.驱动例程
这里给出两种实现的方法:
A.取0 ~ -83dB内的数据,将D0、D1、D2~D8全部预定义好,整成一个数组,设置音量时,直接在数组内取值,使用IO口将数据发送出去;
#define MainVol_0dB 0x15
#define MainVol_n4dB 0x14
#define MainVol_n8dB 0x13
#define MainVol_n12dB 0x12
#define MainVol_n16dB 0x11
#define MainVol_n20dB 0x10
#define MainVol_n24dB 0x0F
#define MainVol_n28dB 0x0E
#define MainVol_n32dB 0x0D
#define MainVol_n36dB 0x0C
#define MainVol_n40dB 0x0B
#define MainVol_n44dB 0x0A
#define MainVol_n48dB 0x09
#define MainVol_n52dB 0x08
#define MainVol_n56dB 0x07
#define MainVol_n60dB 0x06
#define MainVol_n64dB 0x05
#define MainVol_n68dB 0x04
#define MainVol_n72dB 0x03
#define MainVol_n76dB 0x02
#define MainVol_n80dB 0x01
#define SubVol_0dB 0x03
#define SubVol_n1dB 0x02
#define SubVol_n2dB 0x01
#define SubVol_n3dB 0x00
#define _1CH 0x00
#define _SINGLE 0x01
const uint VolumeTable[] = {
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_0dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n2dB << 7) | (MainVol_0dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n4dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n2dB << 7) | (MainVol_n4dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n1dB << 7) | (MainVol_n8dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n12dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n2dB << 7) | (MainVol_n16dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n24dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n36dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n48dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n60dB << 2)),
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n80dB << 2)),
};
void VolumeSet(uchar VolIndex)
{
uint Dat;
uchar i;
Dat = VolumeTable[VolIndex];
for(i=0;i<10;i++)
{
SDA_VOL=Dat&0x01;
SCL_VOL=1;
DELAY5US();
SDA_VOL=0;
SCL_VOL=0;
Dat>>=1;
}
SDA_VOL=1;
SCL_VOL=1;
DELAY5US();
SCL_VOL=0;
}
SDA_VOL和SCL_VOL是单片机的输出脚,连接CLOCK和DATA,例如51中,定义为:
sbit SDA_VOL = P2^2;
sbit SCL_VOL = P2^1;
调用函数
VolumeSet(8);
B.将需要设置的音量根据规格书的说明,一一换算出来。
#define M62429_D0_SW_0 0x0
#define M62429_D0_SW_1 0x1
#define M62429_D1_SW_0 (0x0 << 1)
#define M62429_D1_SW_1 (0x1 << 1)
void VolSet(uchar ChnSet, uchar Volume)
{
uint Dat;
uchar i;
Volume=87-Volume;
Dat=0x600|(Volume&0xfc)|((Volume&0x03)<<7);
Dat=Dat|(ChnSet&0x03);
for(i=0;i<10;i++)
{
SDA_VOL=Dat&0x01;
SCL_VOL=1;
_nop_();
_nop_();
_nop_();
SDA_VOL=0;
SCL_VOL=0;
Dat>>=1;
}
SDA_VOL=1;
SCL_VOL=1;
_nop_();
_nop_();
_nop_();
SCL_VOL=0;
}
调用函数
VolSet(M62429_D0_SW_0|M62429_D1_SW_1, 36);
两种方法实现的效果是一样的。
|