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

📄 tuner_drv.c

📁 三洋FM模块的原代码,调试通过了的,很好用的,欢迎大家下载
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -