|
发表于 2021-2-14 13:38:02
|
显示全部楼层
- /************* 功能说明 **************
- 本文件为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<len; i++)
- {
- SC7313_SendByte(dat[i]); //发送数据
- }
- SC7313_Stop(); //停止信号
- }
- //--------------------------------------- I2C协议 END-------------------------------------------//
- //--------------------------------------- SC7313基础设置 -------------------------------------------//
- //================================================================================
- //函数名称:void PowerAudio(unsigned char Ch)
- //函数说明:根据输入音源通道号设置音源的电源开关
- //入口参数: Ch:音源通道0~2
- //出口参数: 无
- //================================================================================
- void PowerAudio(unsigned char Ch)
- {
- switch(Ch)
- {
- case 0:
- MP3_PWR = 1; //高电平开MP3电源
- Audio_RunState = 1; //运行状态1
- break;
- case 1:
- MP3_PWR = 0; //关MP3电源
- Audio_RunState = 2; //运行状态2
- break;
- case 2:
- MP3_PWR = 0; //关MP3电源
- Audio_RunState = 2; //运行状态2
- break;
- default:
- Audio_RunState = 0; //运行状态0
- break;
- }
- }
- //================================================================================
- //函数名称:
- //函数说明:设置输入音源通道0~3,增益0~3,开关0~1
- //入口参数:
- //出口参数: 无
- //================================================================================
- void SC7313_SetAudio(unsigned char Ch, unsigned char Volume, unsigned char State)
- {
- unsigned char Stereo;
- unsigned char Gain;
- unsigned char Loudnes;
- Stereo = Ch;
- Gain = Volume;
-
- if(Stereo>3){Stereo=3;} //0:Stereo1, 1:Stereo2, 2:Stereo3, 3:Stereo4
- if(Gain>3){Gain=3;} //0:+11.25dB, 1:+7.5dB, 2:+3.75dB, 3:0dB
- if(State==1){Loudnes=0;}else{Loudnes=1;}//Loudness 0:ON, 1:OFF
- AMUTE = 1; //高电平功放静音
- delay_ms(100); //延时
- PowerAudio(Stereo); //根据输入音源通道号设置音源的电源开关
- SC7313_WriteData( SC7313_Audio | ((3-Gain)<<3) | (Loudnes<<2) | Stereo ); //[BIT4:0]
- delay_ms(100); //延时
- AMUTE = 0; //取消功放静音
- }
- //================================================================================
- //函数名称:
- //函数说明:
- //入口参数:
- //出口参数: 无
- //================================================================================
- //设置主音量值0~63
- void SC7313_SetVolumeValue(unsigned char Volume)
- {
- if(Volume>63){Volume=63;}// Volume&0x3F
- SC7313_WriteData(SC7313_Volume | (63-Volume)); //[BIT5:0]
- }
- //================================================================================
- //函数名称:
- //函数说明:
- //入口参数:
- //出口参数: 无
- //================================================================================
- //设置主音量级别 0~15
- void SC7313_SetVolume(unsigned char Volume)
- {
- if(Volume>15){Volume=15;}// Volume&0x3F
- SC7313_WriteData(SC7313_Volume | TABLE_Volume[Volume]); //[BIT5:0]
- }
- //================================================================================
- //函数名称:
- //函数说明:
- //入口参数:
- //出口参数: 无
- //================================================================================
- //设置音调(低音)0~14 //-14db ~ +14db 7=0db
- void SC7313_SetBass(unsigned char Volume)
- {
- if(Volume>14){Volume=14;}// Volume&0x0F
- SC7313_WriteData(SC7313_Bass | TABLE_Tone[Volume]); //[BIT3:0]
- }
- //================================================================================
- //函数名称:
- //函数说明:
- //入口参数:
- //出口参数: 无
- //================================================================================
- //设置音调(高音) 0~14 //-14db ~ +14db 7=0db
- void SC7313_SetTreble(unsigned char Volume)
- {
- if(Volume>14){Volume=14;}// Volume&0x0F
- SC7313_WriteData(SC7313_Treble | TABLE_Tone[Volume]); //[BIT3:0]
- }
- //================================================================================
- //函数名称:
- //函数说明:
- //入口参数:
- //出口参数: 无
- //================================================================================
- //设置四个扬声器衰减0db ~ -30db Volume(31)0x1F=MUTE
- void SC7313_SetSpeaker(unsigned char Speaker, unsigned char Volume)
- {
- unsigned char dat;
- if(Volume>31){Volume=31;} // Volume&0x1F Volume(31)0x1F=MUTE
- if(Speaker>3){Speaker=3;} //
- switch(Speaker)
- {
- case 0:dat = SC7313_SpeakerLR | Volume;break;//后左声道
- case 1:dat = SC7313_SpeakerRR | Volume;break;//后右声道
- case 2:dat = SC7313_SpeakerLF | Volume;break;//前左声道
- case 3:dat = SC7313_SpeakerRF | Volume;break;//前右声道
- default:break;
- }
- SC7313_WriteData(dat); //[BIT4:0]
- }
- //--------------------------------------- SC7313基础设置 END-------------------------------------------//
- //================================================================================
- //函数名称:void SC7313_SetChannel(unsigned char Channel)
- //函数说明:设置输入音源通道0~3
- //入口参数: Channel:0~3
- //出口参数: 无
- //================================================================================
- void SC7313_SetChannel(unsigned char Channel)
- {
- //Audio_Para[Audio_MainVolume] = //主音量 //范围值(0-63)
- Audio_Para[Audio_MainChannel] = Channel; //声音通道 //范围值(0-2)
- //Audio_Para[Audio_GainLevel] = //增益级别 //范围值(0-3)
- //Audio_Para[Audio_LoudnessSW] = //响度开关 //范围值(0-1)
- //Audio_Para[Audio_BassVolume] = //低音音量 //范围值(0-14)
- //Audio_Para[Audio_TrebleVolume] = //高音音量 //范围值(0-14)
- SC7313_SetAudio( Audio_Para[Audio_MainChannel], Audio_Para[Audio_GainLevel], Audio_Para[Audio_LoudnessSW] ); //设置输入音源通道0~3,增益0~3,开关0~1
- //SC7313_SetAll(); //SC7313写入全部参数
- }
- //================================================================================
- //函数名称:void SC7313_SetGain(unsigned char GainLevel)
- //函数说明:设置输入音源增益0~3
- //入口参数: GainLevel:0~3
- //出口参数: 无
- //================================================================================
- void SC7313_SetGain(unsigned char GainLevel)
- {
- //Audio_Para[Audio_MainVolume] = //主音量 //范围值(0-63)
- //Audio_Para[Audio_MainChannel] = Channel; //声音通道 //范围值(0-2)
- Audio_Para[Audio_GainLevel] = GainLevel; //增益级别 //范围值(0-3)
- //Audio_Para[Audio_LoudnessSW] = //响度开关 //范围值(0-1)
- //Audio_Para[Audio_BassVolume] = //低音音量 //范围值(0-14)
- //Audio_Para[Audio_TrebleVolume] = //高音音量 //范围值(0-14)
- SC7313_SetAudio( Audio_Para[Audio_MainChannel], Audio_Para[Audio_GainLevel], Audio_Para[Audio_LoudnessSW] ); //设置输入音源通道0~3,增益0~3,开关0~1
- //SC7313_SetAll(); //SC7313写入全部参数
- }
- //================================================================================
- //函数名称:void SC7313_SetLoudness(unsigned char SW)
- //函数说明:设置输入音源响度开关0~1
- //入口参数: SW:0~1
- //出口参数: 无
- //================================================================================
- void SC7313_SetLoudness(unsigned char SW)
- {
- //Audio_Para[Audio_MainVolume] = //主音量 //范围值(0-63)
- //Audio_Para[Audio_MainChannel] = Channel; //声音通道 //范围值(0-2)
- //Audio_Para[Audio_GainLevel] = //增益级别 //范围值(0-3)
- Audio_Para[Audio_LoudnessSW] = SW; //响度开关 //范围值(0-1)
- //Audio_Para[Audio_BassVolume] = //低音音量 //范围值(0-14)
- //Audio_Para[Audio_TrebleVolume] = //高音音量 //范围值(0-14)
- SC7313_SetAudio( Audio_Para[Audio_MainChannel], Audio_Para[Audio_GainLevel], Audio_Para[Audio_LoudnessSW] ); //设置输入音源通道0~3,增益0~3,开关0~1
- //SC7313_SetAll(); //SC7313写入全部参数
- }
- //================================================================================
- //函数名称:void SC7313_VolumeUP()
- //函数说明:主音量级别++ 0~15
- //入口参数: 无
- //出口参数: 无
- //================================================================================
- void SC7313_VolumeUP()
- {
- if(Audio_Para[Audio_MainVolume]<15)
- {
- Audio_Para[Audio_MainVolume] ++; //主音量 //范围值(0-15)
- SC7313_SetVolume( Audio_Para[Audio_MainVolume] ); //设置主音量级别 0~15
- }
- }
- //================================================================================
- //函数名称:void SC7313_VolumeDOWN()
- //函数说明:主音量级别-- 0~15
- //入口参数: 无
- //出口参数: 无
- //================================================================================
- void SC7313_VolumeDOWN()
- {
- if(Audio_Para[Audio_MainVolume]>0)
- {
- Audio_Para[Audio_MainVolume] --; //主音量 //范围值(0-15)
- SC7313_SetVolume( Audio_Para[Audio_MainVolume] ); //设置主音量级别 0~15
- }
- }
- //================================================================================
- //函数名称:void SC7313_ChannelUP()
- //函数说明:切换输入音源通道++ 0~3
- //入口参数: 无
- //出口参数: 无
- //================================================================================
- void SC7313_ChannelUP()
- {
- Audio_Para[Audio_MainChannel] ++; //声音通道 //范围值(0-2)
- if(Audio_Para[Audio_MainChannel]>2)
- {
- Audio_Para[Audio_MainChannel] = 0;
- }
- SC7313_SetAudio( Audio_Para[Audio_MainChannel], Audio_Para[Audio_GainLevel], Audio_Para[Audio_LoudnessSW] ); //设置输入音源通道0~3,增益0~3,开关0~1
- }
- //================================================================================
- //函数名称:void SC7313_ChannelDOWN()
- //函数说明:切换输入音源通道-- 0~3
- //入口参数: 无
- //出口参数: 无
- //================================================================================
- void SC7313_ChannelDOWN()
- {
- Audio_Para[Audio_MainChannel] --; //声音通道 //范围值(0-2)
- if(Audio_Para[Audio_MainChannel]<0)
- {
- Audio_Para[Audio_MainChannel] = 2;
- }
- SC7313_SetAudio( Audio_Para[Audio_MainChannel], Audio_Para[Audio_GainLevel], Audio_Para[Audio_LoudnessSW] ); //设置输入音源通道0~3,增益0~3,开关0~1
- }
- //================================================================================
- //函数名称:void SC7313_SetAll()
- //函数说明:SC7313写入全部参数
- //入口参数: 无
- //出口参数: 无
- //================================================================================
- void SC7313_SetAll()
- {
- SC7313_SetVolume( Audio_Para[Audio_MainVolume] ); //设置主音量 0~15
- SC7313_SetAudio( Audio_Para[Audio_MainChannel], Audio_Para[Audio_GainLevel], Audio_Para[Audio_LoudnessSW] ); //设置输入音源通道0~3,增益0~3,开关0~1
- SC7313_SetSpeaker(0, 0); //后左声道//设置扬声器衰减0db ~ -30db Volume(31)0x1F=MUTE
- SC7313_SetSpeaker(1, 0); //后右声道//设置扬声器衰减0db ~ -30db Volume(31)0x1F=MUTE
- SC7313_SetSpeaker(2, 0); //前左声道//设置扬声器衰减0db ~ -30db Volume(31)0x1F=MUTE
- SC7313_SetSpeaker(3, 0); //前右声道//设置扬声器衰减0db ~ -30db Volume(31)0x1F=MUTE
- SC7313_SetBass( Audio_Para[Audio_BassVolume] ); //+6db 设置音调(低音)0~14 //-14db ~ +14db 7=0db
- SC7313_SetTreble( Audio_Para[Audio_TrebleVolume] ); //+2db 设置音调(高音)0~14 //-14db ~ +14db 7=0db
- }
- //================================================================================
- //函数名称:
- //函数说明:
- //入口参数:
- //出口参数: 无
- //================================================================================
- //SC7313初始化
- void SC7313_Init1(void)
- {
- SC7313_WriteData(0x3F); //SC7313_Volume //主音量 最小
- SC7313_WriteData(0x5C); //SC7313_Audio //Stereo 1 Loudness OFF 0dB
- SC7313_WriteData(0xC0); //SC7313_SpeakerLR //后左声道
- SC7313_WriteData(0xE0); //SC7313_SpeakerRR //后右声道
- SC7313_WriteData(0x80); //SC7313_SpeakerLF //前左声道
- SC7313_WriteData(0xA0); //SC7313_SpeakerRF //前右声道
- SC7313_WriteData(0x6C); //SC7313_Bass //低音 +6db
- SC7313_WriteData(0x7E); //SC7313_Treble //高音 +2db
-
- delay_ms(300);
- SC7313_WriteData(0x0C); //SC7313_Volume //主音量12
- SC7313_WriteData(0x44); //SC7313_Audio //Stereo 1 Loudness ON +11.25dB
- SC7313_WriteData(0xC0); //SC7313_SpeakerLR //后左声道
- SC7313_WriteData(0xE0); //SC7313_SpeakerRR //后右声道
- SC7313_WriteData(0x80); //SC7313_SpeakerLF //前左声道
- SC7313_WriteData(0xA0); //SC7313_SpeakerRF //前右声道
- SC7313_WriteData(0x6C); //SC7313_Bass //低音
- SC7313_WriteData(0x7E); //SC7313_Treble //高音
- }
- //================================================================================
- //函数名称:
- //函数说明:
- //入口参数:
- //出口参数: 无
- //================================================================================
- //SC7313初始化
- void SC7313_Init(void)
- {
- SC7313_SCL = 1; //I2C总线的时钟线
- SC7313_SDA = 1; //I2C总线的数据线
- SC7313_SetVolume(0); //设置主音量 0~15
- SC7313_SetAudio(3, 0, 0); //设置输入音源通道0~3,增益0~3,开关0~1
- SC7313_SetSpeaker(0, 0); //后左声道//设置扬声器衰减0db ~ -30db Volume(31)0x1F=MUTE
- SC7313_SetSpeaker(1, 0); //后右声道//设置扬声器衰减0db ~ -30db Volume(31)0x1F=MUTE
- SC7313_SetSpeaker(2, 0); //前左声道//设置扬声器衰减0db ~ -30db Volume(31)0x1F=MUTE
- SC7313_SetSpeaker(3, 0); //前右声道//设置扬声器衰减0db ~ -30db Volume(31)0x1F=MUTE
- SC7313_SetBass(10); //+6db 设置音调(低音)-14db ~ +14db 7=0db
- SC7313_SetTreble(8); //+2db 设置音调(高音)-14db ~ +14db 7=0db
- delay_ms(100);
- SC7313_SetAll(); //SC7313写入全部参数
-
- }
复制代码
|
打赏
-
查看全部打赏
|