//////////////////////////////////////////////////////
//电子音量控制芯片M62429驱动函数
//////////////////////////////////////////////////////
#include "delay.h"
#include "m62429.h"
//////////////////////////////////////////////////////
//定义音量控制数值表(递减顺序,即按datasheet上排序)
//////////////////////////////////////////////////////
u16 Volume_L[] = {0x0003,0x0001,0x0002,0x0000};
/*D7~D8数值: 0dB, -1dB, -2dB, -3dB */
u16 Volume_H[] = { /*D2~D6数据*/
0x0015,0x0005,0x0019,0x0009,
/* 0db, -4db, -8db, -12db */
0x0011,0x0001,0x001e,0x000e,
/* -16db, -20db, -24db, -28db */
0x0016,0x0006,0x001a,0x000a,
/* -32db, -36db, -40db, -44db */
0x0012,0x0002,0x001c,0x000c,
/* -48db, -52db, -56db, -60db */
0x0014,0x0004,0x0018,0x0008,
/* -64db, -68db, -72db, -76db */
0x0010,0x0000};
/* -80db, -84db */
//////////////////////////////////////////////////////
//初始化数据传送接口
void M62429_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //开启GPIOD外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; /* 初始化GPIOx.5---------->m62429_sda---->PD.4
m62429_scl---->PD.5
*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //GPIO翻转速度为2MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIO相关结构体
GPIO_SetBits(GPIOD, GPIO_Pin_4); //PD.4输出高电平
GPIO_SetBits(GPIOD, GPIO_Pin_5); //PD.5输出高电平
}
//////////////////////////////////////////////////////
//发送音量控制数值到m62429
//Vol_dat:音量控制字节(十进制)0 ≤ Vol_dat ≤ 84
// 最大值为:0dB
// 最小值为:-84dB
void M62429_Write_Byte(u8 Vol_dat,u8 sum) /* Vol_dat为音量数据(十进制)
sum为通道选择数, sum = 0 选择的是两通道同时在线
sum = 1 选择的是通道1在线
sum = 2 选择的是通道2在线
*/
{
static u8 Send_bit;
static u16 channel_value;
static u16 volume_temp1,volume_temp2;
static u16 M62429_VolumeDATA;
switch(sum) /* choice audio channel */
{
case 0: /* both channel at a time */
channel_value = Both_Channel_Value;
break;
case 1: /* one channel at at time */
channel_value = One_Channel_Value;
break;
case 2: /* two channel at a time */
channel_value = Two_Channel_Value;
break;
default:
channel_value = Both_Channel_Value; //default is both channel at a time
break;
}
volume_temp1 = Volume_H[Vol_dat / 4]; //D2~D6
volume_temp2 = Volume_L[Vol_dat % 4]; //D7~D8
/* 总音量控制字节 | D2 ~ D6控制位 | D7、D8控制位 | 通道设置控制 | D9、D10控制位 */
M62429_VolumeDATA = (volume_temp1 << 9) + (volume_temp2 << 7) + channel_value + Control_D9D10; //count the 11bits volume data
for(Send_bit = 0;Send_bit < 11;Send_bit++)
{
m62429_sda = 0; //解锁数据传送限制
delay_us(2);
m62429_scl = 0;
delay_us(2);
if((M62429_VolumeDATA & 0x8000) == 0x8000) m62429_sda = 1;
else m62429_sda = 0;
delay_us(1);
m62429_scl = 1; //send the bit
delay_us(2);
M62429_VolumeDATA <<= 1;
}
/* 数据发送完成,冻结数据传送接口 */
m62429_sda = 1;
delay_us(2);
m62429_scl = 0; //时钟线下降沿上锁
delay_us(2);
m62429_scl = 1;
}
一周热门 更多>