/************* 功能说明 **************
本文件为SC7313/TDA7313驱动控制函数
******************************************/
#include "Audio_SC7313.h"
#include "delay.h"
//音调(高音、低音)//bass&treble查表
unsigned char code TABLE_Tone[15]=
{
// -14, -12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14 //dB
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08
};
//主音量//Volume查表
unsigned char code TABLE_Volume[16]=
{
//-78.75,51.25,48.75,41.25,36.25,31.25,26.25,22.5,18.75,15,11.25,8.75,6.25,3.75,1.25,0 //-dB
// 63, 41, 37, 33, 29, 25, 21, 18, 15, 12, 9, 7, 5, 3, 1, 0 //Value
0x3F,0x29,0x25,0x21,0x1D,0x19,0x15,0x12,0x0F,0x0C,0x09,0x07,0x05,0x03,0x01,0x00
};
//要写入的参数
// 0: 主音量级别(0-15) 1: 声音通道(0-2)
// 2: 增益级别(0-3) 3: 响度开关(0-1)
// 4: 低音音量(0-17) 5: 高音音量(0-17)
char Audio_Para[Audio_Number]={5,2,3,1,10,8};
char Audio_RunState = 0; //运行状态
//--------------------------------------- I2C协议 -------------------------------------------//
/**************************************
起始信号
**************************************/
void SC7313_Start()
{
SC7313_SDA = 1; //拉高数据线
SC7313_SCL = 1; //拉高时钟线
delay_us(5); //延时
SC7313_SDA = 0; //产生下降沿
delay_us(5); //延时
SC7313_SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void SC7313_Stop()
{
SC7313_SDA = 0; //拉低数据线
SC7313_SCL = 1; //拉高时钟线
delay_us(5); //延时
SC7313_SDA = 1; //产生上升沿
delay_us(5); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void SC7313_SendACK(bit ack)
{
SC7313_SDA = ack; //写应答信号
SC7313_SCL = 1; //拉高时钟线
delay_us(5); //延时
SC7313_SCL = 0; //拉低时钟线
delay_us(5); //延时
}
/**************************************
接收应答信号
**************************************/
bit SC7313_RecvACK()
{
SC7313_SCL = 1; //拉高时钟线
delay_us(5); //延时
CY = SC7313_SDA; //读应答信号
SC7313_SCL = 0; //拉低时钟线
delay_us(5); //延时
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void SC7313_SendByte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SC7313_SDA = CY; //送数据口
SC7313_SCL = 1; //拉高时钟线
delay_us(5); //延时
SC7313_SCL = 0; //拉低时钟线
delay_us(5); //延时
}
//SC7313_SendACK(0); //发送应答信号(0:ACK 1:NAK)
if(SC7313_RecvACK()==0) // 检测从机应答
{
SC7313_Stop(); //停止信号
}
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
unsigned char SC7313_RecvByte()
{
unsigned char i;
unsigned char dat = 0;
SC7313_SDA = 1; //使能内部上拉,准备读取数据
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SC7313_SCL = 1; //拉高时钟线
delay_us(5); //延时
dat |= SC7313_SDA; //读数据
SC7313_SCL = 0; //拉低时钟线
delay_us(5); //延时
}
return dat;
}
/**************************************
从IIC地址(address)中读取1字节数据
将设备的address地址中的数据读出返回参数中
入口参数:address (0x00H-0xFFH)
**************************************/
unsigned char SC7313_ReadData()
{
unsigned char dat;
SC7313_Start(); //起始信号
SC7313_SendByte(SC7313_Address); //发送设备地址+写信号
SC7313_Start(); //起始信号
SC7313_SendByte(SC7313_Address+1); //发送设备地址+读信号
dat = SC7313_RecvByte();
SC7313_SendACK(1); //最后一个数据需要会NAK
SC7313_Stop(); //停止信号
return dat;
}
/**************************************
向IIC地址(address)中写1字节数据
将BUF数据写入设备的address地址中
入口参数:address (0x00H-0xFFH),BUF数据
**************************************/
void SC7313_WriteData(unsigned char dat)
{
SC7313_Start(); //起始信号
SC7313_SendByte(SC7313_Address); //发送设备地址+写信号
SC7313_SendByte(dat); //发送数据
SC7313_Stop(); //停止信号
}
/**************************************
向IIC地址(address)中写1字节数据
将BUF数据写入设备的address地址中
入口参数:address (0x00H-0xFFH),BUF数据
**************************************/
void SC7313_WriteDataLen(unsigned char dat[],unsigned char len)
{
unsigned char i;
SC7313_Start(); //起始信号
SC7313_SendByte(SC7313_Address); //发送设备地址+写信号
for (i=0; i
{
SC7313_SendByte(dat[i]); //发送数据
}
SC7313_Stop(); //停止信号
}
//--------------------------------------- I2C协议 END-------------------------------------------//
//--------------------------------------- SC7313基础设置 -------------------------------------------//