电子开发网
您的位置电子开发网>嵌入式系统>

I2C总线高频头控制Keil C51程序(PLL芯片为TSA5522系列)

时间:2006-12-31   来源:   作者:   点击:……  字体大小:【

/*I2C总线高频头控制Keil C51程序(PLL芯片为TSA5522系列)                               */
//--------------------------------------------------------------------------//
//                                源程序大公开                              //
//                    (c) Copyright 2001-2003 xuwenjun                     //
//                            All Rights Reserved                           //
//                                    V1.00                                 //
//--------------------------------------------------------------------------//
//标 题: I2C总线高频头控制程序(PLL芯片为TSA5522系列)                       //
//文件名: xwj_fi1256.c                                                      //
//版 本: V1.00                                                             //
//修改人: 徐文军                         E-mail:xuwenjun@21cn.com           //
//日 期: 06-02-26 首次公开                                                 //
//描 述: I2C总线高频头控制程序(PLL芯片为TSA5522系列)                       //
//声 明:                                                                   //
//        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
//        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //
//        有问题请mailto xuwenjun@21cn.com   欢迎与我交流!                  //
//--------------------------------------------------------------------------//
//老版本: 无                             老版本文件名:                      //
//创建人: 徐文军                         E-mail:xuwenjun@21cn.com           //
//日 期: 06-02-26                                                          //
//描 述:                                                                   //
//--------------------------------------------------------------------------//

                                                                                                /* 频率单位为KHz     */
#define FUENCY 38900                                                        /* 中频频率          */
#define PLLdataH(f) ((f+FUENCY)*16/1000/256)        /* 频率数据高 第1字节*/
#define PLLdataL(f) ((f+FUENCY)*16/1000%256)        /* 频率数据低 第2字节*/
#define PLLCON1 0x8e                                                        /* 控制字1    第3字节*/
                                                                                                /* 控制字2    第4字节*/
#define PLLCON2(f) (((f)<(168000))?(0xa0):(((f)<(450000))?(0x90):(0x30)))
#define PLLdata3(fchan) PLLdataH (fchan),PLLdataL (fchan),PLLCON2 (fchan)

unsigned char code ucdataTab[][3]=
{
        PLLdata3(49750),        /* 频道DS1 (VL)*/
        PLLdata3(57750),        /* 频道DS2*/
        PLLdata3(65750),        /* 频道DS3 */
        PLLdata3(77250),        /* 频道DS4 */
        PLLdata3(85250),        /* 频道DS5 */
        PLLdata3(112250),        /* 频道Z1 */
        PLLdata3(120250),        /* 频道Z2 */
        PLLdata3(128250),        /* 频道Z3 */
        PLLdata3(136250),        /* 频道Z4 */
        PLLdata3(144250),        /* 频道Z5 */
        PLLdata3(152250),        /* 频道Z6 */
        PLLdata3(160250),        /* 频道Z7 */

        PLLdata3(168250),        /* 频道DS6 (VH)*/
        PLLdata3(176250),        /* 频道DS7 */
        PLLdata3(184250),        /* 频道DS8 */
        PLLdata3(192250),        /* 频道DS9 */
        PLLdata3(200250),        /* 频道DS10 */
        PLLdata3(208250),        /* 频道DS11 */
        PLLdata3(216250),        /* 频道DS12 */
        PLLdata3(224250),        /* 频道Z8 */
        PLLdata3(232250),        /* 频道Z9 */
        PLLdata3(240250),        /* 频道Z10 */
        PLLdata3(248250),        /* 频道Z11 */
        PLLdata3(256250),        /* 频道Z12 */
        PLLdata3(264250),        /* 频道Z13 */
        PLLdata3(272250),        /* 频道Z14 */
        PLLdata3(280250),        /* 频道Z15 */
        PLLdata3(288250),        /* 频道Z16 */
        PLLdata3(296250),        /* 频道Z17 */
        PLLdata3(304250),        /* 频道Z18 */
        PLLdata3(312250),        /* 频道Z19 */
        PLLdata3(320250),        /* 频道Z20 */
        PLLdata3(328250),        /* 频道Z21 */
        PLLdata3(336250),        /* 频道Z22 */
        PLLdata3(344250),        /* 频道Z23 */
        PLLdata3(352250),        /* 频道Z24 */
        PLLdata3(360250),        /* 频道Z25 */
        PLLdata3(368250),        /* 频道Z26 */
        PLLdata3(376250),        /* 频道Z27 */
        PLLdata3(384250),        /* 频道Z28 */
        PLLdata3(392250),        /* 频道Z29 */
        PLLdata3(400250),        /* 频道Z30 */
        PLLdata3(408250),        /* 频道Z31 */
        PLLdata3(416250),        /* 频道Z32 */
        PLLdata3(424250),        /* 频道Z33 */
        PLLdata3(432250),        /* 频道Z34 */
        PLLdata3(440250),        /* 频道Z35 */
        PLLdata3(448250),        /* 频道Z36 */

        PLLdata3(456250),        /* 频道Z37 (UHF)*/
        PLLdata3(464250),        /* 频道Z38 */
        PLLdata3(471250),        /* 频道DS13 */
        PLLdata3(479250),        /* 频道DS14 */
        PLLdata3(487250),        /* 频道DS15 */
        PLLdata3(495250),        /* 频道DS16 */
        PLLdata3(503250),        /* 频道DS17 */
        PLLdata3(511250),        /* 频道DS18 */
        PLLdata3(519250),        /* 频道DS19 */
        PLLdata3(527250),        /* 频道DS20 */
        PLLdata3(535250),        /* 频道DS21 */
        PLLdata3(543250),        /* 频道DS22 */
        PLLdata3(551250),        /* 频道DS23 */
        PLLdata3(559250),        /* 频道DS24 */
        PLLdata3(607250),        /* 频道DS25 */
        PLLdata3(615250),        /* 频道DS26 */
        PLLdata3(623250),        /* 频道DS27 */
        PLLdata3(631250),        /* 频道DS28 */
        PLLdata3(639250),        /* 频道DS29 */
        PLLdata3(647250),        /* 频道DS30 */
        PLLdata3(655250),        /* 频道DS31 */
        PLLdata3(663250),        /* 频道DS32 */
        PLLdata3(671250),        /* 频道DS33 */
        PLLdata3(679250),        /* 频道DS34 */
        PLLdata3(687250),        /* 频道DS35 */
        PLLdata3(695250),        /* 频道DS36 */
        PLLdata3(703250),        /* 频道DS37 */
        PLLdata3(711250),        /* 频道DS38 */
        PLLdata3(719250),        /* 频道DS39 */
        PLLdata3(727250),        /* 频道DS40 */
        PLLdata3(735250),        /* 频道DS41 */
        PLLdata3(743250),        /* 频道DS42 */
        PLLdata3(751250),        /* 频道DS43 */
        PLLdata3(759250),        /* 频道DS44 */
        PLLdata3(767250),        /* 频道DS45 */
        PLLdata3(775250),        /* 频道DS46 */
        PLLdata3(783250),        /* 频道DS47 */
        PLLdata3(791250),        /* 频道DS48 */
        PLLdata3(799250),        /* 频道DS49 */
        PLLdata3(807250),        /* 频道DS50 */
        PLLdata3(815250),        /* 频道DS51 */
        PLLdata3(823250),        /* 频道DS52 */
        PLLdata3(831250),        /* 频道DS53 */
        PLLdata3(839250),        /* 频道DS54 */
        PLLdata3(847250),        /* 频道DS55 */
        PLLdata3(855250),        /* 频道DS56 */
        PLLdata3(863250),        /* 频道DS57 */

        PLLdata3(90100-6500),/* 经济台 (调频收音)*/
        PLLdata3(91000-6500),/* 经济台 */
        PLLdata3(91800-6500),/* 交通台 */
        PLLdata3(97500-6500),/* 文艺台 */
        PLLdata3(100300-6500),/* 交通台 */
        PLLdata3(103200-6500),/* 新闻台 */
        PLLdata3(105000-6500),/* 星沙之声 */
        PLLdata3(106500-6500),/* 音乐台 */
};

                                 /*  有关I2C变量   */
#define AddPllWr 0xc2                                 /*TSA5522写地址*/
#define AddPllRd 0xc3                                 /*TSA5522读地址*/
sbit         SDA   = P0^4;                                  /*串行数据-----------P0.4*/
sbit         SCL   = P0^5;                                  /*串行时钟-----------P0.5*/

                                 /*  I2C相关函数   */
void Start(void);
void Stop(void);
void SendACK(void);
void SendNoACK(void);
unsigned char SendByte(unsigned char d);
unsigned char ReadByte(void);

void SetChan(unsigned char chan);
unsigned char ReadChan(void);

/*--------选择频道--------------------------------------------*/
void SetChan(unsigned char chan)
{
        Start();                                                 /* 发送I2C 总线起始条件  */
        SendByte(AddPllWr);                          /* 发送被控器总线写地址    */
        SendByte(ucdataTab[chan][0]);         /* 发送频率数据高 第1字节*/
        SendByte(ucdataTab[chan][1]);         /* 发送频率数据低 第2字节*/
        SendByte(PLLCON1);                                 /* 发送控制字1    第3字节*/
        SendByte(ucdataTab[chan][2]);         /* 发送控制字1    第4字节*/
        Stop();                                                 /*发送I2C 总线停止条件   */
}

/*-----------读状态----------------------------------------------*/
unsigned char ReadChan(void)
{
        unsigned char i;
        Start();                                                 /* 发送I2C 总线起始条件*/
        SendByte(AddPllRd);                         /*发送被控器总线读地址*/
        i = ReadByte();
        SendNoACK();                                         /*最后一个字节,发送非应答信号*/
        Stop();                                                 /*发送I2C 总线停止条件*/
        return (i);
}

/*------------字节数据传送子程序发送一个字节数据或地址给被控器---------------*/
unsigned char SendByte(unsigned char a)
{
        unsigned char i,j;
        for(i = 0;i < 8;i++)
        {
                if((a & 0x80) == 0)
                        SDA = 0;
                else
                        SDA = 1;
                _nop_();
                        SCL = 1; /*置时钟线为高通知被控器开始*/
                _nop_();_nop_();/*保证时钟高周期大于4 us*/
                SCL = 0;
                _nop_();
                a = a << 1;
        }
        _nop_();
        SDA = 1;
        _nop_();
                SCL = 1;
        j = 0;
        while (SDA == 0)
                if ((++j) == 0) {SCL = 0;return (1);} /*检测256次还未收到应答,返回1*/
        _nop_();
        SCL = 0;
        return (0);  /*成功,返回0*/
}

/*---------------------------------------------------------------------------*/
unsigned char ReadByte(void)                /*数据接收子程序从被控器接收一个字节数据*/
{
        unsigned char i;
        unsigned char bdata Sin;
        SDA = 1;
        for (i = 0;i < 8;i++)
        {
                Sin <<= 1;
                SCL = 0;
                _nop_();
                SCL = 1;
                if(SDA == 1)
                        Sin|= 0x01;
                else
                        Sin&= 0xfe;
                _nop_();
        }
        return(Sin);
}

/*-----------发送应答位--------------------------------------------------*/
void SendACK()
{
        SCL = 0;
        _nop_();
        SDA = 0;
        _nop_();
        SCL = 1;
        _nop_();
        SCL = 0;
}

/*------------发送非应答位-----------------------------------------------*/
void SendNoACK()
{
        SCL = 0;
        _nop_();
        SDA = 1;
        _nop_();
        SCL = 1;
        _nop_();
        SCL = 0;
}

/*---------------------------------------------------------------------------*/
void Start(void)                /*START 启动I2C 总线子程序发送I2C 起始条件*/
{
        SDA = 1;                                 /* 发送起始条件的数据信号*/
        _nop_();
        SCL = 1;                                 /*发送起始条件的时钟信号*/
        _nop_();         /*起始条件建立时间大于4.7 s*/
        SDA = 0;                                 /*发送起始信号*/
        _nop_();         /*起始条件锁定时间大于4 s*/
        SCL = 0;                                 /*钳住I2C 总线准备发送或接收数据*/
}

/*-----------STOP 停止I2C 总线子程序发送I2C 总线停止条件-------------------*/
void Stop(void)
{
        SDA = 0;
        _nop_();
        SCL = 1;
        _nop_();
        SDA = 1;
        _nop_();
}


Tags:C51   Keil   I2C    
  • 关于本站 - 联系我们 - 网站地图 - 网站留言 - 返回顶部