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

📄 tuner_drv.c

📁 三洋FM模块的原代码,调试通过了的,很好用的,欢迎大家下载
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
********************************************************************************
*          Copyright (C),2005-2006, tonyzyz, Fuzhou Rockchip Co.,Ltd.
*                             All Rights Reserved
*                                    V1.00
* FileName   : NS953 FM Tuner Driver Prog
* Author     : tonyzyz
* Description: 
* History    :        
*           <author>        <time>     <version>       <desc>
*            tonyzyz       06/12/12       1.0            ORG
********************************************************************************
*/


#include <Creg.h>
#include "Macro.h"
#include "Memap.h"
#include "MsgDef.h"
#include "Resource.h"
#include "Global.h"
#include "lcd.h"

#ifdef FM_MODULE
    #define IN_TUNER_DRV
    #include "FmMacro.h"
    #include "FmStruct.h"
    #include "FmGlobal.h"

//******************************************************************************

//------------------------------------------------------------------------------
#define    RFF                      0x10
#define    RFNE                     0x08
#define    TFE                      0x04
#define    TFNF                     0x02
#define    ACTIVITY                 0x01

/*------------------------------------------------------------------------------
Function: IIC System Set
Input:    
Output:   
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void Iic_Config(unsigned int bDevice, unsigned int bMode, unsigned int uAdr)
{
    write_mem(IC_ENABLE,  0x0000);                      //IIC Disable

    if (bDevice) {
        write_mem(GPIO_PCON1,read_mem(GPIO_PCON1) | 0x003c);
        delay_nops(100);
        write_mem(I2C_EXT,    0x0001);
    } else {
        write_mem(GPIO_PCON1,read_mem(GPIO_PCON1) & 0xffc3);
        delay_nops(100);
        write_mem(I2C_EXT,      0x0000);
    }

    write_mem(IC_SAR, 0x55);
    write_mem(IC_TAR, (uAdr >> 1));                     //设备地址右移1位送入地址寄存器,读写控制位通过命令的第9位来控制
    
    if (bMode) {
        write_mem(IC_FS_HCNT, 0x0020);                  //SCL Hight Level Count
        write_mem(IC_FS_LCNT, 0x0044);                  //SCL Low Level Count
        write_mem(IC_CON,     0x0065);                  //Master Enable / Slave Disable / Fast Mode /  7bit Address / ReStart Enable
    } else {
        write_mem(IC_SS_HCNT, 0x0088);
        write_mem(IC_SS_LCNT, 0x0066);
        write_mem(IC_CON,     0x0063);
    }
	
    write_mem(IC_ENABLE,  0x0001); 
    delay_nops(1600);
}

/*------------------------------------------------------------------------------
Function: IIC System Set
Input:    
Output:   
Description: IIC单个数据传送
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Iic_Single_Write(unsigned int uCmd, unsigned int uData)
{
    unsigned int TimeOut;
    
//------------------------------------------------
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & TFE) == 0) {          //等待IIC FIFO为空
        if (++ TimeOut > 0x8000) return -1;              //超时退出
    }
//------------------------------------------------
    write_mem(IC_DATA_CMD,uCmd);
    
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & TFNF) == 0) {         //等待IIC FIFO NotFull
        if (++ TimeOut > 0x8000) return -2;              //超时退出
    }
    write_mem(IC_DATA_CMD,uData);
//------------------------------------------------
    
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & ACTIVITY) == 1) {   //等待IIC通讯结束
        if (++ TimeOut > 0x8000) return -3;              //超时退出
    }
    
    return 0;
}

/*------------------------------------------------------------------------------
Function: IIC System Set
Input:    
Output:   
Description: IIC单个数据读取
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Iic_Single_Read(unsigned int uCmd)
{
    unsigned int TimeOut, ReturnVal;

//------------------------------------------------
//如果IIC Tx FIFO 不为空,等待其为空
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & TFE) == 0) {          //等待IIC FIFO为空
        if (++ TimeOut > 0x8000) return -1;         //超时退出
    }
    
//如果IIC Rx FIFO 不为空, 读取IIC数据,使其为空
    while ((read_XDATA(IC_STATUS) & RFNE) == 1) {       //清空IIC Rx FIFO
        ReturnVal = read_mem(IC_DATA_CMD);
    }
//------------------------------------------------
    write_mem(IC_DATA_CMD,uCmd);
    
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & TFNF) == 0) {         //等待IIC FIFO NotFull
        if (++ TimeOut > 0x8000) return -2;         //超时退出
    }
    write_mem(IC_DATA_CMD,0x0100);
    
//------------------------------------------------
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & RFNE) == 0) {       //等待接收数据
        if (++ TimeOut > 0x8000) return -3;
    }
    ReturnVal = read_mem(IC_DATA_CMD);
    
//------------------------------------------------
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & ACTIVITY) == 1) {   //等待IIC通讯结束
        if (++ TimeOut > 0x8000) return -4;         //超时退出
    }
    
    return (ReturnVal & 0x00ff);
}

/*------------------------------------------------------------------------------
Function: IIC System Set
Input:    
Output:   
Description: IIC单个数据传送
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Iic_Multi_Write(unsigned int uCmd, unsigned int *pData, unsigned int Count)
{
    unsigned int TimeOut;
    
//------------------------------------------------
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & TFE) == 0) {          //等待IIC FIFO为空
        if (++ TimeOut > 0x8000) return -1;              //超时退出
    }
//------------------------------------------------
    write_mem(IC_DATA_CMD,uCmd);                        //IIC寄存器起始地址
    
    while(Count > 0) {
        TimeOut = 0;
        while ((read_XDATA(IC_STATUS) & TFNF) == 0) {     //等待IIC FIFO NotFull
            if (++ TimeOut > 0x8000) return -2;          //超时退出
        }
        write_mem(IC_DATA_CMD,(*pData++)&0xf0ff);
        
        Count -- ;
    }
//------------------------------------------------
    
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & ACTIVITY) == 1) {   //等待IIC通讯结束
        if (++ TimeOut > 0x8000) return -3;              //超时退出
    }
    
    return 0;
}

/*------------------------------------------------------------------------------
Function: IIC System Set
Input:    
Output:   
Description: IIC单个数据读取
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Iic_Multi_Read(unsigned int uCmd, unsigned int *pData, unsigned int Count)
{
    unsigned int TimeOut, ReturnVal;

//------------------------------------------------
//如果IIC Tx FIFO 不为空,等待其为空
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & TFE) == 0) {          //等待IIC FIFO为空
        if (++ TimeOut > 0x8000) return -1;         //超时退出
    }
    
//如果IIC Rx FIFO 不为空, 读取IIC数据,使其为空
    while ((read_XDATA(IC_STATUS) & RFNE) == 1) {       //清空IIC Rx FIFO
        ReturnVal = read_mem(IC_DATA_CMD);
    }
//------------------------------------------------
    write_mem(IC_DATA_CMD,uCmd);
    
    while(Count > 0) {
        TimeOut = 0;
        while ((read_XDATA(IC_STATUS) & TFNF) == 0) {         //等待IIC FIFO NotFull
            if (++ TimeOut > 0x8000) return -2;         //超时退出
        }
        write_mem(IC_DATA_CMD,0x0100);
    
//------------------------------------------------
        TimeOut = 0;
        while ((read_XDATA(IC_STATUS) & RFNE) == 0) {       //等待接收数据
            if (++ TimeOut > 0x8000) return -3;
        }
        *pData++ = read_mem(IC_DATA_CMD);
        Count -- ;
    }
    
//------------------------------------------------
    TimeOut = 0;
    while ((read_XDATA(IC_STATUS) & ACTIVITY) == 1) {   //等待IIC通讯结束
        if (++ TimeOut > 0x8000) return -4;         //超时退出
    }
    
    return (0);
}

//******************************************************************************

unsigned int TunerRegTab[14] __attribute__((section(".fm_data,\"aw\""))) = {
    0x13,       //Power Off, Mute On, IF Count Off, Stereo On, Stereo Judgement
    0x00,       //Pll
    0xc0,       //Xtal = 32768, SysFreq = 8192
    0x26,       //R3
    0xc3,       //R4
    0x61,       //R5
    0x88,       //R6
    0x5d,       //R7
    0x0f,       //R8
    0x8d,       //R9
    0x28,       //R10
    0x8d,       //R11
    0x04,       //R12
    0x00        //R13
};
/*------------------------------------------------------------------------------
Function: Freq++
Input:    
Output:   
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void Tuner_FreqStepUp(unsigned int step)
{
    GlobalFmVar.FmFreq += step;
    if(GlobalFmVar.FmFreq > FmFreqMaxVal)
        GlobalFmVar.FmFreq = FmFreqMinVal;
}

/*------------------------------------------------------------------------------
Function: Freq--
Input:    
Output:   
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void Tuner_FreqStepDown(unsigned int step)
{
    GlobalFmVar.FmFreq -= step;
    
    if(GlobalFmVar.FmFreq < FmFreqMinVal)
        GlobalFmVar.FmFreq = FmFreqMaxVal;
}

/*------------------------------------------------------------------------------
Function: Get Next Saved Freq
Input:    
Output:   
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void GetNextStation(void)
{
    unsigned int i;
    
    for (i = 0; i < FREQMAXNUMBLE; i ++) {
        if (++GlobalFmVar.FmSaveNum >= FREQMAXNUMBLE)
            GlobalFmVar.FmSaveNum = 0;
        GlobalFmVar.FmFreq = GlobalFmVar.FmFreqArray[GlobalFmVar.FmSaveNum];
        if ((FmFreqMinVal <= GlobalFmVar.FmFreq) && (GlobalFmVar.FmFreq <= FmFreqMaxVal))
            return;
    }
    GlobalFmVar.FmSaveNum = 0;
    GlobalFmVar.FmFreq = FmFreqMinVal;
}

/*------------------------------------------------------------------------------
Function: Get Prev Saved Freq
Input:    
Output:   
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
void GetPrevStation(void)
{
    unsigned int i;
    
    for (i = 0; i < FREQMAXNUMBLE; i ++) {
        if (GlobalFmVar.FmSaveNum == 0)
            GlobalFmVar.FmSaveNum = FREQMAXNUMBLE;
        GlobalFmVar.FmSaveNum --;
        GlobalFmVar.FmFreq = GlobalFmVar.FmFreqArray[GlobalFmVar.FmSaveNum];
        if ((FmFreqMinVal <= GlobalFmVar.FmFreq) && (GlobalFmVar.FmFreq <= FmFreqMaxVal))
            return;
    }
    GlobalFmVar.FmSaveNum = 0;
    GlobalFmVar.FmFreq = FmFreqMinVal;
}

/*------------------------------------------------------------------------------
Function: PLL Count Set
Input:    
Output:   
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
unsigned int Tuner_FreqToPll(unsigned int TunerFrequency)
{
    unsigned long tempL;
    
    /*87.00MHz == 87000KHz == 8700*10KHz */
    tempL = (((unsigned long)TunerFrequency * 10000 - 375000) + 4096) >> 13;
    
    return ((unsigned int)(tempL & 0x3fff));
}

/*------------------------------------------------------------------------------
Function: PLL Count Set
Input:    
Output:   
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
int Tuner_CommandSet(unsigned int uCmd, unsigned int uData)
{
    int ReturnVal;
    
    Iic_Config(1, 0, TUNER_ADD_W);
    ReturnVal = Iic_Single_Write(uCmd, uData);
    
    return (ReturnVal);
}

/*------------------------------------------------------------------------------
Function: PLL Count Set
Input:    
Output:   
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))
unsigned int Tuner_DataRead(unsigned int uCmd)
{
    int ReturnVal;
    
    Iic_Config(1, 0, TUNER_ADD_R);              //TUNER_ADD_W
    ReturnVal = Iic_Single_Read(uCmd);
    return(ReturnVal);
}

/*------------------------------------------------------------------------------
Function: PLL Count Set
Input:    
Output:   
------------------------------------------------------------------------------*/
__attribute__((section(".fm_text,\"ax\"")))

⌨️ 快捷键说明

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