⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 halkt0803.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
#include "utiltypedef.h"
#include "va4010reg.h"
#include "halKT0803.h"

#if (FM_TRANS_MODULE == FM_TRANS_KT0803)

/********** Function Definition 函数定义 ************/
#define DELAY(x)    DelayUs(x)

static void FMI2C_Start(void)
{
    /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
    //Set SDA Direction	
    FM_SCL_OUTPUT();
    FM_SDA_OUTPUT();	  
    FM_SDA=1;
    FM_SCL=1;
    DELAY(WAIT_TIME);
    FM_SDA=0;
    DELAY(WAIT_TIME);
    FM_SCL=0;
    DELAY(WAIT_TIME);
}

static void FMI2C_Stop(void)
{
    /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
    FM_SDA_OUTPUT();
    FM_SCL_OUTPUT();
    FM_SDA=0;
    FM_SCL=1;
    DELAY(WAIT_TIME);
    FM_SDA=1;
    DELAY(WAIT_TIME);
    FM_SCL=0;
    DELAY(WAIT_TIME);
}

static void FMSEND_0(void)   /* SEND ACK */
{
    /*发送0,在SCL为高电平时使SDA信号为低*/
    FM_SDA_OUTPUT();	
    FM_SDA=0;
    FM_SCL=1;
    DELAY(WAIT_TIME);
    FM_SCL=0;
    DELAY(WAIT_TIME);
}

static void FMSEND_1(void)
{
    /*发送1,在SCL为高电平时使SDA信号为高*/
    FM_SDA_OUTPUT();	
    FM_SDA=1;
    FM_SCL=1;
    DELAY(WAIT_TIME);
    FM_SCL=0;
    DELAY(WAIT_TIME);
}

#if 0
static void FMSet_Ack(void)
{
	FMSEND_0();
}

void FMSet_Nak(void)
{
	FMSEND_1();
}
#endif

static BOOL FMCheck_Acknowledge(void)
{
	BOOL bRet = FALSE;	

	FM_SDA_INPUT();
	/*发送完一个字节后检验设备的应答信号*/
	FM_SCL=1; // the ninth cycle, check SDA
	DELAY(WAIT_TIME>>1);
//	tmp = FM_SDA; //get response from slave device
	if(FM_SDA == I2C_ACK)
		bRet = TRUE;
	DELAY(WAIT_TIME>>1);
	FM_SCL=0;
	DELAY(WAIT_TIME);

	return bRet;
}

static void FMWriteI2CByte(BYTE b)//reentrant
{
    /*向I2C总线写一个字节*/
    BYTE i;
    FM_SCL_OUTPUT();
    //SDA_OUTPUT();	  	
    for(i=0;i<8;i++)
        if((b<<i)&0x80)
            FMSEND_1();
        else
            FMSEND_0();
}

#if 0
static BYTE FMReadI2CByte(void)//reentrant
{
    /*从I2C总线读一个字节*/
    BYTE b=0,i;
    FM_SCL_OUTPUT();
    FM_SDA_INPUT(); 	
    //Here master should generate 8 cycle on SCL	
    for(i=0;i<8;i++)
    {
        FM_SCL=1;    /*接受数据*/
        DELAY(WAIT_TIME>>1);
        //F0=SDA;  //Receive data from device
        b <<= 1;
        if(FM_SDA==1)        
            b |= 0x01;
        else
            b &= 0xFE;

        DELAY(WAIT_TIME>>1);
        FM_SCL=0;
	 DELAY(WAIT_TIME);	
    }
    return b;
}
#endif

static BYTE halSetFMReg(BYTE byReg, BYTE byValue)
{
//	BYTE byRet = TRUE;

	FMI2C_Start();
	
	FMWriteI2CByte(KT_DEVADDR_WR);//device address
	if(!FMCheck_Acknowledge())
	{
		UartOutText("Write == Write dev address fail\r\n");
		FMI2C_Stop();
		return FALSE;
	}
	
	FMWriteI2CByte(byReg);// register 1
	if(!FMCheck_Acknowledge())
	{
		UartOutText("Write == Write reg fail\r\n");
		FMI2C_Stop();
		return FALSE;
	}
	
	FMWriteI2CByte(byValue);
	if(!FMCheck_Acknowledge())
	{
		UartOutText("Write == Write value fail\r\n");
		FMI2C_Stop();
		return FALSE;
	}
	
	FMI2C_Stop();

	DelayMs(20);
	
	return TRUE;
}

#if 0
static BYTE halFMGetReg(BYTE byReg)
{
	BYTE byData;
	FMI2C_Start();
	
	FMWriteI2CByte(KT_DEVADDR_WR);
	if(!FMCheck_Acknowledge())
	{
		UartOutText("Read == Write dev address fail\r\n");
		FMI2C_Stop();
		return 0xFF;
	}

	FMWriteI2CByte(byReg);
	if(!FMCheck_Acknowledge())
	{
		UartOutText("Read == Write reg fail\r\n");
		FMI2C_Stop();
		return 0xFF;
	}

	FMI2C_Start();
	FMWriteI2CByte(KT_DEVADDR_RD);
	if(!FMCheck_Acknowledge())
	{
		UartOutText("Read == Write dev address fail\r\n");
		FMI2C_Stop();
		return 0xFF;
	}
	
	byData = FMReadI2CByte();
	FMSet_Nak();
	
	FMI2C_Stop();
	DelayMs(10);
	return byData;
	
}
#endif

static BYTE data s_FMIdx;
void halFMSet(BYTE byChIdx)
{
	BYTE byLow, byHi, byTryCnt;
	WORD wFMValue = FM_FREQ_BASE+byChIdx;
	byHi = (BYTE)(wFMValue >> 8);
	byLow = (BYTE)wFMValue;

//	WDT = 0x1F;
	UartOutText("Set CH_SEL0 "); UartOutValue(byLow, 2);
	byTryCnt = 0;
	while(halSetFMReg(CH_SEL0, byLow) == FALSE){
		if(byTryCnt > 7) break;
		DelayMs(50);
		byTryCnt++;
	}
	
	UartOutText("Set CH_SEL1 "); UartOutValue(byHi, 2);
	byTryCnt = 0;
	while(halSetFMReg(CH_SEL1, byHi) == FALSE){
		if(byTryCnt > 7) break;
		DelayMs(50);
		byTryCnt++;
	}

	s_FMIdx = byChIdx;

	return;
}

#if 0
BYTE halFMGet(void)
{	
	BYTE byLow, byHi;
	WORD wFMValue = 0;
	byLow = halFMGetReg(CH_SEL0);
	byHi = halFMGetReg(CH_SEL1);
	wFMValue = byHi;
	wFMValue <<= 8;
	wFMValue |= byLow;
	UartOutText("Read FM value: "); UartOutValue(wFMValue, 4);
	return (BYTE)(wFMValue - FM_FREQ_BASE);
}
#endif

void halFMUp(void)	//byChIdx: 0-> 203
{
	s_FMIdx++;
	if(s_FMIdx >=FM_CHIDX_MAX){//Over Max
		s_FMIdx = 0;		
	}	

	halFMSet(s_FMIdx);	
	
	return;
}

void halFMDown(void)	//byChIdx: 0-> 203
{
	if(s_FMIdx == 0){//Minmal
		s_FMIdx = FM_CHIDX_MAX;//turn around		
	}else
		s_FMIdx--;

	halFMSet(s_FMIdx);	
	
	return;
}

WORD halFMGetFreq(void)
{
//	FMDigital = FM_FREQ_BASE+FMLevel;
	WORD wTmp = FM_FREQ_BASE + (WORD)s_FMIdx;

	UartOutText("-I-: halFMGetFreq 0x");UartOutValue(wTmp, 4);
	return wTmp;
}

BYTE halFMGetIdx(void)
{
//	FMDigital = FM_FREQ_BASE+FMLevel;
	//WORD wTmp = FM_FREQ_BASE + s_FMIdx;

	return s_FMIdx;
}

BYTE halFMFreq2Idx(WORD wFreq)
{
	WORD wTmp = wFreq;

	//Checking parameter validation
	if((wFreq>=FM_FREQ_BASE) && (wFreq<=FM_FREQ_MAX)){
		wTmp = wTmp - FM_FREQ_BASE; 
	}else{
		wTmp = FM_CHIDX_INVALID;
	}		
	
	return (BYTE)wTmp;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -