#include "QN8027Drive.h"
#include "I2C.h"
#include "COMFUNC.h"
UINT8 Qn8025Buff[25];
// UINT8 Volume;
// UINT16 freq;
extern bit Ask;
#define tryCount 8
/*******************************************************************************
* 函 数 名:Qn8025SetReg
* 功能说明:Reg(Reg地址)Vaule(值)
* 形 参:
* 返 回 值: 1=suress,0=fail
********************************************************************************/
bit Qn8027Write1Byte(UINT8 Reg,Vaule)
{
I2cStart();
I2cWriteByte(0x58);
if(!ReadAck()) //应答检测,0有应答
{
I2cWriteByte(Reg);
if(!ReadAck())
{
I2cWriteByte(Vaule);
ReadAck();//应答检测
}
}
I2cStop();
return !Ask;
}
/*******************************************************************************
* 函 数 名:Qn8025ReadReg
* 功能说明:Reg(Reg地址)
* 形 参:
* 返 回 值: 读回数据
********************************************************************************/
UINT8 Qn8027Read1Byte(UINT8 reg)
{
UINT8 Data=0x00;
I2cStart();
I2cWriteByte(0x58);
if (!ReadAck()) //应答检测
{
I2cWriteByte(reg);
if (!ReadAck()) //应答检测
{
I2cStart();
I2cWriteByte(0x59);
if (!ReadAck()) //应答检测
{
Data = I2cReadByte();
I2cSendNoAck();//发送noAsk结束数据传输
}
}
}
I2cStop();
return Data;
}
/*******************************************************************************
* 函 数 名:Qn8025SetReg
* 功能说明:
* 形 参:
* 返 回 值: 1 ok,0fail
********************************************************************************/
bit Qn8027SetReg(UINT8 Regis_Addr,UINT8 Data)
{
UINT8 count=tryCount;
while(--count)
{
if(Qn8027Write1Byte(Regis_Addr,Data)) break;
}
if(!count)return 0;
else return 1;
}
/*******************************************************************************
* 函 数 名:Qn8025ReadReg
* 功能说明:
* 形 参:
* 返 回 值:
********************************************************************************/
UINT8 Qn8027ReadReg(UINT8 Regis_Addr)
{
UINT8 ret;
UINT8 count=tryCount;
while(--count)
{
ret = Qn8027Read1Byte(Regis_Addr);
if(!Ask) break;
}
return ret;
}
/*
void QN8025ReadBuff()//读25个寄存器
{
UINT8 i;
I2cStart();
I2cWriteByte(0x20);//写命令+地址
if(!ReadAck())
{
I2cWriteByte(0x00);
I2cSendAsk();
}
I2cStart();
I2cWriteByte(0x21);//发送读命令+地址
if(!ReadAck())//从机应答信号为0,表示写成功。
{
for(i=0;i<0x25;i++)
{
Qn8025Buff[i]=I2cReadByte();
I2cSendAsk();//发送ask继续接受数据
}
I2cSendNoAck();//发送noAsk结束数据传输
}
I2cStop();
}
*/
/*******************************************************************************
* 函 数 名:Qn8025ReadReg
* 功能说明:
* 形 参:
* 返 回 值:
********************************************************************************/
void QN8027_init()
{
Qn8027SetReg(0x00,0x80);
Delay(1000);
Qn8027SetReg(0x04,0x32);
Qn8027SetReg(0x00,0x41);
Delay(1000);
Qn8027SetReg(0x00,0x01);
Qn8027SetReg(0x18,0xE4);
Qn8027SetReg(0x1B,0xF0);
Qn8027SetReg(0x00,0x24);
Qn8027SetReg(0x01,0xF2);
Qn8027SetReg(0x02,0xB9);
Qn8027SetReg(0x08,'y');
Qn8027SetReg(0x09,'e');
Qn8027SetReg(0x0a,'a');
Qn8027SetReg(0x0b,'m');
Qn8027SetReg(0x0c,'i');
Qn8027SetReg(0x0e,'c');
Qn8027SetReg(0x0f,'!');
Qn8027SetReg(0x12,0xff);
}
/*******************************************************************************
* 函 数 名:Qn8027SetFreq
* 功能说明:
* 形 参:
* 返 回 值:
********************************************************************************/
void Qn8027SetFreq(UINT16 freq)
{
/*
UINT16 i;
i=(freq-6175)/5;
Qn8027SetReg(0x07, i&0xff);
Qn8027SetReg(0x0a,(i>>=8));
*/
UINT16 a;
UINT8 b,c ;
a=(freq-760)*2;
c=((UINT8 *)&a)[1];
b=0x20|0x04|((UINT8 *)&a)[0];
Delay(100);
TR0=0;
Qn8027SetReg(0x00,b);
Qn8027SetReg(0x01,c);
TR0=1;
}