📄 halkt0803.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 + -