STM32驱动M62429音量控制芯片控制不了音量大小附上程序用别人的求解答

2019-08-14 18:28发布

//////////////////////////////////////////////////////
//电子音量控制芯片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;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。