⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm.c

📁 本公司的单相CPU卡表的源程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -