pathletboy 发表于 2014-4-22 11:36 
我帮你测试了,可以正常编译通过。
pathletboy:
因为不上传不了附件,只能将代码贴上。
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/****************************************************************
** 项目名: ATV 信号源
** 芯片型号: RT500 (RF modulators 芯片,厂商:Rafael Micro)
** 程序名: ATV_Source
** 作者: sunny.sun
** 日期: 2014-04-20
******************************************************************/
/*****************************************************************
** 库函数说明:
begin() //初始化Wire库,和设置I2C总线主从机
begin(address) //带地址参数就是从机,不带就是主机
requestFrom(address, count) //在启动I2C总线后,可以继续访问另一个地址,和访问次数
beginTransmission(address) //开始给从机发送地址
endTransmission() //结束本次I2C通讯,与上条函数成对使用
send() //发送数据
byte available() //用于判断数据是否有效,有效才开始接收
byte receive() //接收数据
onReceive(handler) //从机接收主机发来的数据,
onRequest(handler) //主机请求从机发送数据
***********************************************************************/
#include <Wire.h>
///////////////////////////// 宏定义 ////////////////////////////////////
#define RT500_CHIP_ID 0xCA
//#define RT500_DEVICE_ADDRESS RT500_CHIP_ID>>1;
//#define RT500_Xtal 16000
//#define RT500_Reg_Num 11
/*****************************************************
typedef enum _RT500
{
MinCurrent=70,
MaxCurrent=90,
MinVoltage=3150,
MaxVoltage=3320,
}RT500;
typedef enum _RT500_FREQ
{
FREQ_N10K=0,
FREQ_P10K=15,
FREQ_N40K=1,
FREQ_P40K=14,
FREQ_N60K=2,
FREQ_P60K=13,
FREQ_N90K=3,
FREQ_P90K=12,
FREQ_N110K=4,
FREQ_P110K=11,
FREQ_N140K=5,
FREQ_P140K=10,
FREQ_N160K= 6,
FREQ_P160K=9,
FREQ_MAX=7,
FREQ_MIN= 8,
}RT500_FREQ;
*/
/****************************************************************************
** 说明:
RT500_ErrCode” 定義 RT500 每一個函數設定狀態。如果回傳值為
RT_Fail 表示 RT500 設定有問題。該函數將會回傳 Fail 而且不會再繼續設定 RT500
******************************************************************************
typedef enum _RT500_Err_Type
{
RT_Success = 1,
RT_Fail = 0
}RT500_Err_Type;
/*********************************************************************************
typedef enum _RT500_LOCK
{
RT_Unlock=0,
RT_Lock=1,
}RT500_LOCK;
/***********************************************************************************
** 说明:
定義RT500所支持的模擬電視系統
************************************************************************************
typedef enum _RT500_Standard_Type
{
RT_Standard_M_N = 0,
RT_Standard_B_G_H,
RT_Standard_I,
RT_Standard_D_K,
RT_Standard_L,
RT_Standard_Max,
}RT500_Standard_Type;
/**************************************************************************************
** 说明:
RT500_Power_Type” 定義 RT500 的各種使用狀態開/關,如調變模式,環通路功能、待機功能。
- All_ON: Modulator On, Loop through On
- Mod_ON: Modulator On, Loop through Off
- LT_ON: Modulator Off, Loop through On
- Standby_ON: Modulator Off, Loop through off
****************************************************************************************
typedef enum _RT500_Power_Type
{
All_ON = 0,
Mod_ON,
LT_ON,
Standby_ON
}RT500_Power_Type;
/************************************************************************************************
** 说明:
提供 RT500 video輸入衰減設定資訊。請根據RT500的輸入電壓振幅來決定此設定。
如果輸入電壓振幅1.0Vpp, 選用Att_1; 如果輸入電壓振幅為2.0Vpp,選用Att_0_5,詳細原理可參考第十
章節。
************************************************************************************************
typedef enum _RT500_Video_Att
{
Att_1=0,
Att_0_75,
Att_0_63,
Att_0_5
}RT500_Video_Type;
/*************************************************************************************************
** 说明:
提供 RT500 audio 輸入衰減設定資訊。一般對80% FM 調變而言,1 kHz 聲音源,其
標準輸入振幅為1.0Vpp ~1.2Vpp。請根據聲音輸入振幅來決定此設定。詳細原理可參考第十章節的 ”Audio
Input Attenuator design
***************************************************************************************************
typedef enum _RT500_Sound_Att
{
Att_8k=0,
Att_7k,
Att_6k,
Att_5k,
Att_4k,
Att_3k,
Att_2k,
Att_1k
}RT500_Sound_Type;
/*************************************************************************************************
** 说明:
提供 RT500 RF 輸出大小設定
***************************************************************************************************
typedef enum _RT500_RF_Att
{
RFAtt_0=0, // 85.2 dBuv (highest)
RFAtt_1, // 83.2 dBuV
RFAtt_2, // 81.5 dBuV
RFAtt_3, // 78.6 dBuV
RFAtt_4, // 76.4 dBuV
RFAtt_5, // 73.3 dBuV
RFAtt_6, // 70.9 dBuV
RFAtt_7 // 67.7 dBuv (lowest)
}RT500_RF_ATT_Type;
/*************************************************************************************************
** 说明:
提供 RT500 RF 輸出大小設定是否要額外衰減。若設置為RFAtt_6DB,代表RF 輸出會再多衰減6dB。
**************************************************************************************************
typedef enum _RT500_RF_ATT_6DB
{
RFAtt_0DB=0,
RFAtt_6DB //attenuation extra 6dB
}RT500_RF_ATT_6DB_Type;
/*--------------------------------------------------*
// Data Type Redefine
//--------------------------------------------------
typedef unsigned char BYTE;
typedef unsigned char u8;
typedef char SBYTE;
typedef unsigned int WORD;
typedef int SWORD;
typedef unsigned long DWORD;
typedef long SDWORD;
typedef unsigned long UINT32;
/////////////////////////////////////////////////////////////////////////////////////////////////////
*
u8 RT500_Reg_Arry[RT500_Reg_Num] = {0x00, 0x88, 0x80, 0x04, 0x59, 0x4B, 0xE8, 0x70, 0x06, 0x2F, 0x08};
// 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E
u8 RT500_Reg_Cunt = 0;
/****************************** 初始化设置 **********************************************************/
void setup()
{
Wire.begin(); //初始化I2C
Serial.begin(9600); //初始化串口,波特率为9600
//Rtcc_Addr=RTCC_R>>1;
}
/******************************* 读数据函数 **********************************************************
boolean RT500_Read_Mode(void)
{
u8 temp0=0;
u8 temp1=0;
u8 temp2=0;
u8 temp3=0;
if(!I2C_Start())return FALSE;
I2C_SendByte(RT500_DEVICE_ADDRESS+1);
if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
temp0=I2C_ReceiveByte();
I2C_Ack();
temp1=I2C_ReceiveByte();
I2C_Ack();
temp2=I2C_ReceiveByte();
I2C_Ack();
temp3=I2C_ReceiveByte();
I2C_NoAck();
I2C_Stop();
if(temp0==0x69&&temp2==0xF0&&temp3==0xF0)
{
if((temp1&0x01)==0x01)
LockFlag1=RT_Lock;
else
LockFlag1=RT_Unlock;
return(LockFlag1);
}
else
{
LockFlag1=RT_Unlock;
return(LockFlag1);
}
}
/************************************* 电源模式设置 ***********************************************************
RT500_Err_Type RT500_Power_Mode(u8 powerModel)
{
RT500_Reg_Arry[9] &= 0xF8;
switch(powerModel)
{
case All_ON:
RT500_Reg_Arry[0] = 0x00;
RT500_Reg_Arry[1] = 0x88;
RT500_Reg_Arry[9] |= 0x07;
break;
case Mod_ON:
RT500_Reg_Arry[0] = 0x00;
RT500_Reg_Arry[1] = 0xA8;
RT500_Reg_Arry[9] |= 0x07;
break;
case LT_ON:
RT500_Reg_Arry[0] = 0xFE;
RT500_Reg_Arry[1] = 0x9B;
RT500_Reg_Arry[9] |= 0x06;
break;
case Standby_ON:
RT500_Reg_Arry[0] = 0xFF;
RT500_Reg_Arry[1] = 0xBF;
RT500_Reg_Arry[9] |= 0x06;
break;
default:
RT500_Reg_Arry[0] = 0x00;
RT500_Reg_Arry[1] = 0x88;
RT500_Reg_Arry[9] |= 0x07;
break;
}
WriteTunerRegister(0+4,RT500_Reg_Arry[0]);
WriteTunerRegister(1+4,RT500_Reg_Arry[1]);
WriteTunerRegister(9+4,RT500_Reg_Arry[9]);
return RT_Success;
}
/************************** 电视制式标准设置 *****************************************
RT500_Err_Type RT500_Standard_Mode(u8 StandardMode)
{
RT500_Reg_Arry[2] &= 0xF0;
RT500_Reg_Arry[3] &= 0x87;
switch(StandardMode)
{
case RT_Standard_M_N:
RT500_Reg_Arry[2] |= 0x08; //r6
RT500_Reg_Arry[3] |= 0x00; //r7
RT500_Reg_Arry[4] = 0xd9;//9;//0x59; //r8
break;
case RT_Standard_B_G_H:
RT500_Reg_Arry[2] |= 0x08;
RT500_Reg_Arry[3] |= 0x30;
RT500_Reg_Arry[4] = 0xA9;//9;//0x29;
break;
case RT_Standard_I:
RT500_Reg_Arry[2] |= 0x08;
RT500_Reg_Arry[3] |= 0x58;
RT500_Reg_Arry[4] =0x99;//9;//0x19;
break;
case RT_Standard_D_K:
RT500_Reg_Arry[2] |= 0x08;
RT500_Reg_Arry[3] |= 0x78;
RT500_Reg_Arry[4] = 0x89;//0x09;
break;
case RT_Standard_L:
RT500_Reg_Arry[2] |= 0x05;
RT500_Reg_Arry[3] |= 0x78;
RT500_Reg_Arry[4] = 0x88;//0x08; //update depend on datasheet v2.7
break;
default: //DK
RT500_Reg_Arry[2] |= 0x08;
RT500_Reg_Arry[3] |= 0x78;
RT500_Reg_Arry[4] = 0x81;//9;//0x09;
break;
}
WriteTunerRegister(2+4,RT500_Reg_Arry[2]);
WriteTunerRegister(3+4,RT500_Reg_Arry[3]);
WriteTunerRegister(4+4,RT500_Reg_Arry[4]);
return RT_Success;
}
/*************************** 视频输入衰减设置 *******************************************
RT500_Err_Type RT500_Video_Swing(u8 VideoSwing)
{
RT500_Reg_Arry[10] &= 0xFC;
switch(VideoSwing)
{
case Att_1:
RT500_Reg_Arry[10] |= 0x00;
break;
case Att_0_75:
RT500_Reg_Arry[10] |= 0x01;
break;
case Att_0_63:
RT500_Reg_Arry[10] |= 0x02;
break;
case Att_0_5:
RT500_Reg_Arry[10] |= 0x03;
break;
default:
RT500_Reg_Arry[10] |= 0x00;
break;
}
WriteTunerRegister(10+4,RT500_Reg_Arry[10]);
return RT_Success;
}
/******************* 音频输入设置 *******************************
RT500_Err_Type RT500_Audio_Swing(u8 AudioSwing)
{
RT500_Reg_Arry[3] &= 0xF8;
switch(AudioSwing)
{
case Att_8k:
RT500_Reg_Arry[3] |= 0x00;
break;
case Att_7k:
RT500_Reg_Arry[3] |= 0x01;
break;
case Att_6k:
RT500_Reg_Arry[3] |= 0x02;
break;
case Att_5k:
RT500_Reg_Arry[3] |= 0x03;
break;
case Att_4k:
RT500_Reg_Arry[3] |= 0x04;
break;
case Att_3k:
RT500_Reg_Arry[3] |= 0x05;
break;
case Att_2k:
RT500_Reg_Arry[3] |= 0x06;
break;
case Att_1k:
RT500_Reg_Arry[3] |= 0x07;
break;
default:
RT500_Reg_Arry[3] |= 0x04;
break;
}
WriteTunerRegister(3+4,RT500_Reg_Arry[3]);
return RT_Success;
}
/*************************** RF 输出Level 设置 ***************************************
RT500_Err_Type RT500_RF_ATT(u8 RFATT)
{
RT500_Reg_Arry[8] &= 0xF8;
//RT500_Reg_Arry[8] |= RT500_Set_Info.RT500_RF_Att_Mode;
switch(RFATT)
{
case RFAtt_0:
RT500_Reg_Arry[8] |= 0x00;
break;
case RFAtt_1:
RT500_Reg_Arry[8] |= 0x01;
break;
case RFAtt_2:
RT500_Reg_Arry[8] |= 0x02;
break;
case RFAtt_3:
RT500_Reg_Arry[8] |= 0x03;
break;
case RFAtt_4:
RT500_Reg_Arry[8] |= 0x04;
break;
case RFAtt_5:
RT500_Reg_Arry[8] |= 0x05;
break;
case RFAtt_6:
RT500_Reg_Arry[8] |= 0x06;
break;
case RFAtt_7:
RT500_Reg_Arry[8] |= 0x07;
break;
default:
RT500_Reg_Arry[8] |= 0x00;
break;
}
WriteTunerRegister(8+4,RT500_Reg_Arry[8]);
return RT_Success;
}
/***************************** RF 額外衰減6db 设置 ******************************
RT500_Err_Type RT500_ATT_6DB(u8 ATT6DB)
{
RT500_Reg_Arry[8] &= 0xF7;
switch(ATT6DB)
{
case RFAtt_0DB:
RT500_Reg_Arry[8] |= 0x00;
break;
case RFAtt_6DB:
RT500_Reg_Arry[8] |= 0x08;
break;
default:
RT500_Reg_Arry[8] |= 0x00;
break;
}
WriteTunerRegister(8+4,RT500_Reg_Arry[8]);
return RT_Success;
}
/**************************** 设置 RF 输出频率 *****************************************
RT500_Err_Type RT500_PLL(u32 PLL_Freq)
{
u8 Div_Rat = 2;
u8 Sel_Div = 0;
u8 Ni = 0;
u8 Si = 0;
u8 N1 = 0;
u8 N2 = 0;
u32 VCO_Min = 1800000;
u32 VCO_Freq = 0;
u8 SN,M;
while(Div_Rat < 64)
{
Div_Rat *= 2;
if((PLL_Freq * Div_Rat) >= VCO_Min)
{
RT500_Reg_Arry[7] &= 0xF8;
RT500_Reg_Arry[7] = Sel_Div | RT500_Reg_Arry[7]; // r11
VCO_Freq = PLL_Freq * Div_Rat;
break;
}
Sel_Div ++;
}
N1 = (u8)(((VCO_Freq / 1000) - 416) / 32);
Ni = (u8)(N1 / 4);
Si = (u8)(N1 - (Ni * 4));
//RT500_Reg_Arry[5] = Ni | (Si << 6); // r9
SN= Ni | (Si << 6); // r9
N2 = (u8)(((VCO_Freq / 1000) - 416) - (N1 * 32));
//if(N2==0)
// RT500_Reg_Arry[7] |= 0x08;
//else
// RT500_Reg_Arry[7] &= 0xF7;
//RT500_Reg_Arry[6] = (N2 << 3); // r10
if(PLL_Freq<56250)
RT500_Reg_Arry[7] = 0x74;
else if(PLL_Freq<112500)
RT500_Reg_Arry[7] = 0x73;
else if(PLL_Freq<225000)
RT500_Reg_Arry[7] = 0x72;
else if(PLL_Freq<450000)
RT500_Reg_Arry[7] = 0x71;
else
RT500_Reg_Arry[7] = 0x70;
// RT500_Reg_Arry[7] &= 0xF7;
// RT500_Reg_Arry[6] = (N2 << 3); // r10
M=(N2 << 3); // r10
WriteTunerRegister(5+4,SN);//RT500_Reg_Arry[5]);
WriteTunerRegister(6+4,M);//RT500_Reg_Arry[6]);
WriteTunerRegister(7+4,RT500_Reg_Arry[7]);
//set modulation depth ~80% //update depend on datasheet v2.7
RT500_Reg_Arry[2] &= 0x0F;
if((PLL_Freq>0) && (PLL_Freq<225000))
RT500_Reg_Arry[2] |= 0xA0;
else if((PLL_Freq>=225000) && (PLL_Freq<450000))
RT500_Reg_Arry[2] |= 0x90;
else if((PLL_Freq>=450000) && (PLL_Freq<650000))
RT500_Reg_Arry[2] |= 0x80;
else if((PLL_Freq>=650000) && (PLL_Freq<750000))
RT500_Reg_Arry[2] |= 0x70;
else
RT500_Reg_Arry[2] |= 0x60;
WriteTunerRegister(2+4,RT500_Reg_Arry[2]);
//Set Frequency for RT500
//if(RT500_PLL(PLL_Freq) != RT_Success)
// return RT_Fail;
//RT500_Write_Len.RegAddr = 0x04;
//for(UINT8 RT500_Reg_Cunt = 0;RT500_Reg_Cunt < RT500_Reg_Num;RT500_Reg_Cunt ++)
//{
// RT500_Write_Len.Data[RT500_Reg_Cunt] = RT500_Reg_Arry[RT500_Reg_Cunt];
//}
//RT500_Write_Len.Len = RT500_Reg_Num;
//if(I2C_Write_Len(&RT500_Write_Len) != RT_Success)
// return RT_Fail;
//return RT_Success;
return RT_Success;
}
/***************************** I2C 写Tuner寄存器函数 ***********************************
void WriteTunerRegister(byte RegAddr,byte RegData)
{
Wire.beginTransmission(RT500_DEVICE_ADDRESS);
Wire.write(RegAddr); //address MSB
Wire.write(RegData); //写数据
Wire.endTransmission();
}
//////////////////////////////////////////////////////////////////////////////////////////////////
/****************** Main Loop 函数 **************************************/
void loop()
{
Serial.println(" Run test!");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
另外现在编译不了,我去掉一些注释就可以。不知什么原因!
|