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