谁能给我个PT2315的完整程序

2020-01-17 19:04发布

最近我在做PT2315音量音调控制程序(STA12C5A60S2)c语言编程,可怎么也不能通过I2C向PT2315写入控制数据,跪求赐教啊??十分感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
cemi
2020-01-17 22:55
给你一个PT2312的程序, 这个程序在实际电路中使用没有问题的


//#include <stm32f10x_lib.h>
#include "PT2312.h"
/********************************************************/
//extern void Systick_Delay_1ms(u32 nCount);

//static u8 Globe_Volume;
static u8 Origin_FL, Origin_FR, Origin_RL, Origin_RR;

void PT2312_I2C_delay(void)
{
   u8 i = 50; //这里可以优化速度        ,经测试最低到5还能写入
   while(i)
   {
     i--;
   }
}

bool PT2312_I2C_Start(void)
{
        PT2312_SDA_H;
        PT2312_SCL_H;
        PT2312_I2C_delay();
        if(!PT2312_SDA_read)return FALSE;        //SDA线为低电平则总线忙,退出
        PT2312_SDA_L;
        PT2312_I2C_delay();
        if(PT2312_SDA_read) return FALSE;        //SDA线为高电平则总线出错,退出
        PT2312_SDA_L;
        PT2312_I2C_delay();
        return TRUE;
}

void PT2312_I2C_Stop(void)
{
        PT2312_SCL_L;
        PT2312_I2C_delay();
        PT2312_SDA_L;
        PT2312_I2C_delay();
        PT2312_SCL_H;
        PT2312_I2C_delay();
        PT2312_SDA_H;
        PT2312_I2C_delay();
}

void PT2312_I2C_Ack(void)
{
        PT2312_SCL_L;
        PT2312_I2C_delay();
        PT2312_SDA_L;
        PT2312_I2C_delay();
        PT2312_SCL_H;
        PT2312_I2C_delay();
        PT2312_SCL_L;
        PT2312_I2C_delay();
}

void PT2312_I2C_NoAck(void)
{
        PT2312_SCL_L;
        PT2312_I2C_delay();
        PT2312_SDA_H;
        PT2312_I2C_delay();
        PT2312_SCL_H;
        PT2312_I2C_delay();
        PT2312_SCL_L;
        PT2312_I2C_delay();
}

bool PT2312_I2C_WaitAck(void)          //返回为:=1有ACK,=0无ACK
{
        PT2312_SCL_L;
        PT2312_I2C_delay();
        PT2312_SDA_H;
        PT2312_I2C_delay();
        PT2312_SCL_H;
        PT2312_I2C_delay();
        if(PT2312_SDA_read)
        {
      PT2312_SCL_L;
          PT2312_I2C_delay();
      return FALSE;
        }
        PT2312_SCL_L;
        PT2312_I2C_delay();
        return TRUE;
}

void PT2312_SendByte(u8 SendByte) //数据从高位到低位//
{
    u8 i=8;
    while(i--)
    {
        PT2312_SCL_L;
        PT2312_I2C_delay();
      if(SendByte&0x80)
        { PT2312_SDA_H;  }
      else
        { PT2312_SDA_L;  }

        SendByte<<=1;
        PT2312_I2C_delay();
                PT2312_SCL_H;
        PT2312_I2C_delay();
    }
    PT2312_SCL_L;
}

void SetVolume(u8 Value)
{
        if (Value > 63) Value = 63;
        PT2312_I2C_Start();//开始
        PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
        if (PT2312_I2C_WaitAck()) PT2312_SendByte(Value & 0x3F);//0
        if (PT2312_I2C_WaitAck())  PT2312_I2C_Stop();//停止
}

void Mute(u8 MuteSound)  //MuteSound = 1 Mute the sound
{       
/*         PT2312_I2C_Start();//开始
        PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
        if (MuteSound)
        {
                if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0x80); //Chanel Front Left;
                if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0xA0); //Chanel Front Right;
                if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0xC0); //Chanel Rear Left;
                if (PT2312_I2C_WaitAck()) PT2312_SendByte(0xFF | 0xE0); //Chanel Rear Right;
        }
        else
        {
                if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_FL | 0x80); //Chanel Front Left;
                if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_FR | 0xA0); //Chanel Front Right;
                if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_RL | 0xC0); //Chanel Rear Left;
                if (PT2312_I2C_WaitAck()) PT2312_SendByte(Origin_RR | 0xE0); //Chanel Rear Right;
        }

        if (PT2312_I2C_WaitAck())  PT2312_I2C_Stop();//停止 */
}

void SelectInput(u8 Inpute)
{
        PT2312_I2C_Start();//开始
        PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
        if(PT2312_I2C_WaitAck()) PT2312_SendByte(0x43);//(Inpute & 0x03) | 0x40);
        //0x42 chanel3    0x43 chanel4
        if(PT2312_I2C_WaitAck())  PT2312_I2C_Stop();//停止
}

void SetBalance(u8 FL, u8 FR, u8 RL, u8 RR)
{

        PT2312_I2C_Start();//开始
        PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址

        Origin_FL = FL;
        Origin_FR = FR;  
        Origin_RL = RL;
        Origin_RR = RR;
        if(PT2312_I2C_WaitAck())
          PT2312_SendByte(FL | 0x80);  //Chanel Front Left;
        if(PT2312_I2C_WaitAck())
          PT2312_SendByte(FR | 0xA0);  //Chanel Front Right;
        if(PT2312_I2C_WaitAck())
          PT2312_SendByte(RL | 0xC0);  //Chanel Rear Left;
        if(PT2312_I2C_WaitAck())
          PT2312_SendByte(RR | 0xE0);  //Chanel Rear Right;

        if(PT2312_I2C_WaitAck())  PT2312_I2C_Stop();//停止
}

void SetBass(u8 Bass)
{
        PT2312_I2C_Start();//开始
        PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
        if(PT2312_I2C_WaitAck()) PT2312_SendByte(0x6F);//(Bass & 0xF) | 0x60);
        if(PT2312_I2C_WaitAck())  PT2312_I2C_Stop();//停止
}

void SetTreble(u8 Treble)
{
        PT2312_I2C_Start();//开始
        PT2312_SendByte(PT2312_ADDRESS);//写入写从设备地址
        if(PT2312_I2C_WaitAck()) PT2312_SendByte(0x7F);//(Treble & 0xF) | 0x70);
        if(PT2312_I2C_WaitAck())  PT2312_I2C_Stop();//停止
}

void PT2312Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        /* Configure I2C1 pins: SCL and SDA */
        GPIO_InitStructure.GPIO_Pin =  PT2312_SCL_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(PT2312_PORT, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        PT2312_I2C_Stop();
}





#ifndef __PT2312_Driver_H
#define __PT2312_Driver_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

#define PT2312_ADDRESS  0x88

#define PT2312_PORT  GPIOB
#define PT2312_SCL_PIN          GPIO_Pin_5
#define PT2312_SDA_PIN          GPIO_Pin_15

#define PT2312_SCL_H         PT2312_PORT->BSRR = PT2312_SCL_PIN
#define PT2312_SCL_L         PT2312_PORT->BRR  = PT2312_SCL_PIN
   
#define PT2312_SDA_H         GPIOC->BSRR = PT2312_SDA_PIN
#define PT2312_SDA_L         GPIOC->BRR  = PT2312_SDA_PIN

#define PT2312_SCL_read      PT2312_PORT->IDR  & PT2312_SCL_PIN
#define PT2312_SDA_read      GPIOC->IDR  & PT2312_SDA_PIN

#define IN_MainAudio        3
#define IN_FMAudio                1
#define IN_BT                        0
#define IN_Ext                        2

void PT2312Init(void);
void SetVolume(u8 Value);
void Mute(u8 MuteSound);  //MuteSound = 1 Mute the sound
void SelectInput(u8 Inpute);
void SetBalance(u8 FL, u8 FR, u8 RL, u8 RR);
void SetBass(u8 Bass);
void SetTreble(u8 Treble);


#endif



一周热门 更多>