#include "regx52.h"
#include "PT2258.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define SLA_W 0x88
#define Global 0x00
#define Mute_Control 0xf8
uchar const Ch_Addr [] = {
0xe0,0xd0,0x90,0x80,0x50,0x40,0x10,0x00,0x30,0x20,0x70,0x60,0xb0,0xa0} ;
void I2C_Delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
//I2C Bus Start
void I2C_Start(void)
{
SDA = 1 ;
SCL = 1 ;
_nop_();
_nop_();
SDA = 0 ;
I2C_Delay();
SCL = 0 ;
}
//I2C bus stop
void I2C_Stop(void)
{
SDA = 0 ;
_nop_();
_nop_();
SCL = 1 ;
I2C_Delay();
SDA = 1 ;
}
//Check the answer bit
bit I2C_Cack(void)
{
bit Flag = 0x00;
SDA = 1 ;
_nop_();
SCL = 1 ;
I2C_Delay();
Flag = SDA ;
SCL = 0 ;
return (Flag);
}
//I2C write a byte
void I2C_WrByte (uchar I2C_data)
{
uchar cnt;
for(cnt=0; cnt<8; cnt++)
{
I2C_data <<= 1;
SDA = CY ;
SCL = 1 ;
I2C_Delay();
SCL = 0 ;
}
}
bit PT2258_WriteByte (uchar inData)
{
uchar step_Flag = 0, Time_out = 0;
bit ACK_Flag;
while (step_Flag < 0x02)
{
if (step_Flag == 0x00)
{
I2C_Start();
I2C_WrByte ( SLA_W );
ACK_Flag = I2C_Cack();
if (!ACK_Flag) step_Flag += 1;
else I2C_Stop ();
}
else if (step_Flag == 0x01 )
{
I2C_WrByte (inData);
ACK_Flag = I2C_Cack();
if (!ACK_Flag) step_Flag += 1;
else
{
I2C_Stop ();
step_Flag = 0;
}
}
Time_out ++;
if (Time_out > SafeCounter) break;
}
I2C_Stop();
return (ACK_Flag);
}
//
bit PT2258_Write2Byte (uchar inData1,uchar inData2)
{
uchar step_Flag = 0, Time_out = 0;
bit ACK_Flag;
while (step_Flag < 0x03)
{
if (step_Flag == 0x00)
{
I2C_Start();
I2C_WrByte ( SLA_W );
ACK_Flag = I2C_Cack();
if (!ACK_Flag) step_Flag += 1;
else I2C_Stop ();
}
else if (step_Flag == 0x01 )
{
I2C_WrByte (inData1);
ACK_Flag = I2C_Cack();
if (!ACK_Flag) step_Flag += 1;
else
{
I2C_Stop ();
step_Flag = 0;
}
}
else if (step_Flag == 0x02 )
{
I2C_WrByte (inData2);
ACK_Flag = I2C_Cack();
if (!ACK_Flag) step_Flag += 1;
else
{
I2C_Stop ();
step_Flag = 0;
}
}
Time_out ++;
if (Time_out > SafeCounter) break;
}
I2C_Stop();
return (ACK_Flag);
}
//**********************************************************************//
// Set the PT2258's Volume //
// Input : uchar Channel : Select the Channel of what you want to set //
// signed char Volume (0 ~ -79dB) //
// Output: The I2C ack flag : 0 = Has ACK ; 1 = No ACK //
//**********************************************************************//
bit SetVolume (uchar Channel, signed char Volume)
{
uchar tmp,Data1,Data2;
tmp = -Volume;
Data1 = tmp / 10;
Data1 = Data1 | Ch_Addr[Channel+1];
Data2 = tmp % 10;
Data2 = Data2 | Ch_Addr[Channel];
return (PT2258_Write2Byte (Data1,Data2)) ;
}
bit MuteGlobal (void)
{
return ( PT2258_WriteByte (Mute_Control | 0x01));
}
//
bit unMuteGlobal (void)
{
return ( PT2258_WriteByte (Mute_Control));
}
关闭
站长推荐
/3
用户1567315 2013-8-12 17:24
用户377235 2013-8-3 13:11
xucun915_925777961 2011-5-25 15:01