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

📄 tangshants040611.c

📁 通过CAN总线,按内燃液传摆式动车组网络CAN总线通信协议与ECM通信 2. 通过RS485总线,按EKE机箱CPU的RS485协议议与EKE机箱CPU通信 3. 通过RS422总线,按ES
💻 C
📖 第 1 页 / 共 3 页
字号:
/*--------------------------------------------------------------------------
 *3U网卡插件V1.0版软件       2003-07-25 编制者:李均良  
 2003-09-04 通过ECM和ESW初步试验;
 2003-12-09 进行ESW调试,征对TSC连接(stop)和倾摆控制gstein定义修改程序;
 *C51 编程,在tasking c51 调试环境中调试,有较详细的注释。
 ----------------------------------------------------------------------------*/
/*
/****************************************************************************
   
                               功   能                              
    
     1. 通过CAN总线,按内燃液传摆式动车组网络CAN总线通信协议与ECM通信      
     2. 通过RS485总线,按EKE机箱CPU的RS485协议议与EKE机箱CPU通信
     3. 通过RS422总线,按ESW公司倾摆装置RS422协议与倾摆控制装置通信  
     4. 硬件预留与TAX2监测装置及与EKE机箱CPU通信接口(485-485)(软件尚未开发,不接倾摆装置)             
 
                            面板指示灯含义                           
   
     1. 插件上电后,指示灯1A,1B,2A全亮,0.5s后熄灭,0.5s后    
        又全亮,0.5s后1A,1B,2A熄灭,表示面板指示灯显示正常               
     2. 1s后,1A亮表示内部RAM自检正常,1B亮表示外部RAM自检正常1s后1A, 
        1B熄灭                                                      
     3. 再0.5s后,2A亮表示CANA初始化正常,0.5s后2A熄灭                                                      
     4. 自检完毕后,2A灯闪烁表示所有自检且CAN接收正常,1A灯闪烁RS485a表示发送正常, 
        1B灯闪烁表示RS422发送正常 , 
     5. 正常工作中 1A灯表示RS485工作状态,1B灯表示RS422状态;2A灯表示CAN状态                                           
*****************************************************************************/
#include <REG320.SFR>				// reg320.sfr
#include <CC51.H>
#include <stdlib.h>
#include <math.h>

#define uchar unsigned char
#define OK    0
#define ERR   1 

#define   	InRAMBegin   	0x20		//inner  RAM selftest start address
#define   	InRAMEnd   	0xa0		//inner  RAM selftest end   address
#define   	ExRAMBegin   	0x0000		//extern RAM selftest start address
#define   	ExRAMEnd   	0x7fff		//extern RAM selftest end   address
#define         OFF     0                                          // 灭
#define         ON      1                                          // 亮
#define         LED1A   P1_5                                       // 1A灯
#define         LED1B   P1_6                                       // 1B灯
#define         LED2A   P1_7                                       // 2A灯
#define         LEDON   { LED1A=ON; LED1B=ON; LED2A=ON; }      // 指示灯全亮
#define         LEDOFF  { LED1A=OFF; LED1B=OFF; LED2A=OFF; }    // 指示灯全灭


/**************************CAN DEFINES*****************************************/

 uchar xdat   CAN[40]       _at(0xff00); /*(!A15) is CAN_CS,when A15=1,cpu selects CAN*/

 #define MODE            0/*MODE REGISTER*/
 #define COMMAND         1/*COMMAND REGISTER*/
 #define STATUS          2/*STATUS  REGISTER*/
 #define INTERRUPT       3/*INTERRUPT REGISTER*/
 #define INTRTENBL       4/*INTERRUPT ENABLE REGISTER*/
 #define BUSTIME0        6/*BUS TIMING 0*/
 #define BUSTIME1        7/*BUS TIMING 1*/
 #define OUTCNTRL        8/*OUTPUT CONTROL REGISTER*/
 
 #define RXERR           14/* RX ERROR*/
 #define TXERR           15/*TX ERROR*/
 #define FRMINFRM        16/*frame information*/
 /*ID*/
 #define  ID28_21        17
 #define  ID20_13        18
 #define  ID12_5         19
 #define  ID4_0          20
  /*ACCEPTANCE CODE*/
 #define  ACCEPT0        16
 #define  ACCEPT1        17
 #define  ACCEPT2        18
 #define  ACCEPT3        19
 /*ACCEPTANCE MASK*/
 #define  ACCPTMST0      20
 #define  ACCPTMST1      21
 #define  ACCPTMST2      22
 #define  ACCPTMST3      23
 /*TX BUFFER*/
 #define  TXB1           21
 #define  TXB2           22
 #define  TXB3           23
 #define  TXB4           24
 #define  TXB5           25
 #define  TXB6           26
 #define  TXB7           27
 #define  TXB8           28
  /*RX BUFFER*/
 #define  RXB1           21
 #define  RXB2           22
 #define  RXB3           23
 #define  RXB4           24
 #define  RXB5           25
 #define  RXB6           26
 #define  RXB7           27
 #define  RXB8           28
/*CLOCK DIVIDER*/
 #define  CLKDIVID       31 
 
  /*RX buffer start address*/
 #define  RBSA           30
/*SJA1000 STATUS REGISTER*/
 #define  canBS            0x80/*bus status*/
 #define  canES            0x40/*error status*/
 #define  canTS            0x20/*transmit status*/
 #define  canRS            0x10/*receive status*/
 #define  canTCS           0x08/*transmission complete status*/
 #define  canTBS           0x04/*transmit buffer status*/
 #define  canDOS           0x02/*data overrun status*/
 #define  canRBS           0x01/*receive buffer status*/
 
 
 /* SJA1000 interrupt  register*/
 #define  canBEI            0x80
 #define  canALI            0x40
 #define  canEPI            0x20
 #define  canWUI            0x10
 #define  canDOI            0x08
 #define  canEI             0x04
 #define  canTI             0x02
 #define  canRI             0x01

/*SJA1000 INTERRUPT  ENABLE REGISTER*/
 #define  canBEIE           0x80
 #define  canALIE           0x40
 #define  canEPIE           0x20
 #define  canWUIE           0x10
 #define  canDOIE           0x08
 #define  canEIE            0x04
 #define  canTIE            0x02
 #define  canRIE            0x01
 
          
 
 
/***************************GLOBAL VARIABLE*****************************************/
 
#define Buf422LenMax      18
#define RXBUF485MAX       19
#define TXBUF485MAX       27
#define RXBUFCANMAX       13
#define TXBUFCANMAX       13	

 uchar data rxbuf485[RXBUF485MAX];/*serial0(rs485)receive it from cpu*/ 
 uchar xdat rxPrcs485[RXBUF485MAX];/*storing the rx,use for process rx data.When
                                           a whole frame is received completely,it get 
                                           datas from rxPrcs422*/
 uchar xdat txbuf485[TXBUF485MAX];/*serial0(rs485) send it to cpu*/
 uchar xdat txbuffer422[Buf422LenMax]={/*stores the data sending to TE*/ 
	                          02,/*STx;  start of text character,value=2*/
                                  02,/*LEN*/
                                  02,/*CTRLID*/
                                  02,02,02,02,02,02,02,02,02,02,02,02,02,02,/*data*/
                                  02/*CS*/
                               };


 
// uchar data rxPrcs422[Buf422LenMax];/*storing the rx whole frame when interrupt*/
 uchar xdat rxPrcs422[Buf422LenMax];/*storing the rx,use for process rx data.When
                                           a whole frame is received completely,it get 
                                           datas from rxPrcs422*/
 uchar data CanRxbuf[RXBUFCANMAX];
 uchar xdat CanRxprcs[RXBUFCANMAX];
 uchar xdat CanTxbuf[TXBUFCANMAX];



/*following variables needed when com 422*/
#define STX        0x02 /*0x40/*the start-of-text-character value,MSB first,
                        but 80c320 serial is LSB first,so 0x02 
                        received is 0x40*/ 

 
/* globe variables,using  in rx interrupt routine*/
 unsigned char data rxbufLen422;//=0xff;/*the number of rx byte,use in rx interrupt routine*/
 unsigned char data rxCount422;//=0;/*counter for rx */
 unsigned char data STxFlag422;/*STX flag*/
 
 unsigned char data  rx485count;
 unsigned char data  tx485count=0;/*used in TX Interrupt*/ 
 unsigned char data  seccount=0;
 unsigned char data  sumcount=0;
 unsigned char data  lifesign=0;
 unsigned char data  GSTEIN=0;
 unsigned char data  speedh=0;
 unsigned char data  speedl=0;
 

 uchar data TeLifeSignal;
 uchar data LastTeLifeSignal=0;

unsigned char idat  timerdedd     _at(0xa1);
unsigned char data RX422ER=0;
unsigned char data timeout=0;
unsigned char data timeout_2=0;
unsigned char data frameID;
unsigned char data fhchehao;

static unsigned char idat WarmData	_at(0xa2);	//used for differ from start and reset;
//定时常数说明
unsigned char data timer010ms=0;
unsigned char data timer0b15ms=0;
unsigned char data timer020ms=0;
unsigned char data timer050ms=0;
unsigned char data timer080ms=0;
unsigned char data timer0100ms=0;
unsigned char xdat timer0a150ms=0;	
	
unsigned char xdat timer0Wait100ms=0;	
unsigned char xdat timer0300ms=0;	
unsigned char xdat timer0500ms=0;
unsigned char xdat timer01s=0;
unsigned char xdat timer05s=0;
unsigned char xdat timer10s=0;
unsigned char xdat timer50s=0;
unsigned char xdat timer200s=0;
unsigned char xdat timer600s=0;
unsigned char xdat timer1200s=0;


 
//bit  variable daclare
//程序中用到的标志说明
_bitbyte framecmpl=0;

_bit bitFrmCmpl422    _atbit(framecmpl,0);
_bit bitFrmCmpl485    _atbit(framecmpl,1);
_bit bitFrmCmplCAN    _atbit(framecmpl,2);


_bit bit422ID2OK      _atbit(framecmpl,3);
_bit bitBAK           _atbit(framecmpl,4);

_bit bitTCSOK       _atbit(framecmpl,5);
_bit bitTEOK        _atbit(framecmpl,6);
_bit bitCANOK       _atbit(framecmpl,7);

_bitbyte timer0Const=0;
_bitbyte timer0Const1=0;
_bitbyte bitProgramState=0;
_bitbyte bit485comState=0;
_bitbyte bit485comState1=0;

_bit bitflagRamOK 	 _atbit(bitProgramState,0);
_bit bitflagb1  	 _atbit(bitProgramState,1);
_bit bitflagb2   	 _atbit(bitProgramState,2);
_bit bitflagb3  	 _atbit(bitProgramState,3);
_bit bitflagb4  	 _atbit(bitProgramState,4);
_bit bitflagb5  	 _atbit(bitProgramState,5);
_bit bitflagb6  	 _atbit(bitProgramState,6);
_bit bitflagb7  	 _atbit(bitProgramState,7);

_bit bitflagnb1 		_atbit(bit485comState1,0);
_bit bitflagnb4 		_atbit(bit485comState1,1);	
_bit bitflagCom1Error	_atbit(bit485comState1,5);	//485 com1 error
_bit bitflagCom1ing	_atbit(bit485comState1,6);	//is 485 com1_ing
_bit bitflagCom1AD	_atbit(bit485comState1,7);	//485 com1 ad_flag


_bit bitflaga 		_atbit(bit485comState,0);	
_bit bitflagCom0Error	_atbit(bit485comState,5);	//485 com0 error
_bit bitflagCom0ing	_atbit(bit485comState,6);	//is 485 com0_ing
_bit bitflagCom0AD	_atbit(bit485comState,7);	//485 com ad0_flag

_bit bitflag20ms	_atbit(timer0Const,0);
_bit bitflag50ms	_atbit(timer0Const,1);
_bit bitflag80ms	_atbit(timer0Const,2);
_bit bitflag100ms	_atbit(timer0Const,3);
_bit bitflag300ms	_atbit(timer0Const,4);
_bit bitflag500ms	_atbit(timer0Const,5);
_bit bitflag1s		_atbit(timer0Const,6);
_bit bitflag5s		_atbit(timer0Const,7);

_bit bitflag50s 	_atbit(timer0Const1,0);
_bit bitflag200s 	_atbit(timer0Const1,1);
_bit bitflag600s	_atbit(timer0Const1,2);


//以下为函数声明//function perhaps needed....
void Initialize(void);
_bit CheckInterRam(unsigned char,unsigned char);//check inner ram
_bit CheckExterRam(unsigned int ,unsigned int );//check exter ram
void InitializeTimer0(void);	//initialize T0 for timerconst 
void InitializeTimer2(void);	//initialize T2 timer for 485_com_buadrate generator.
void InitializeRXDTXDCom0(void);//set the ser_com0 as recieved state for _485_com

void Delay(unsigned int);	//delay 1 seconds
void Watchdog(void); 		//start watch_dog

  _interrupt (0) void  CanRxIntr(void);  //外部中断0,
  _interrupt (1) _using (1) void TimerZero(void);	  //定时器 0 中断,提供各种定时时间
//according the timerconst to get the data from I/O data port and send the data to CAN_A&B.
 //_interrupt (3) void TimerFirst(void);	  //定时器 1 中断//use as counter.for baudrate COM2_GPS232
 _interrupt (4) void RXDTXD485(void);	//串行口0中断函数 //for EKE_CPU
//_interrupt (5) void TimerSecond(void);  //定时器 2 中断//use as counter.for baudrate COM1_EKE_CPU
//_interrupt (6) void PowerFail(void);	  //电源失效中断。
 _interrupt (7) void  RxTxIntr422(void);  //串行 1 通讯中断//used for RS422 通讯
//_interrupt (8) void Ex2Interrupt(void); //外部中断2
//_interrupt (9) void Ex3Interrupt(void); //外部中断3
//_interrupt (10) void Ex4Interrupt(void);//外部中断4
//_interrupt (11) void Ex5Interrupt(void);//外部中断5
//_interrupt (12) void WatchDogInterrupt(void);//软件看门狗中断

 uchar  getCheckSum(uchar *,uchar);


 void insertNullinTx(void);
 void delNullFromRx(void);
 unsigned char  upset(unsigned char  updata);
 void upsetTxFram(void);
 void upsetRxFram(void);

 void txGetChecksum422(void);
 unsigned char rxCheckSum422(void);

 void initializeTimer1(void);
 void sendFram422(void);
 void sendStartCmmnd(void);
 void Sendstopcm(void);
 
 void rxtxid8and7(void);
 
 void tiltCmmnd(void);
 void tiltCmmnd0(void);
 void ResponseTeErr(void);

 void  ResponseCPU(void);
 
 void rxFrameAnalyse(void);
 void InitializeRXDTXDCom1(void);//set the communication_1 for _422_com_perhaps
 
 void rs485send(void);
 void rx485Manage(void);

/*CAN routine*/ 
 void CanRxProcess(void);
 void CanSend(void);
 void initCan(void);
 uchar enterRst(void);
 uchar enterWork(void);
 void enable485Send(void);
  
//......................above thisfile.h copied here for debug...................//

//主函数

 void main(void)
 {
 	uchar data i;
        uchar data sum=0;
 	
 	
 	Watchdog();
	PSW=0;/*程序状态字清零*/
        IE =0;/*中断允许字清零,不允许中断*/
        IP =0;/*中断优先级清零*/
        TR0=0;/*定时器0停止*/
        TR1=0;/*定时器1停止*/
        ET0=0;/*不允许定时器0中断*/
        ET1=0;/*不允许定时器1中断*/
        Watchdog();
        LEDON;
        Delay(10000); 
        Watchdog();
        LEDOFF;
        Delay(10000);          
        Watchdog();
        Initialize(); 
        while(1)
       { 
       	 bitTCSOK=1;
       	 _nop();
         while(bitTCSOK==1)
         {     
         	while(1)/*don't receive EKE information from 485*/
         	{
        		_nop();
        		Watchdog();
         	        if(bitFrmCmpl485)/*receive start common to  TE*/
         	         {
        		  bitFrmCmpl485=0;
        		  bitTCSOK=0;
        	          break;
        	         }
         	}
        }

        bitTEOK=1;
        _nop();
       while(bitTEOK==1)
        {
        	Watchdog();
               	if(bitFrmCmplCAN)/*CAN receive a whole frame*/
        	{
        		bitFrmCmplCAN=0;/*clear the flag*/
        		Watchdog();
        		CanRxProcess();/*store the receved data from CAN in the txbuf485[]*/
        		txbuf485[14]&=0xfe;/*CAN通信ok*/ 
        		LED2A=~LED2A; 
        		bitflag5s=0;      		        		
        	}
        	else
        	{
        	      if(bitflag5s)
        	       {
        	         bitflag5s=0;
        	         txbuf485[14]|=0x01;/*CAN通信失败*/        	         
        	         LED2A=~LED2A;  
        	        }
        	}
                Watchdog();
//        	rx485Manage();//根据SDR发送 
        	 for(i=0;i<RXBUF485MAX;i++)
     		   {
        	     rxPrcs485[i]=rxbuf485[i];
       		   }
        	txbuf485[3]=seccount;/*网卡 life signal*/       	
        	if(bitflag100ms&bitFrmCmpl485)/*rs485 receive a whole frame*/
        	{
        		        bitFrmCmpl485=0;
        		        bitflag100ms=0;
        		        seccount++;
        			Watchdog();
	        		enable485Send();        		
	        		Watchdog();
	        		rs485send();//response the EKE request
	        		LED1B=~LED1B;
        	}
        	Watchdog();
        	if((rxPrcs485[11]&0x01)==0x01/*bitflagb1*/)
        	{
                if(bitflag1s)
        	{       	
        	bitflag1s=0;         	
        	Watchdog();
        	sendStartCmmnd();/*send START COMMAND to TE by 422*/
        	LED1A=~LED1A;
        	     
                }       		
        	if(bitFrmCmpl422)/*recieve information from 422*/
        	{
        		bitFrmCmpl422=0;
        		Watchdog(); 			
 			rxFrameAnalyse();/*store the receved data from RS422 in the txbuf485[]*/  
 	 			
 	 			if((rxPrcs422[1]&0x3f)==0x02)/*TE START RESPONSE*/
 	 			{
 	 				txbuf485[0]=rxPrcs422[2];/*Te software version*/
 	                        	txbuf485[1]=rxPrcs422[3];
 	                        	txbuf485[2]=rxPrcs422[4];
 	                        	txbuf485[4]=rxPrcs422[5];/*self-test car-number*/ 	                        	
 	                                bitTEOK=0;/*TCS-TE alternately commucate completely at power on */
 	 			} 

        	}
           }//end bitflagb1
//           else
//           {
//           	if(bitflag5s)
//        	{       	
//        	bitflag5s=0;         	
//        	LED1A=~LED1A;        	     
//                }
//          }       	
        } 
        /*normal work   Main loop***************************************************/  
        bit422ID2OK=1;
        _nop();
       while( bit422ID2OK==1)
        {
               	if(bitFrmCmplCAN)/*CAN receive a whole frame*/
        	{
        		bitFrmCmplCAN=0;/*clear the flag*/ 
        		Watchdog();       		
        		CanRxProcess();/*store the received data from CAN in the txbuf485[]*/
        		txbuf485[14]&=0xfe;/*CAN通信ok*/
        		LED2A=~LED2A;
        		bitflag5s=0;
        	}
        	else
        	{
        	       if(bitflag5s)
        	       {
        	       bitflag5s=0;
        	       txbuf485[14]|=0x01;/*CAN通信失败*/
        	       LED2A=~LED2A;       
        	        }
        	} 
        	Watchdog();
//        	rx485Manage();//根据SDR发送
        	 for(i=0;i<RXBUF485MAX;i++)
        	{
        	rxPrcs485[i]=rxbuf485[i];
        	}

             	if(bitFrmCmpl422)/*rs422 receive a whole frame*/
        	{	
        	  bitFrmCmpl422=0;/*clear the flag*/  
        	  Watchdog(); 			
 		  rxFrameAnalyse();/*store the receved data from RS422 in the txbuf485[]*/ 
		    if((rxPrcs422[1]&0x3f)==0x03/*frameID==0x01/*0x03*/)/*TE Status frame  frameID*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -