fil1256mkii,i2c一体化高频控制程序
/***********************************************************************
;*
;* title: fil1256mkii,i2c一体化高频控制程序
;* version: 1.0
;* last updated: 2007-08-28
;* target: atmega8
;* file: main.c
;* author(s): bg7tbl
;* first data :2007-08-25
;*
;*
;* description
;* fil1256mkii,i2c一体化高频控制程序
/**************************************************************************
;fi1256mk2高频头资料:
; |------------------------------------------------------|
; ---| |
;| | |
; ---| |
; | |
; | fi1256mk2 |
; | |
; | |
; |------------------------------------------------------|
; | | | | | | | | | |
; 11 12 13 14 15 21 22 23 24 25
; vt | scl sdl as 空 6.5m av | af
; | |
; 调谐供电+5v 中频供电+5v
;vt:调谐电压输出
;scl:i2c时钟端
;sdl:i2c数据端
;as:地址选择,接不同电压,选择不同地址
;6.5m:6.5m中频输出
;av:视频输出
;af:音频输出
;
;频率范围:49.75---863.25(接收)
;采用芯片:混频:tda5736,频率合成:tsa5523,中放:tda9800
;带afc状态输出,
;输入采用三个场mos管调谐放大,一个ic负责本振和混频,频率切换由pll
;控制,pll步进:31.5k,50k,62.5k,内部含控制dc-dc信号输出,
;中频38.9m,图象34.47m,声音1 32.4m 声音2 32.16m
;采用高中频:低频段 49.75---170.00m
; 中频段 170.00---450.00m
; 高频段 450.00---863.25m
;adc字节读出状态(afc输出的频率偏差)
; 输入电压范围 偏差 读出数字
; 0.0--0.15v -125k 00
; 0.15--0.3v -62.5k 01
; 0.3--0.45v 0 02
; 0.45--0.6v +62.5k 03
; 0.6--1.0v +125k 04
;
;写模式
; msb lsb
; 7 6 5 4 3 2 1 0 ack
;地址 1 1 0 0 0 ma1 ma0 0 ack
;分频器1 0 n14 n13 n12 n11 n10 n9 n8 ack
;分频器2 n7 n6 n5 n4 n3 n2 n1 n0 ack
;控制1 1 cp t2 t1 t0 rsa rsb os ack
;控制2 p7 p6 p5 p4 p3 p2 p1 p0 ack
;ma0,ma1地址选择,pll供电电压vs=+5v
; ma1 ma2 地址 pin15(as)电压
; 0 0 c0 0--0.1vs
; 0 1 c2 0.2--0.3vs
; 1 0 c4 0.4--0.6vs
; 1 1 c6 0.9--1vs
;如果as空,自动选择c2
;n14--n0:内部可编程分频器
;控制字节
;cp:泵电源选择 1 快速调谐(泵电流250ua) 0 慢速调谐(泵电流50ua)
;t1=t2=0,t0=1:正常模式
;os泵电源输出控制 0 正常模式 1 输出为高阻,同时升压停止,无调谐电压,可外部调节
;rsa,rsb步进频率选择
; rsa rsb 步进
; x 0 50k
; 0 1 31.25k(慢速扫描)
; 1 1 62.5k(正常扫描)
;波段切换
; p7 p6 p5 p4 p3 p2 p1 p0
;低频段 1 0 1 0 x 0 0 0 0xa0
;中频段 1 0 0 1 x 0 0 0 0x90
;高频段 0 0 1 1 x 0 0 0 0x30
;写入的次序(写模式):
;1,开始--地址--ack--分频器1--ack--分频器2--ack--控制1--ack--控制2--ack--停止
;2,开始--地址--ack--控制1--ack--控制2--ack--分频器1--ack--分频器2--ack--停止
;3,开始--地址--ack--分频器1--ack--分频器2--ack--控制1--ack--停止
;4,开始--地址--ack--分频器1--ack--分频器2--ack--停止
;建议写入次序:
;输入频率高与当前频率:采用1
;输入频率低于当前频率:采用2
;读模式
; 7(msb) 6 5 4 3 2 1 0 ack
;地址 1 1 0 0 0 ma1 ma0 1 ack 如果as悬空,地址=0xc3
;状态 por fl i2 i1 i0 a2 a1 a0 ack
;por=power on reset 当供电电压低于3v时=1;最后一个数据输入pll后为0
;fl =1 锁定,至少需要8个监相周期才能锁定 =0 失锁
;i2--i0 对应于p2--p0口的状态
;a2--a0 afc状态
;建议读模式:
;1,开始--地址--ack--状态--ack--状态-- --
*********************************************************************************/
/*i/o口模拟i2c*/
#define sda 4
#define scl 5
#define i2c_ddr ddrc
#define i2c_pin pinc
#define i2c_port portc
#define sda_input i2c_ddr &= ~(1<<sda)
#define sda_output i2c_ddr |= (1<<sda)
#define scl_input i2c_ddr &= ~(1<<scl)
#define scl_output i2c_ddr |= (1<<scl)
#define sda_port_clr i2c_port &= ~(1<<sda)
#define sda_port_set i2c_port |= (1<<sda)
#define scl_port_clr i2c_port &= ~(1<<scl)
#define scl_port_set i2c_port |= (1<<scl)
#define sda_free sda_input
#define scl_free scl_input
#define sda_clr sda_output
#define scl_clr scl_output
#define sda_status i2c_pin &= (1<<sda)
void delay_long(unsigned long aa)
{
while(aa--);
}
//*****************************************************
//delay 100us
//*****************************************************
void i2c_delay(void)
{
delay_long(10);
}
//*****************************************************
//i2c init
//*****************************************************
void i2c_init(void)
{
sda_input;
scl_input;
sda_port_clr;
scl_port_clr;
}
//*****************************************************
//i2c start
//*****************************************************
void i2c_start(void)
{
sda_free;
i2c_delay();
sda_clr;
i2c_delay();
scl_clr;
i2c_delay();
}
//*****************************************************
//i2c stop
//*****************************************************
void i2c_stop(void)
{
sda_clr;
i2c_delay();
scl_free;
i2c_delay();
sda_free;
i2c_delay();
}
//*****************************************************
//i2c_write
//*****************************************************
unsigned char i2c_write(unsigned char wb)
{
unsigned char i,ack=0;
for(i=0;i<8;i++)
{
if( wb&0x80 )
sda_free;
else
sda_clr;
wb=wb<<1;
i2c_delay();
scl_free;
i2c_delay();
scl_clr;
if(i!=7)
i2c_delay();
}
sda_free; //release sda line
i2c_delay();
scl_free;
i2c_delay();
if( sda_status )
ack=1; //ack error
scl_clr;
i2c_delay();
return ack;
}
//*****************************************************
//i2c_read
//原型:unsigned char i2c_read(unsigned char bend)
//输入:unsigned char ben=1,最后字节,=0,后面还有数据
//*****************************************************
unsigned char i2c_read(unsigned char bend)
{
unsigned char i,mb;
sda_free; //release sda line
mb=0;
for(i=0;i<8;i++)
{
mb=mb<<1;
i2c_delay();
scl_free;
i2c_delay();
if(sda_status)
mb++;
i2c_delay();
scl_clr;
if(i!=7)
i2c_delay();
}
//sda_free;
if( bend )
sda_free; //end read noack
else
sda_clr; //ack
i2c_delay();
scl_free;
i2c_delay();
scl_clr;
i2c_delay();
sda_free;
return mb;
}
/***************************************************************************
;*
;* function
;* 将数据发送到fil1256
;*
;* description
;* 输入频率单位为1hz
;* 通过i2c输出到fil1256
;***************************************************************************/
/*
;写入的次序(写模式):
;1,开始--地址--ack--分频器1--ack--分频器2--ack--控制1--ack--控制2--ack--停止
;2,开始--地址--ack--控制1--ack--控制2--ack--分频器1--ack--分频器2--ack--停止
;3,开始--地址--ack--分频器1--ack--分频器2--ack--控制1--ack--停止
;4,开始--地址--ack--分频器1--ack--分频器2--ack--停止
*/
void send_1256(unsigned long dat_fre1) //send data to 1256
{
unsigned long dat_1256=0;
unsigned char send_c1=0,send_c2=0;
unsigned char send_n_h=0,send_n_l=0;
unsigned char tmp=0;
//发送数据到fil1256 i2c总线
send_c2=0x30; //高频段
if(dat_fre1<49000000)
{
send_c2=0x90; //选择中频率段
}
if(dat_fre1<20000000)
{
send_c2=0xa0; //低频段
}
dat_1256=dat_fre1; //将频率转换为hz
dat_1256=dat_1256/6250; //除以步进
dat_1256=dat_1256/8; //除以前置分频器
send_n_l=dat_1256&0xff;
send_n_h=(dat_1256>>8)&0xff;
send_c1=0x88;
//send_c1=0x89; //禁止内部pll工作,
i2c_start();
i2c_write(0xc2);
i2c_write(send_c1);
i2c_write(send_c2);
i2c_write(send_n_h);
i2c_write(send_n_l);
i2c_stop();
}
/**************************************/