📄 cdma800.c.bak
字号:
** 引用函数:
** 创 建 人: 陈璐 创建时间:2006/01/11
*********************************************************/
uchar Set_Basic_Parameter()
{
auto union buf_union comm;
uint i;
uchar length;
uchar para_len;//参数值长度
uchar buf;
uchar *P = 0;
length = receive_cnt-10;//命令体长度
P = receive_buf+7;
erro = 0;
while(length)
{
comm.buf2[0] = *P++;
comm.buf2[1] = *P++;
para_len=*P++;//参数值长度
length = length - 3 ;
switch(comm.buf1)
{
case 0xf000: //模块ID号
if(receive_buf[5]==0x60)//设置命令
{
for(i=0;i<para_len;i++)
{
buf=*P++;
wrom(mod_idadd+i,buf);
}
}
else
{
for(i=0;i<para_len;i++)
{
*P++=rrom(mod_idadd+i);
}
}
length=length-para_len;
break;
case 0xf001: //模块类型
if(receive_buf[5]==0x60)//设置命令
{
for(i=0;i<para_len;i++)
{
buf=*P++;
wrom(mod_typeadd+i,buf);
}
}
else
{
for(i=0;i<para_len;i++)
{
*P++=rrom(mod_typeadd+i);
}
}
length=length-para_len;
break;
case 0xf002: //模块地址
if(receive_buf[5]==0x60)//设置命令
{
Prmter1.ADDR=*P++ ;
wrom(mod_add_add,Prmter1.ADDR);
}
else
{
*P++=Prmter1.ADDR;
}
length--;
break;
case 0xf003: //协议版本
*P++=PROTL;
length--;
break;
// case 0xf004: //模块参数个数
// *P++=MOD_Num;
// length--;
// break;
case 0xf005: //温补参数个数
*P++=tn;
length--;
break;
// case 0xf006: //频响补偿参数个数
// *P++=pn;
// length--;
// break;
case 0xf007: //增益标称值补偿参数个数
*P++=zyn;
length--;
break;
case 0xf008: //增益刻度
*P++=bcnumb;
length--;
break;
case 0xf017: //程序ID号
for(i=0;i<para_len;i++)
{
*P++=PRO_ID[i];
}
length=length-para_len;
break;
case 0xf018: //程序版本号
*P++=0x01;
*P++=0x00;
length=length-2;
break;
case 0xf019: //生产序列号
if(receive_buf[5]==0x60)//设置命令
{
for(i=0;i<para_len;i++)
{
buf=*P++;
wrom(product_add+i,buf);
}
}
else
{
for(i=0;i<para_len;i++)
{
*P++=rrom(product_add+i);
}
}
length=length-para_len;
break;
default: receive_buf[8] = *--P;
receive_buf[7] = *--P;
if(receive_buf[5]==0x60)//设置命令
{
erro = erro | 0x02;
}
else
{
erro = erro | 0x01;
}
length = 0;
break;//特殊处理
}
}
if(erro & 0x02)
{
length = 2;//设置参数失败
}
else if(erro & 0x01)
{
length = 2;//查询参数失败
}
else
{
length =receive_cnt-10;
}
return length;
}
/**********************************************************
** 功能说明: 参数地址查询函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 参数个数
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/01/11
*********************************************************/
uchar Query_Address()
{
uchar i,buf;
uchar length;
buf = receive_buf[7];
receive_buf[7]=3;//总包数
receive_buf[8]=buf;//包序号数
switch(buf)
{
case 1: for(i=0; i<68; i++)
{
receive_buf[i+9]= Para_Num_Conf[i];
length = 70;
}
break;
case 2: for(i=0; i<68; i++)
{
receive_buf[i+9]= Para_Num_Conf[i+68];
}
length = 70;
break;
case 3: for(i=0; i<Para_Num - 136; i++)
{
receive_buf[i+9]= Para_Num_Conf[i+136];
}
length = Para_Num - 134;
break;
default: length = 1;//查询参数失败
break;
}
return length;
}
/**********************************************************
** 功能说明: 参数设置/查询函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 参数个数
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/01/11
*********************************************************/
uchar Set_Parameter()
{
auto union buf_union comm;
auto union buf_union Pbuf;
uchar length;
uchar para_len;//参数值长度
uchar buf;
//uchar buf1,buf2;
uchar *P = 0;
length = receive_cnt-10;//命令体长度
P = receive_buf+7;
erro = 0;
while(length)
{
comm.buf2[0] = *P++;
comm.buf2[1] = *P++;
para_len=*P++;//参数值长度
length = length - 3 ;
switch(comm.buf1)
{
case poffset1:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.POFFSET1=*P++ ;
wrom(poff1add,Prmter1.POFFSET1);
}
else
{
*P++ = Prmter1.POFFSET1;
}
length--;
break;
case poffset2:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.POFFSET2=*P++ ;
wrom(poff2add,Prmter1.POFFSET2);
}
else
{
*P++ = Prmter1.POFFSET2;
}
length--;
break;
case poffset3:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.POFFSET3=*P++ ;
wrom(poff3add,Prmter1.POFFSET3);
}
else
{
*P++ = Prmter1.TEMP;
}
length--;
break;
case att:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.ATT = *P++;
wrom(attadd,Prmter1.ATT);
init_att(1 ,1,Prmter1.ATT);
}
else
{
*P++ = Prmter1.ATT;
}
length--;
break;
case vgs1:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.VGS1_L = *P++;
Prmter1.VGS1_H = *P++;
wrom(vgs1add,Prmter1.VGS1_L);
wrom(vgs1add+1,Prmter1.VGS1_H);
if(Prmter1.BUTTON1==1)//开栅压1
{
init_vgsandpcu(2 ,2,Prmter1.VGS1_H,Prmter1.VGS1_L);
}
}
else
{
*P++ = Prmter1.VGS1_L;
*P++ = Prmter1.VGS1_H;
}
length=length-2;
break;
case vgs2:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.VGS2_L = *P++;
Prmter1.VGS2_H = *P++;
wrom(vgs2add,Prmter1.VGS2_L);
wrom(vgs2add+1,Prmter1.VGS2_H);
if(Prmter1.BUTTON1==1)//开栅压2
{
init_vgsandpcu(1 ,3,Prmter1.VGS2_H,Prmter1.VGS2_L);
}
}
else
{
*P++ = Prmter1.VGS2_L;
*P++ = Prmter1.VGS2_H;
}
length=length-2;
break;
case vgs3:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.VGS3_L = *P++;
Prmter1.VGS3_H = *P++;
wrom(vgs3add,Prmter1.VGS3_L);
wrom(vgs3add+1,Prmter1.VGS3_H);
if(Prmter1.BUTTON1==1)//开栅压3
{
init_vgsandpcu(0 ,4,Prmter1.VGS3_H,Prmter1.VGS3_L);
}
}
else
{
*P++ = Prmter1.VGS3_L;
*P++ = Prmter1.VGS3_H;
}
length=length-2;
break;
case pc:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.PC = *P++;
wrom(pcadd,Prmter1.PC);
buf=Prmter1.PC+Prmter1.POFFSET3;
Pbuf.buf1=10*buf+192;
Prmter1.PCU_H=Pbuf.buf2[1];
Prmter1.PCU_L=Pbuf.buf2[0];
wrom(pcuadd,Prmter1.PCU_L);
wrom(pcuadd+1,Prmter1.PCU_H);
init_vgsandpcu(3 ,5,Prmter1.PCU_H,Prmter1.PCU_L);//功放输出功率
}
else
{
*P++ = Prmter1.PC;
}
length--;
break;
case pcu:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.PCU_L = *P++;
wrom(pcuadd,Prmter1.PCU_L);
Prmter1.PCU_H = *P++;
wrom(pcuadd+1,Prmter1.PCU_H);
init_vgsandpcu(3 ,5,Prmter1.PCU_H,Prmter1.PCU_L);//功放输出功率
Pbuf.buf2[0]=Prmter1.PCU_L;
Pbuf.buf2[1]=Prmter1.PCU_H;
Pbuf.buf1=Pbuf.buf1-192;
if(Pbuf.buf1>=0x8000)
{
Prmter1.PC=0x00;
}
else
{
Prmter1.PC=Pbuf.buf1/10;
Prmter1.PC=Prmter1.PC-Prmter1.POFFSET3;
}
wrom(pcadd,Prmter1.PC);
}
else
{
*P++ = Prmter1.PCU_L;
*P++ = Prmter1.PCU_H;
}
length=length-2;
break;
case button1:
if(receive_buf[5]==0xc1)//设置命令
{
Prmter1.BUTTON1 = *P++;
wrom(but1add,Prmter1.BUTTON1);
if(Prmter1.BUTTON1==0)//关栅压1
{
DAC(0x02,0,0);
DAC(0x01,0,0);
DAC(0x00,0,0);
}
else
{
init_vgsandpcu(2 ,2,Prmter1.VGS1_H,Prmter1.VGS1_L);
init_vgsandpcu(1 ,3,Prmter1.VGS2_H,Prmter1.VGS2_L);
init_vgsandpcu(0 ,4,Prmter1.VGS3_H,Prmter1.VGS3_L);
}
}
else
{
*P++ = Prmter1.BUTTON1;
}
length--;
break;
case temp: *P++ = Prmter1.TEMP;
length--;
break;
case tempu: *P++ = Prmter1.TEMPU_L;
length--;
*P++= 0;
length--;
break;
case pof: *P++= Prmter1.POF+Prmter1.POFFSET1;
length--;
break;
case pofu: *P++= Prmter1.POFU_L;
length--;
*P++= 0;
length--;
break;
case por: *P++ = Prmter1.POR+Prmter1.POFFSET2 ;
length--;
break;
case poru: *P++= Prmter1.PORU_L ;
length--;
*P++= 0 ;
length--;
break;
case V_28: *P++= Prmter1.V28_L;
length--;
*P++= Prmter1.V28_H;
length--;
break;
case V_28V: *P++= Prmter1.V28U_L;
length--;
*P++= 0;
length--;
break;
case ctr: *P++= Prmter1.CTR;
length--;
break;
case ctru: *P++= Prmter1.CTRU;
length--;
*P++= 0;
length--;
break;
case pa_flw: *P++ = Prmter1.F_PWR;
length--;
break;
case id1: *P++ = Prmter1.ID1;
length--;
*P++ = 0;
length--;
break;
case id1u: *P++ = Prmter1.ID1U_L;
length--;
*P++=0;
length--;
break;
case id2: *P++= Prmter1.ID2;
length--;
*P++ = 0;
length--;
break;
case id2u: *P++ = Prmter1.ID2U_L;
length--;
*P++ = 0;
length--;
break;
case id3: *P++ = Prmter1.ID3;
length--;
*P++ = 0;
length--;
break;
case id3u: *P++= Prmter1.ID3U_L;
length--;
*P++ = 0;
length--;
break;
case id1st: *P++ = Prmter1.ID1ST;
length--;
break;
default: receive_buf[8] = *--P;
receive_buf[7] = *--P;
if(receive_buf[5]==0xc1)//设置命令
{
erro = erro | 0x02;
}
else
{
erro = erro | 0x01;
}
length = 0;
break;//特殊处理
}
}
if(erro & 0x02)
{
length = 2;//设置参数失败
}
else if(erro & 0x01)
{
length = 2;//查询参数失败
}
else
{
length = receive_cnt-10;//命令体长度
}
return length;
}
/**********************************************************
** 功能说明: 发送参数函数
** 输入参数: 类型: uchar 应答标志位
类型: uchar 命令体的长度
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/01/11
*********************************************************/
void send_reply_flag(uchar reply_flag,uchar length)
{
auto uchar start,i;
//receive_buf[7] = length;
receive_buf[6] = reply_flag;
start = 1; //CRC校验
length = length + 6;
CheckCRC(receive_buf,length,start,pChecksum);
receive_buf[length + 1] = pChecksum[0];
receive_buf[length + 2] = pChecksum[1];
length = length + 3;//加上校验字节(2BYTE),再加一个字节,就为包的总长度-1
receive_buf[length] = 0x4e;//最后一个字节是包尾
portd_wbuf = portd_wbuf | 0x10; //485发送使能
PORTD = portd_wbuf;
TXEN = 1; //USART 使能
delay_unit(2000);
length = length + 1;
for(i = 0;i < length;i ++)
{
if((i==0)||(i==(length-1)))
{
TXREG = receive_buf[i];
}
else if(receive_buf[i]==0x5e)
{
TXREG = 0x5e;
receive_buf[i]=0x5d;
i--;
}
else if(receive_buf[i]==0x4e)
{
TXREG = 0x5e;
receive_buf[i]=0x4d;
i--;
}
else
{
TXREG = receive_buf[i];
}
while(TRMT == 0)
{
;
}
}
delay_unit(1000);
TXEN = 0;
portd_wbuf = portd_wbuf & 0xef;
PORTD = portd_wbuf;
headend_flag=0x00;
return;
}
/**********************************************************
** 功能说明: CRC校验函数
** 输入参数: 类型: uchar* 须校验的数组
类型: uchar 命令体的长度
类型: uchar 开始位置
类型: uchar* 校验配置表
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 李承胜 创建时间:不详
*********************************************************/
void CheckCRC(uchar *pData, uchar length,uchar start, uchar *pChecksum)
{
auto uchar i = 0;
auto uint checksum = 0;
for(i = 0;i < length;i ++)
{
checksum = ( checksum << 8) ^ CRCTable[( checksum >> 8 ) ^ pData[i + start]];
}
pChecksum[0] = checksum % 256;
pChecksum[1] = checksum / 256;
return;
}
/**********************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -