- /*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_();
- }