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