/****************************************************************
* PT2259的操作函数库(FOR ATMEGA64) *
*
*****************************************************************/
#include"iom64v.h"
#include"macros.h"
#include"delay.h"
//如果外部没有上拉电阻,可使能内部上拉
//DDRD&=0XFC;
//PORTD|=0X03;
/******************IIC常量******************/
#define START 0x08 //START信号发送完毕状态
#define MT_SLA_ACK 0x18 //从器件地址发送,返回ACK
#define MT_SLA_NOACK 0x20 //从器件地址发送,但是返回NOACK
#define MT_DATA_ACK 0x28 //数据已发送,返回ACK
#define MT_DATA_NOACK 0x30 //数据已发送,返回NOACK
#define IICStart() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))//产生START信号
#define IICStop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //产生STOP信号
#define IICRecACK() (TWSR&0xF8) //取出状态码
#define SetACK() (TWCR|=(1<<TWEA)) //产生ACK
#define IICSendByte(twi_d) {TWDR=(twi_d);TWCR=(1<<TWINT)|(1<<TWEN);} //发送一个字节(twi_d为写入的数据)
#define IICWait() while(!(TWCR&(1<<TWINT))) //等待当前操作完成
/*********************
//ICC -1dB/Step码Data1
//Right Channel ,-1dB/Step
#define 0dB 0X20;//0dB
#define 1dB 0X21;//1dB
#define 2dB 0X22;//2dB
#define 3dB 0X23;//3dB
#define 4dB 0X24;//4dB
#define 5dB 0X25;//5dB
#define 6dB 0X26;//6dB
#define 7dB 0X27;//7dB
#define 8dB 0X28;//8dB
#define 9dB 0X29;//9dB
//ICC -10dB/Step码Data2
//Right Channel,-10db/Step
#define 0dB 0X30;//00dB
#define 10dB 0X31;//10dB
#define 20dB 0X32;//20dB
#define 30dB 0X33;//30dB
#define 40dB 0X34;//40dB
#define 50dB 0X35;//50dB
#define 60dB 0X36;//60db
#define 70dB 0X37;//70dB
*********************/
//将音量分为16个音节代码
uchar volume_data1[16]={0X30,0X30,0X30,0X30,0X30,0X30,0X30,0X30,0X30,0X30,0X31,0X31,0X31,0X31,0X32,0X32};
uchar volume_data2[16]={0X20,0X21,0X22,0X23,0X24,0X25,0X26,0X27,0X28,0X29,0X20,0X22,0X25,0X28,0X21,0X24};
//com命令码
#define All_mute_on 0x74;//静音关
#define Right_mute_off 0x75;//右声道静音开
#define Left_mute_off 0x76;//左声道静音开
#define All_mute_off 0x77;//静音开
#define clear_reg 0xF0; //寄存器清零
void Twi_init(void);
uchar PT2259_Function(uchar com);
uchar PT2259_Write_volume(uchar Data1,uchar Data2);
/*******************************************
函数名称:Twi_init
功 能:初始化ICC
参 数:无
返回值 :无
/********************************************/
void Twi_init(void)
{
TWCR&=~(1<<TWIE);//I2C关中断
TWCR|=(1<<TWEN);
TWBR=0X8C;//SCL时钟50KHz
TWSR=0X00;
}
/*******************************************
函数名称:PT2259_Function
功 能:PT2259功能控制,包括静音功能和清寄存器
参 数: com--功能指令
返回值 : 0-操作失败,1-操作成功
/********************************************/
uchar PT2259_Function(uchar com)
{IICStart(); //启动总线
IICWait();
if(IICRecACK()!=START)// 检查应答位
{
return 0;
}
IICSendByte(0x88);// 写PT2259设备地址
IICWait();
if(IICRecACK()!=MT_SLA_ACK)//检查是否是从器件地址发送完毕状态
{
return 0;
}
IICSendByte(com);// 写com数据
IICWait();
if(IICRecACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
{
return 0;
}
IICStop();//发送STOP信号
delayms(10);//等待发送完毕
return 1;
}
/*******************************************
函数名称:PT2259_Write_volume
功 能:PT2259音量控制
参 数: Data1--10db数据 Data2--1db数据
返回值 : 0-操作失败,1-操作成功
/********************************************/
uchar PT2259_Write_volume(uchar Data1,uchar Data2)
{
IICStart(); //启动总线
IICWait();
if(IICRecACK()!=START)// 检查应答位
{
return 0;
}
IICSendByte(0x88);// 写PT2259设备地址
IICWait();
if(IICRecACK()!=MT_SLA_ACK)//检查是否是从器件地址发送完毕状态
{
return 0;
}
IICSendByte(Data1);// 写Data1数据
IICWait();
if(IICRecACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
{
return 0;
}
IICSendByte(Data2);//写Data2数据
IICWait();
if(IICRecACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
{
return 0;
}
IICStop();
delayms(10);
return 1;
}
PT2259.rar_PT2259_PT2259 C_pt2259.c
版权申诉
197 浏览量
2022-07-14
13:57:24
上传
评论
收藏 1KB RAR 举报
APei
- 粉丝: 64
- 资源: 1万+