📄 tangshants040611.c
字号:
/*--------------------------------------------------------------------------
*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 + -