|
发表于 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
|
|