搜索
bottom↓
回复: 2

谁能给我个PT2315的完整程序

[复制链接]

出0入0汤圆

发表于 2012-11-28 10:51:21 | 显示全部楼层 |阅读模式
最近我在做PT2315音量音调控制程序(STA12C5A60S2)c语言编程,可怎么也不能通过I2C向PT2315写入控制数据,跪求赐教啊??十分感谢!

出0入0汤圆

发表于 2012-11-28 11:08:41 | 显示全部楼层
给你一个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



出0入0汤圆

发表于 2016-7-12 17:09:27 | 显示全部楼层
同问,还有,谁有PT2315的原理图啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 12:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表