📄 c8051f340.c
字号:
/*****************************************************************************/
//----------------------------------------------------------------------------
/////////////////////////// BEGAIN ////////////////////////////////////
//----------------------------------------------------------------------------
#include <c8051F340.h>
#include <INTRINS.H>
#include <STDIO.H>
//#define ResetWdg() PCA0CPH4 += 0xFF//向PCA0CPH4写入任意值将复位看门狗
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define byte unsigned char
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
sbit SDA=P0^0;
sbit SCL=P0^1;
sbit TTQH6_RST0=P0^6;
sbit MCU_LED=P1^1;
//---------------------------------------------------------------------------
void Init_Device(void);
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
typedef struct
{
uint Parameter_ID; //
uint Min_Value; //允许的最小值
uint Max_Value; //允许的最大值
uint Init_Value; //出厂默认值,当读用户设置值错误时应用该值
signed char *s; //字符串指针
} TTQH6_PARAMETER;
//----------------------------------------------------------------------------
//包含结构体的数组,存储可更改参数【参数id,最小值,最大值,初始值,注释字符串】
//----------------------------------------------------------------------------
TTQH6_PARAMETER code CmdListReg[] =
{
{0x00,0x00,0xFF,0x10, "Chip ID &SW ID\n "}, //
{0x01,0x00,0xFF,0xD4, "General,D7-Xtal select1 : 16M 0 : 4M\n D2:0-GPO select 000 :0001 : 1 "}, //
{0x02,0x00,0xFF,0x00, "Global Power Management (Vaild at Time Slicing Mode)\n "}, //
{0x03,0x00,0xFF,0x80, "General Purpose\n "}, //
{0x04,0x00,0xFF,0x0D, "Band Assignment\n "}, //
{0x05,0x00,0xFF,0x7F, "Local Power Management I\n "}, //
{0x06,0x00,0xFF,0x00, "Local Power Management II\n "}, //
{0x07,0x00,0xFF,0x00, "Local Power Management III\n "}, //
{0x08,0x00,0xFF,0x02, "Signal Chain Configure I\n "}, //
{0x09,0x00,0xFF,0x4E, "Signal Chain Configure II\n "}, //
{0x0A,0x00,0xFF,0x59, "Signal Chain Configure III\n "}, //
{0x0B,0x00,0xFF,0x8D, "Signal Chain Configure IV\n "}, //
// {0x0C,0x00,0xFF,? "Signal Chain Configure V\n "}, //
// {0x0D,0x00,0xFF, ? ""}, //
// {0x0E,0x00,0xFF, ? ""}, //
{0x0F,0x00,0xFF,0x01, "PLL Frequency I\n "}, //
{0x10,0x00,0xFF,0x17, "PLL Frequency II\n "}, //
{0x11,0x00,0xFF,0x04, "PLL Frequency III\n "}, //
{0x12,0x00,0xFF,0x40, "PLL Frequency IV\n "}, //
{0x13,0x00,0xFF,0x48, "PLL Frequency V\n "}, //
{0x14,0x00,0xFF,0x00, "PLL Frequency VI\n "}, //
{0x15,0x00,0xFF,0x2A, "PLL Frequency VII\n "}, //
{0x16,0x00,0xFF,0xA0, "PLL Test\n "}, //
{0x17,0x00,0xFF,0x39, "PLL & SAR Configuration II\n "}, //
{0x18,0x00,0xFF,0x1F, "PLL Configuration III\n Atune code-00000000: min gain ;11111111: max gain\n "}, //
};
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
void Delay(unsigned int x)
{
uint i, j;
for (i=0; i<x; i++)
{
for (j=0; j<0xff; j++)
{;}
}
}
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
void I2C_Delay(void)
{
uchar i;
for (i=0; i<10; i++)
{;}
}
//---------------------------------------------------------------------------
/*
**start
** ________
**SCL \______
** ____
**SDA \__________
**
*/
void I2C_Start(void)
{
SCL = 0;
I2C_Delay();
I2C_Delay();
SDA = 1;
I2C_Delay();
SCL = 1;
I2C_Delay();
SDA = 0;
I2C_Delay();
SCL = 0;
}
//----------------------------------------------------------------------------
/*
**stop
** _______
**SCL ____/ -------
** ____
**SDA _______/ ----
**
*/
void I2C_Stop(void)
{
SCL = 0;
I2C_Delay();
SDA = 0;
I2C_Delay();
SCL = 1;
I2C_Delay();
while(SCL != 1) SCL = 1;
SDA = 1;
I2C_Delay();
}
//----------------------------------------------------------------------------
void I2C_Write_Byte(uchar dat)
{
uchar i;
for (i=0; i<8; i++)
{
SDA = (bit)(dat & 0x80);
I2C_Delay();
SCL = 1;
dat <<= 1;
I2C_Delay();
SCL = 0;
}
SDA = 1;
I2C_Delay();
}
//----------------------------------------------------------------------------
uchar I2C_Read_Ack(void)
{
SCL = 1;
do
{
SDA = 1;
}while (SDA != 0);
SCL = 0;
return(0);
}
//----------------------------------------------------------------------------
uchar I2C_Read_Byte(void)
{
uchar i, dat;
SDA = 1;
SCL = 1;
while(SCL != 1)
{
SCL = 1;
}
for (i=0; i<8; i++)
{
SCL = 1;
I2C_Delay();
dat <<= 1;
dat |= (char)SDA;
SCL = 0;
}
SDA = 1;
I2C_Delay();
SCL = 1;
I2C_Delay();
SCL = 0;
return(dat);
}
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
uchar Read_TTQH6(uchar register_address)
{
uchar dat;
//I2C_Stop(); //jm delete
I2C_Start();
I2C_Write_Byte(0xC4); // 器件写地址
I2C_Read_Ack();
I2C_Write_Byte(register_address); // 寄存器地址
I2C_Read_Ack();
I2C_Stop();
I2C_Start();
I2C_Write_Byte(0xC5); //器件读地址
I2C_Read_Ack();
dat = I2C_Read_Byte();
//I2C_Write_Ack(); //数据已从TTQH6中读出不用再理会回传应答
I2C_Stop();
return(dat);
}
//----------------------------------------------------------------------------
void Write_TTQH6(uchar register_address,uchar value)
{
I2C_Stop();
I2C_Start();
I2C_Write_Byte(0xC4); // 器件写地址
I2C_Read_Ack();
I2C_Write_Byte(register_address); // 寄存器地址
I2C_Read_Ack();
I2C_Write_Byte(value); // 写数据
I2C_Stop();
}
//----------------------------------------------------------------------------
void Init_TTQH6(void) //初始化器件TTQH6
{
TTQH6_RST0 = 0;
Delay(1);
TTQH6_RST0 = 1;
Delay(20);
}
//----------------------------------------------------------------------------
byte Receive_RX0(void) //串口接收数据
{
byte RX_data;
while(RI0==0);
RI0=0;
RX_data=SBUF0;
return (RX_data);
}
//----------------------------------------------------------------------------
/*void Tranfer_TX0(byte TX_data) //串口发送数据
{
while(TI0==0);
TI0=0;
SBUF0=TX_data;
}
} */
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
uchar ASC_0(uchar x)
{
return(x == '0' ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_0to9(uchar x)
{
return(((x < '0') || ('9' < x)) ? 0 : 1);
}
//----------------------------------------------------------------------------
uchar ASC_a_to_f(uchar x)
{
return(((x < 'a') || ('f' < x)) ? 0 : 1);
}
//----------------------------------------------------------------------------
uchar ASC_AtoF(uchar x)
{
return(((x < 'A') || ('F' < x)) ? 0 : 1);
}
//----------------------------------------------------------------------------
uchar ASC_0to9_A_a_to_F_f(uchar x)
{
return((ASC_0to9(x) || ASC_a_to_f(x) || ASC_AtoF(x)) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar EqualSign(uchar x)
{
return(x == '=' ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar Semicolon(uchar x)
{
return(x == ';' ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_R_r(uchar x)
{
return(((x == 'R') || (x == 'r')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_L_l(uchar x)
{
return(((x == 'L') || (x == 'l')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_E_e(uchar x)
{
return(((x == 'E') || (x == 'e')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_H_h(uchar x)
{
return(((x == 'H') || (x == 'h')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_X_x(uchar x)
{
return(((x == 'X') || (x == 'x')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar Question_mark(uchar x)
{
return((x == '?') ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_P_p(uchar x)
{
return(((x == 'P') || (x == 'p')) ? 1 : 0);
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void main(void)
{
uchar i;
uchar new_value;
uchar temp_addr;
uchar temp;
byte r_data;
bit flag=0;
Init_Device();
Init_TTQH6();
TI0=1; // TI: set TI to send first char of UART !!!!!!!!!!!
printf("发送help,获得帮助\n");
while(1)
{
/* MCU_LED=1; //工作指示灯
Delay(100);
MCU_LED=0;
*/
//---------------------------------------------------------------------------
r_data=Receive_RX0();
if( ASC_H_h(r_data) ) //输入HELP,输出寄存器默认详单
{
r_data=Receive_RX0();
if(ASC_E_e(r_data))
{
if (ASC_L_l(r_data))
{
r_data=Receive_RX0();
if (ASC_P_p(r_data))
{
for (i=0; i<(sizeof(CmdListReg)/sizeof(TTQH6_PARAMETER)); i++)
{
printf("R%03X,初始值%03X\n", CmdListReg[i].Parameter_ID,CmdListReg[i].Init_Value);
printf(CmdListReg[i].s);
printf("\n");
printf("\n");
}
printf("\n");
printf("更改:R___=0x______; 注意命令串后以分号结束\n");
printf("读出:R___=? \n");
printf("发送help,获得帮助\n");
}
else flag=1;
}
else flag=1;
}
else flag=1;
}
//---------------------------------------------------------------------
else if (ASC_R_r(r_data))
{
temp_addr=Receive_RX0();
if (ASC_0to9_A_a_to_F_f(temp_addr))
{
if (EqualSign(Receive_RX0()))
{
temp=Receive_RX0();
if (Question_mark(temp)) //寄存器查询,输入R___=?输出寄存器的值
{
printf("R%03X=%05X\n", temp_addr, Read_TTQH6(temp_addr));//读寄存器
}
//-------------------------------------------
else if (ASC_0(temp)) //更改寄存器的值
{
if (ASC_X_x(Receive_RX0()))
{
new_value=Receive_RX0();
if (ASC_0to9_A_a_to_F_f(new_value))
{
if (Semicolon(Receive_RX0()))
{
Write_TTQH6(temp_addr,new_value);//写寄存器
printf("修改成功");
}
else flag=1;
}
else flag=1;
}
else flag=1;
}
else flag=1;
//------------------------------------------
}
else flag=1;
}
else flag=1;
}
//---------------------------------------------------------------------
else flag=1;
if (flag==1)
{
flag=0;
printf("输入格式错误,请重新输入,发送help,获得帮助\n");
}
}
//----------------------------------------------------------------------------
}
//----------------------------------------------------------------------------
///////////////////////////////// OVER ///////////////////////////////////////
//----------------------------------------------------------------------------
/*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -