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