📄 tuner_drv.c
字号:
int Tuner_FreqSet(unsigned int TunerFrequency, int Offset)
{
int ReturnVal;
unsigned int PllVal;
unsigned int temp[2]={0,0};
PllVal = Tuner_FreqToPll(TunerFrequency);
PllVal += Offset;
TunerRegTab[1] = PllVal & 0xff;
TunerRegTab[2] = (TunerRegTab[2] & 0xc0) | (PllVal >> 8);
Iic_Config(1, 0, TUNER_ADD_W);
ReturnVal = Iic_Multi_Write(TUNER_REG_R1, &TunerRegTab[1], 2);
return(ReturnVal);
}
/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Tuner_ReadSTOStatus(void)
{
int temp;
temp = Tuner_DataRead(TUNER_REG_R8);
return(temp & 0xff80);
}
/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Tuner_MuteControl(unsigned int bMute)
{
int ReturnVal; // Iic_Config();
TunerRegTab[0] &= ((~TUNER_R0_MUTE) & (~TUNER_R0_IFCST));
if (bMute) TunerRegTab[0] |= TUNER_R0_MUTE;
ReturnVal = Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]);
return (ReturnVal);
}
/*------------------------------------------------------------------------------
Function: Ns953 PowerOn Initial
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void Tuner_PowerOnInitial(void)
{
int ReturnVal;
unsigned int temp;
temp = Tuner_FreqToPll(GlobalFmVar.FmFreq);
TunerRegTab[1] = temp & 0xff;
TunerRegTab[2] = (TunerRegTab[2] & 0xc0) | (temp >> 8);
TunerRegTab[0] &= 0xfffe;
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]); //Power Off
ReturnVal = Iic_Multi_Write(TUNER_REG_R0, TunerRegTab, 14);
TunerRegTab[0] |= 0x0001;
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]); //Power On
}
/*------------------------------------------------------------------------------
Function: Ns953 Power Save Mode
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void Tuner_PowerDown(void)
{
TunerRegTab[0] &= 0xfffe;
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]); //Power Off
}
/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
unsigned int Count1 = 0;
unsigned int Count2 = 0;
unsigned int Count3 = 0;
unsigned int Count4 = 0;
unsigned int Count5 = 0;
__attribute__((section(".fm_text,\"ax\"")))
void Tuner_FreqSeek(unsigned int SeekState)
{
switch (SeekState) {
case MSG_FUNCTION1_FM_SEEK_START:
{//Addtion Or Subtration of Freq
if ((GlobalFmVar.FmState == FM_STATE_AUTO) && (GlobalFmVar.FmFreq == FmFreqMaxVal)) {
//自动搜台结束
GlobalFmVar.FmState = FM_STATE_PRESET;
GlobalFmVar.FmSaveNum = 0;
GlobalFmVar.FmFreq = GlobalFmVar.FmFreqArray[GlobalFmVar.FmSaveNum];
if((GlobalFmVar.FmFreq < FmFreqMinVal) || (GlobalFmVar.FmFreq > FmFreqMaxVal)){
GlobalFmVar.FmFreq = FmFreqMinVal;
}
FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
FmDisplayFlag |= (FM_DISPFLAG_GUAGE | FM_DISPFLAG_FREQ | FM_DISPFLAG_CH);
// PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_FREQ_SET,0,0,0,0,0,0);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_FREQ_SET,0,0);
} else {
bitclear_creg(%imask,5);
FmTimerCount = 4;
//如果越界,时间要长
if (((UpDownFlag == TUN_UP) && (GlobalFmVar.FmFreq == FmFreqMinVal)) ||
((UpDownFlag == TUN_DOWN) && (GlobalFmVar.FmFreq == FmFreqMaxVal))) {
FmTimerCount = 7;
// Count1 = 0;
// Count2 = 0;
// Count3 = 0;
// Count4 = 0;
// Count5 = 0;
}
bitset_creg(%imask,5);
if (UpDownFlag == TUN_UP) {
Tuner_FreqStepUp(10);
} else {
Tuner_FreqStepDown(10);
}
Tuner_FreqSet(GlobalFmVar.FmFreq, 0);
FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
FmDisplayFlag |= (FM_DISPFLAG_FREQ | FM_DISPFLAG_GUAGE);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_RSSI,0);
}
break;
}
case MSG_FUNCTION1_FM_SEEK_RSSI:
{//Read RSSI, If RSSI == 1, Set IFCST; else return to "Addtion Or Subtration of Freq"
if (Tuner_ReadSTOStatus()) { //Read RSSI
bitclear_creg(%imask,5);
FmTimerCount = 3;
bitset_creg(%imask,5);
//SWSTD = IF, IFCST = 1
TunerRegTab[0] &= ((TUNER_SWSTD_MASK) & (~TUNER_R0_IFCST));
TunerRegTab[0] |= (TUNER_SWSTD_IF | TUNER_R0_IFCST);
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_IF1,0);
} else {
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_START,0);
}
break;
}
case MSG_FUNCTION1_FM_SEEK_IF1:
{//Read IF, if IF == 1, Pll + 3; else set SWSTD = RSSI And return to "Addtion Or Subtration of Freq"
if (Tuner_ReadSTOStatus()) { //Read IF
////------------------------------------------------
//#ifdef LCD_MEMORY_DEV
// DmaFillImage2Lcd();
//#endif
////------------------------------------------------
bitclear_creg(%imask,5);
FmTimerCount = 4;
bitset_creg(%imask,5);
Tuner_FreqSet(GlobalFmVar.FmFreq, 3);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_IFSTART2,0);
} else {
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_ON,MSG_FUNCTION1_FM_AUTO_SEEK,0);
}
break;
}
case MSG_FUNCTION1_FM_SEEK_IFSTART2:
{//Set IFCST, Start IF Counter
bitclear_creg(%imask,5);
FmTimerCount = 3;
bitset_creg(%imask,5);
//SWSTD = IF, IFCST = 1
TunerRegTab[0] &= ((TUNER_SWSTD_MASK) & (~TUNER_R0_IFCST));
TunerRegTab[0] |= (TUNER_SWSTD_IF | TUNER_R0_IFCST);
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_IF2,0);
break;
}
case MSG_FUNCTION1_FM_SEEK_IF2:
{//Read IF, if IF == 1, Pll - 2; else set SWSTD = RSSI And return to "Addtion Or Subtration of Freq"
if (Tuner_ReadSTOStatus()) { //Read IF
bitclear_creg(%imask,5);
FmTimerCount = 4;
bitset_creg(%imask,5);
Tuner_FreqSet(GlobalFmVar.FmFreq, -2);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_IFSTART3,0);
} else {
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_ON,MSG_FUNCTION1_FM_AUTO_SEEK,0);
}
}
case MSG_FUNCTION1_FM_SEEK_IFSTART3:
{//Set IFCST, Start IF Counter
bitclear_creg(%imask,5);
FmTimerCount = 3;
bitset_creg(%imask,5);
TunerRegTab[0] &= ((TUNER_SWSTD_MASK) & (~TUNER_R0_IFCST));
TunerRegTab[0] |= (TUNER_SWSTD_IF | TUNER_R0_IFCST);
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_IF3,0);
break;
}
case MSG_FUNCTION1_FM_SEEK_IF3:
{//Read IF, if IF == 1, Pll + 6; else set SWSTD = RSSI And return to "Addtion Or Subtration of Freq"
if (Tuner_ReadSTOStatus()) { //Read IF
bitclear_creg(%imask,5);
FmTimerCount = 4;
bitset_creg(%imask,5);
Tuner_FreqSet(GlobalFmVar.FmFreq, 6);
TunerRegTab[0] &= ((TUNER_SWSTD_MASK) & (~TUNER_R0_IFCST));
TunerRegTab[0] |= (TUNER_SWSTD_JL);
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_IFSTART4,0);
} else {
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_ON,MSG_FUNCTION1_FM_AUTO_SEEK,0);
}
break;
}
case MSG_FUNCTION1_FM_SEEK_IFSTART4:
{//Set IFCST, Start IF Counter
bitclear_creg(%imask,5);
FmTimerCount = 3;
bitset_creg(%imask,5);
TunerRegTab[0] &= ((TUNER_SWSTD_MASK) & (~TUNER_R0_IFCST));
TunerRegTab[0] |= (TUNER_SWSTD_JL | TUNER_R0_IFCST);
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_IF4,0);
break;
}
case MSG_FUNCTION1_FM_SEEK_IF4:
{//Read IF, if IF == 1, Pll, Search End; else set SWSTD = RSSI And return to "Addtion Or Subtration of Freq"
if (Tuner_ReadSTOStatus()) { //Read IF
bitclear_creg(%imask,5);
FmTimerCount = 4;
bitset_creg(%imask,5);
if (GlobalFmVar.FmState == FM_STATE_AUTO) {
//搜索到电台并保存
FmDisplayFlag |= FM_DISPFLAG_CH;
GlobalFmVar.FmFreqArray[GlobalFmVar.FmSaveNum] = GlobalFmVar.FmFreq;
if ((GlobalFmVar.FmFreq == FmFreqMaxVal) || (++GlobalFmVar.FmSaveNum >= FREQMAXNUMBLE)) {
GlobalFmVar.FmState = FM_STATE_PRESET;
bitclear_creg(%imask,5);
FmTimerCount = 20;
bitset_creg(%imask,5);
AmplifierOff();
GlobalFmVar.FmSaveNum = 0;
GlobalFmVar.FmFreq = GlobalFmVar.FmFreqArray[GlobalFmVar.FmSaveNum];
if((GlobalFmVar.FmFreq < FmFreqMinVal) || (GlobalFmVar.FmFreq > FmFreqMaxVal)){
GlobalFmVar.FmFreq = FmFreqMinVal;
}
FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
FmDisplayFlag |= (FM_DISPFLAG_GUAGE | FM_DISPFLAG_FREQ | FM_DISPFLAG_CH);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_ON,MSG_FUNCTION1_FM_FREQ_SET,0);
break;
}
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_ON,MSG_FUNCTION1_FM_AUTO_SEEK,0);
} else {
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_OFF,0,0);
}
Tuner_FreqSet(GlobalFmVar.FmFreq, 0);
} else {
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_ON,MSG_FUNCTION1_FM_AUTO_SEEK,0);
}
break;
}
default:
break;
}
}
/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void FmPlay(void)
{
if (FmTimerCount > 0) return;
switch (Fun1MsgArray[2])
{
case MSG_FUNCTION1_FM_MUTE_ON: //静音
{
bitclear_creg(%imask,5);
FmTimerCount = 2;
bitset_creg(%imask,5);
//Mute On, ST Off
TunerRegTab[0] &= ((TUNER_SWSTD_MASK) & (~TUNER_R0_IFCST));
TunerRegTab[0] |= (TUNER_SWSTD_RSSI | TUNER_R0_MUTE | TUNER_R0_MOST); //ST Off
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]);
AmplifierOff();
Fun1MsgArray[2] = Fun1MsgArray[3];
if (Fun1MsgArray[2] == MSG_FUNCTION1_FM_AUTO_SEEK) {
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_AUTO_SEEK,MSG_FUNCTION1_FM_SEEK_START,0);
}
break;
}
case MSG_FUNCTION1_FM_FREQ_SET: //直接设置频率,延时需要加长
{
bitclear_creg(%imask,5);
FmTimerCount = 4;
//bitset_creg(%imask,5);
}
case MSG_FUNCTION1_FM_FREQ_STEP: //简单的频率加/减1
{
bitclear_creg(%imask,5);
FmTimerCount += 2;
bitset_creg(%imask,5);
Tuner_FreqSet(GlobalFmVar.FmFreq, 0);
FmGuageVal = (unsigned int)((unsigned long)(FM_GUAGE_CONST) * (GlobalFmVar.FmFreq - FmFreqMinVal) / (FmFreqMaxVal - FmFreqMinVal));
FmDisplayFlag |= (FM_DISPFLAG_FREQ | FM_DISPFLAG_GUAGE);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_MUTE_OFF,0,0);
break;
}
case MSG_FUNCTION1_FM_AUTO_SEEK: //搜台模式
{
Tuner_FreqSeek(Fun1MsgArray[3]);
break;
}
case MSG_FUNCTION1_FM_MUTE_OFF: //打开声音
{
bitclear_creg(%imask,5);
FmTimerCount = 2;
bitset_creg(%imask,5);
//Mute Off, ST On
TunerRegTab[0] &= ((TUNER_SWSTD_MASK) & (~TUNER_R0_MUTE) & (~TUNER_R0_IFCST) & (~TUNER_SWSTD_ST));
Tuner_CommandSet(TUNER_REG_R0, TunerRegTab[0]);
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_READ_ST,0,0);
break;
}
case MSG_FUNCTION1_FM_READ_ST: //立体声检测
{
if (Tuner_ReadSTOStatus()) { //Read Stereo
//检测到立体声
} else {
}
AmplifierOn();
PostFun1Message(MSG_FUNCTION1_FM,MSG_FUNCTION1_FM_PLAY,MSG_FUNCTION1_FM_PLAY_NONE,0,0);
break;
}
default:
break;
}
}
//******************************************************************************
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -