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



/*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读地址*/
sbitSDA = P0 ^ 4; /*串行数据-----------P0.4*/
sbitSCL = 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 & amp; 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;    /*检测256次还未收到应答,返回1*/
            return (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_();
}



可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号