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 // 0dB
#define MainVol_n4dB 0x14 // -4dB
#define MainVol_n8dB 0x13 // -8dB
#define MainVol_n12dB 0x12 // -12dB
#define MainVol_n16dB 0x11 // -16dB
#define MainVol_n20dB 0x10 // -20dB
#define MainVol_n24dB 0x0F // -24dB
#define MainVol_n28dB 0x0E // -28dB
#define MainVol_n32dB 0x0D // -32dB
#define MainVol_n36dB 0x0C // -36dB
#define MainVol_n40dB 0x0B // -40dB
#define MainVol_n44dB 0x0A // -44dB
#define MainVol_n48dB 0x09 // -48dB
#define MainVol_n52dB 0x08 // -52dB
#define MainVol_n56dB 0x07 // -56dB
#define MainVol_n60dB 0x06 // -60dB
#define MainVol_n64dB 0x05 // -64dB
#define MainVol_n68dB 0x04 // -68dB
#define MainVol_n72dB 0x03 // -72dB
#define MainVol_n76dB 0x02 // -76dB
#define MainVol_n80dB 0x01 // -80dB
// 第二级音量定义
#define SubVol_0dB 0x03 // 0dB
#define SubVol_n1dB 0x02 // -1dB
#define SubVol_n2dB 0x01 // -2dB
#define SubVol_n3dB 0x00 // -3dB
#define _1CH 0x00
#define _SINGLE 0x01
// 音量调节最大0dB, 最小-80dB, 分成12步
const uint VolumeTable[] = {
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_0dB << 2)), // 0dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n2dB << 7) | (MainVol_0dB << 2)), // -2dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n4dB << 2)), // -4dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n2dB << 7) | (MainVol_n4dB << 2)), // -6dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n1dB << 7) | (MainVol_n8dB << 2)), // -9dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n12dB << 2)), // -12dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n2dB << 7) | (MainVol_n16dB << 2)), // -18dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n24dB << 2)), // -24dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n36dB << 2)), // -36dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n48dB << 2)), // -48dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n60dB << 2)), // -60dB
(0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n80dB << 2)), // -80dB
};
/*
************************************************************************************************************************
**函数原型: void VolumeSet(uchar VolIndex)
**参数说明: VolIndex: 音量调节
**返回值: 无
**说明: 该函数用于控制音量的大小,一共12项选择
************************************************************************************************************************
*/
void VolumeSet(uchar VolIndex)
{
uint Dat;
uchar i;
// 音量调节最大0dB, 最小-80dB, 分成12步
Dat = VolumeTable[VolIndex];
for(i=0;i<10;i++) //发送10位数据,共11位,最后1位另外发
{
SDA_VOL=Dat&0x01;
SCL_VOL=1;
DELAY5US();
SDA_VOL=0;
SCL_VOL=0;
Dat>>=1;
}
SDA_VOL=1; //最后1位D10 = 1
SCL_VOL=1;
DELAY5US();
SCL_VOL=0;
}
SDA_VOL和SCL_VOL是单片机的输出脚,连接CLOCK和DATA,例如51中,定义为:
// M62429 IO 定义
sbit SDA_VOL = P2^2;
sbit SCL_VOL = P2^1;
调用函数
VolumeSet(8); //设置音量大小
B.将需要设置的音量根据规格书的说明,一一换算出来。
// ----------------- M62429 D0 控制位 --------------------------------
#define M62429_D0_SW_0 0x0 //选择声道1
#define M62429_D0_SW_1 0x1 //选择声道2
// ----------------- M62429 D1 控制位 --------------------------------
#define M62429_D1_SW_0 (0x0 << 1) //同时控制两个声道
#define M62429_D1_SW_1 (0x1 << 1) //只能控制一个声道
/*
************************************************************************************************************************
**函数原型: void VolSet(uchar ChnSet, uchar Volume)
**参数说明: ChnSet: 通道控制(bit 0:D0,bit 1: D1)
Volume: 音量控制,实际是0 ~ -83dB(1dB/step)
**返回值: 无
**说明: 该函数用于控制音量的大小
************************************************************************************************************************
*/
void VolSet(uchar ChnSet, uchar Volume)
{
/* m62429数据格式(D0~D10)
D0: 0:1CH / 1:2CH
D1: 0: Both channels at a time / 1: A channel at a time
D2~D6: 音量控制码(-4dB步进)
D7~D8: 音量控制码(-1dB步进)
D9:1
D10:1
*/
uint Dat;
uchar i;
Volume=87-Volume; //加上此句最大为0dB,最小为87dB
Dat=0x600|(Volume&0xfc)|((Volume&0x03)<<7); //音量合并成控制数据,查看DATASHEET
Dat=Dat|(ChnSet&0x03); //音量与通道控制合并成控制数据,查看DATASHEET
for(i=0;i<10;i++) //发送10位数据,共11位,最后1位另外发
{
SDA_VOL=Dat&0x01;
SCL_VOL=1;
_nop_();
_nop_();
_nop_();
SDA_VOL=0;
SCL_VOL=0;
Dat>>=1;
}
SDA_VOL=1; //最后1位D10 = 1
SCL_VOL=1;
_nop_();
_nop_();
_nop_();
SCL_VOL=0;
}
调用函数
VolSet(M62429_D0_SW_0|M62429_D1_SW_1, 36);//设置音量大小
两种方法实现的效果是一样的。