📄 comm.c
字号:
if(Rs_Len != 8) return(RS_State_NOres); //error length, no responsion
if(SecurityCK(0x20)==mmok)
{
Copy_Str_BNK0(&Rs_IDL, &Rs_Data3, 4);
MEM_Write( E2P_MM0, &Rs_IDL, 4);
Rs_Len = 1;
Rs_IDL = 0;
return(RS_State_OK);
}
return(RS_State_NOres); //error, no responsion
}
/*****************************************************************
name: char Com_BordWrMerID(void)
function: broad ID commond of change meter ID
call: SecurityCK()
MEM_Write()
by call: RsCommSub(void)
input: no
return: Com_BordWrMerID()
=0 succeed change meter id
=RS_State_NOres no responsion
*****************************************************************/
uchar Com_BordWrMerID(void)
{
if( SecurityCK(W_HKEY>>8) == mmok)
{
MEM_Write(E2P_ID, &Rs_IDL, 6);
Rs_Len = 1;
Rs_IDL = 0;
return(RS_State_OK);
}
return(RS_State_NOres); // when error happen, no responsion
}
/*******************************************************************
* uchar Comm645_Ctrl():
********************************************************************/
uchar Comm645_Ctrl(void)
{
uchar flg_RES=0;
uchar Tmp;
if( ~Rs_Ctl & 0x80 )
{
switch (Rs_Ctl & 0x1F)
{
case RS_CTL_Read:
Tmp = Com_Read();
break;
case RS_CTL_Write:
Tmp = Com_Write();
break;
case RS_CTL_ChgPswd:
Tmp = Com_changeMM();
break;
case RS_CTL_WrMetID:
Tmp = Com_BordWrMerID();
break;
default:
return (0xff);
}
if( Tmp == RS_State_OK )
{
Rs_Ctl += 0x80;
//Flag.run |= bitURLED; //
//gURLEDsec = DF_URLEDSEC;
}
else if(Tmp == RS_State_NOres)
{
flg_RES=0xff;
}
else
{
Rs_Ctl += 0xC0;
Rs_Len = 1;
Rs_IDL = Tmp;
}
}
else
{
flg_RES=0xff;
}
return (flg_RES);
}
/*******************************************************************
* RsCommSub(void):
********************************************************************/
void RsCommSub(void)
{
char tmp_data0;
//RXE6 = 0;
if((Rs_Head != 0x68) || (Rs_Head0 != 0x68))
{
Comm.status = COMM_STATUS_INIT; // UART6 reset
return;
}
//data cs check
if( Rs_CRC !=(uchar)( Get_csckNum( &(Comm.commBuff[0]), (uchar)(RS_Cmd+Rs_Len) )- CHECKWORD) )
{
Comm.status = COMM_STATUS_INIT; // UART6 reset
return;
}
// end flag data check
if(Rs_End !=0x16)
{
Comm.status = COMM_STATUS_INIT; // UART6 reset
return;
}
// meter ID judge
if( MeteIDCheck()==0)
{
Comm.status = COMM_STATUS_INIT; // UART6 reset
return;
}
// data subtract 0x33 process
for(tmp_data0=0; tmp_data0<Rs_Len; tmp_data0++ )
{
Comm.commBuff[10+tmp_data0] -= 0x33;
}
// DL645 command process
if (Comm645_Ctrl() != 0)
{
Comm.status = COMM_STATUS_INIT; // UART6 reset
}
else
{
Rs_Head = 0X68;
MEM_Read(E2P_ID, &Rs_Addr, 6); //get meter reality ID
//data adding 0x33 process
for(tmp_data0=0; tmp_data0<Rs_Len; tmp_data0++ )
{
Comm.commBuff[10+tmp_data0] += 0x33;
}
// get data CS check data
Rs_CRC = ( Get_csckNum( &(Comm.commBuff[0]),(char)(RS_Cmd+Rs_Len)) - CHECKWORD);
// end flag data
Rs_End = 0x16;
}
return;
}
/*******************************************************************
* Comm_Init(void):
********************************************************************/
void Comm_Process(void)
{
switch(Comm.status&0x0f)
{
case COMM_STATUS_FREE:
break;
case COMM_STATUS_URRX:
if( (Comm.ptr > 10) && (Comm.ptr > Comm.commBuff[9]+11) ) Comm.status = (Comm.status&0xf0) +COMM_STATUS_URANAL;
break;
case COMM_STATUS_URANAL:
RsCommSub();
if(Comm.status==COMM_STATUS_INIT) break;
Comm.tmrMd = 6; //wait for 6*20mS = 120mS
Comm.status =(Comm.status&0xf0) + COMM_STATUS_URTXRDY;
break;
case COMM_STATUS_URTXRDY:
if(Comm.tmrMd ==0)
{
Comm.ptr = 0;
Comm.cntFE=3; //
Comm.status = (Comm.status&0xf0) +COMM_STATUS_URTX;
if(Comm.status & COMM_MODE_RS485)
{
Comm_RS485TXInit();
TXB6 =0xfe;
}
else
{
Comm_HWTXInit();
TXS0 =0xfe;
}
}
break;
case COMM_STATUS_URTX:
if((Comm.ptr >= RTx_MaxSize) || (Comm.ptr >=(char)(RS_MinSize+Rs_Len) )) Comm.status = COMM_STATUS_INIT;
break;
case COMM_STATUS_INIT:
default:
Comm.status = COMM_STATUS_FREE;
Comm_RXInit();
break;
}
}
/*******************************************************************
* Comm_HWTXInit(void)
********************************************************************/
void Comm_HWTXInit(void)
{
TMH0_Init(); //38K PWM initerlize
TM50_Init(); //uart0 time base initerlize
pin_IRTXD = 1;
PM1.0 = 0;
ASIM0 = 0;
ASIM0 = 0b00011101; // data length 8 bits
// stop length 1 bits
// even parity mode
BRGC0 = UART0_TM50_DIVISION_VALUE;
SRIF0 = 0;
STIF0 = 0;
SRMK0 = 0; //receive end interrupt enable
STMK0 = 0; //transfer end interrupt enable
POWER0 =1;
RXE0=0;
TXE0=1;
}
/*******************************************************************
* Comm_RS485TXInit(void)
********************************************************************/
void Comm_RS485TXInit(void)
{
ASIM6 = 0;
pin_485TXD = 1;
PM1.3 = 0;
CKSR6=0x04; // set f = fxp/32 (fxp = 8MHZ)
BRGC6=208; // set 1200 bps
ASICL6=0x2; //LSB frist
SRMK6 = 0; //receive end interrupt enable
STMK6 = 0; //transfer end interrupt enable
SRIF6 = 0;
STIF6=0;
POWER6 = 1; //enable internal clock operation
ASIM6 |= 0b01011101; //enable transmission
//disable reception
//even parity
//character lenght of data = 8-bits
//number of stop bits = 1
//“INTSR6” occurs in case of error (at this time, INTSRE6 does not occur).
}
/*******************************************************************
* void Comm_RXInit(void)
********************************************************************/
void Comm_RXInit(void)
{
uchar i;
for(i=0; i<=15; i++)
{
Comm.commBuff[i] = 0;
}
ASIM6 = 0;
pin_485TXD = 1;
PM1.3 = 0;
CKSR6=0x04; // set f = fxp/32 (fxp = 8MHZ)
BRGC6=208; // set 1200 bps
ASICL6=0x2; //LSB frist
SRMK6 = 0; //receive end interrupt enable
STMK6 = 0; //transfer end interrupt enable
SRIF6 = 0;
STIF6=0;
POWER6 = 1; //enable internal clock operation
ASIM6 |= 0b00111101; //enable reception
//disable transmission
//even parity
//character lenght of data = 8-bits
//number of stop bits = 1
//“INTSR6” occurs in case of error (at this time, INTSRE6 does not occur).
TM50_Init();
pin_IRTXD = 1;
PM1.0 = 0;
PM1.1 = 1;
ASIM0 = 0;
ASIM0 = 0b00011101; // data length 8 bits
// stop length 1 bits
// even parity mode
BRGC0 = UART0_TM50_DIVISION_VALUE;
SRIF0 = 0;
STIF0 = 0;
SRMK0 = 0; //receive end interrupt enable
STMK0 = 0; //transfer end interrupt enable
POWER0 =1;
RXE0=1;
TXE0=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -