📄 can_adpe.c
字号:
ID = XBYTE[Irmu_Query_Pointer+i*3];
XBYTE[Irmu_Warn_Pointer + i*NODE_WARN_LENGTH] = ID;
}
for (i=0;i<SFLU_NUMBER;i++)
{
ID = XBYTE[Sflu_Query_Pointer+i*3];
XBYTE[Sflu_Warn_Pointer + i*NODE_WARN_LENGTH] = ID;
}
for (i=0;i<IOCU_NUMBER;i++)
{
ID = XBYTE[Iocu_Query_Pointer+i*3];
XBYTE[Iocu_Warn_Pointer + i*NODE_WARN_LENGTH] = ID;
}
for (i=0;i<ADMU_NUMBER;i++)
{
ID = XBYTE[Admu_Query_Pointer+i*3];
XBYTE[Admu_Warn_Pointer + i*NODE_WARN_LENGTH] = ID;
}
/*报警计数区ID号设置*/
for (i=0;i<MRCU_NUMBER;i++)
{
ID = XBYTE[Mrcu_Query_Pointer+i*3];
XBYTE[Mrcu_Counter_Pointer + i*3] = ID;
}
for (i=0;i<IRMU_NUMBER;i++)
{
ID = XBYTE[Irmu_Query_Pointer+i*3];
XBYTE[Irmu_Counter_Pointer + i*3] = ID;
}
for (i=0;i<SFLU_NUMBER;i++)
{
ID = XBYTE[Sflu_Query_Pointer+i*3];
XBYTE[Sflu_Counter_Pointer + i*3] = ID;
}
for (i=0;i<IOCU_NUMBER;i++)
{
ID = XBYTE[Iocu_Query_Pointer+i*3];
XBYTE[Iocu_Counter_Pointer + i*3] = ID;
}
for (i=0;i<ADMU_NUMBER;i++)
{
ID = XBYTE[Admu_Query_Pointer+i*3];
XBYTE[Admu_Counter_Pointer + i*3] = ID;
}
/***************************************************************************/
/*Main Program*/
/***************************************************************************/
while(1)
{
while(1)
{
XBYTE[Watchdog_Pointer] = 0; /*clear watch dog timer*/
TR1=0;
C25045CS = 0;
C25045CS = 1;
if(XBYTE[Start_Pointer] == CAN_START)
break;
Delay(200);
}
EA=1;
TR1=1; /* open timer1 interrupter */
/*******************************************************************************/
/*查询节点*/
/*******************************************************************************/
for (ii=Mrcu_Query_Pointer;ii<=Admu_Query_Pointer;ii+=3)
{
for (i=0;i<3;i++)
{
Query[i] = XBYTE[ii+i];
}
Txbuf[0] = BIT07 | 0X00;
Txbuf[1] = Query[0];
Txbuf[2] = ID_CAN;
Txbuf[3] = Query[1];
Txbuf[4] = Query[2]<<4;
Can_Transmit(Txbuf,CANA_BASE);
Delay (600);
Can_Transmit(Txbuf,CANB_BASE);
Delay (600);
}
Order_Process();
}
}
void Order_Process()
{
BYTE data i,Txbuf[6],Order[3];
WORD j;
XBYTE[Watchdog_Pointer]=0;
// if(XBYTE[Refresh_Order_Pointer] == REFRESH_END)
{
for (j=Sflu_Order_Pointer;j<Sflu_Data_Pointer;j+=3)
{
for (i=0;i<3;i++)
{
Order[i] = XBYTE[j+i];
}
if (Order[2] == 0)
{}
else
{
Txbuf[0] = BIT07 | 0X01;
Txbuf[1] = Order[0];
Txbuf[2] = ID_CAN;
Txbuf[3] = Order[1];
Txbuf[4] = 0<<4;
Txbuf[5] = Order[2];
if (Can_Transmit(Txbuf,CANA_BASE)==TXSUCCESS)
_nop_();
// XBYTE[j+2] = 0;
Delay (400);
if (Can_Transmit(Txbuf,CANB_BASE)==TXSUCCESS)
XBYTE[j+2] = 0;
Delay (400);
}
}
// XBYTE[Refresh_Order_Pointer] = EMPTY;
}
}
BYTE Can_Transmit(BYTE * P,BYTE port)
{
BYTE i;
WORD ii;
C25045CS = 0;
C25045CS = 1;
XBYTE[Watchdog_Pointer]=0; /*clear watch dog timer*/
for(i=0;i<50;i++)
{
if(Check_Tstatus(port) == TXBUFRELESED)
{
if (port==CANA_BASE)
{
P16 = 1;
P17 = !P17;
}
else if (port==CANB_BASE)
{
P31 = 1;
P30 = !P30;
}
break;
}
if(i>45)
{
if (port==CANA_BASE)
{
P17 = 1;
P16 = 0;
}
else if (port==CANB_BASE)
{
P30 = 1;
P31 = 0;
}
return TXFAILURE;
}
}
for(i=0; i<6; i++)
PBYTE[16+i] = *(P+i);
CAN_CMD |= BIT00;
for(ii=0; ii<400; ii++)
{
if(CAN_SR_TCS && CAN_SR_TBS)
{
return TXSUCCESS;
}
if(ii>300)
{
CAN_CMD |= BIT01;
if (port==CANA_BASE)
{
P17 = 0;
P16 = 1;
}
else if (port==CANB_BASE)
{
P30 = 0;
P31 = 1;
}
return TXFAILURE;
}
}
}
BYTE Check_Tstatus(BYTE port)
{
P2 = port;
if(CAN_SR_RS || CAN_SR_TS) /*Receive Status or transmit Status is receiving or transmiting (=1)?*/
Delay(100);
if(CAN_SR_DOS) /*Data Overrun Status(=1)?*/
CAN_CMD |= BIT03; /*Clear Data Overrun(=1)*/
if(CAN_SR_BS || CAN_MOD_RM || CAN_SR_ES) /*bus-off(=1) or Reset-mode(=1) or error Status(=1)*/
{}
if(CAN_SR_TCS && CAN_SR_TBS) /*Transmission Complete (=1) and Transmit buffer released (=1)*/
return TXBUFRELESED;
// return TXBUFLOCKED;
}
BYTE CAN_Initate(BYTE port)
{
BYTE data i;
P2 = port;
CAN_Mode |= 0x01;
Delay(10);
for(i = 0; i < 100; i ++)
{
CAN_Mode |= 0x01;
Delay(10);
if((CAN_Mode & 0x01) == 0x01)
break;
if(i > 80)
return CAN_INI_FAILURE;
}
CAN_Clock_Divider = 0x88;
CAN_Interrupt_Enable = 0x01;
CAN_Acceptance_Code0 = ID_CAN;
CAN_Acceptance_Code1 = 0;
CAN_Acceptance_Code2 = 0;
CAN_Acceptance_Code3 = 0;
CAN_Acceptance_Mask0 = 0;
CAN_Acceptance_Mask1 = 0xFF;
CAN_Acceptance_Mask2 = 0xFF;
CAN_Acceptance_Mask3 = 0xFF;
CAN_Bus_Timing0 = 0x87;
CAN_Bus_Timing1 = 0xC8;
CAN_Output_Control = 0xaa;
CAN_Mode = 0x08;
Delay(10);
for(i = 0;i < 100; i ++)
{
CAN_Mode = 0X08;
Delay(10);
if((CAN_Mode & BIT00) == 0)
break;
if(i > 80)
return CAN_INI_FAILURE;
}
return CAN_INI_SUCCESS;
}
void CAN_Reset( BYTE port)
{
switch (port)
{
case CANA_BASE:
{
P14 = 1;
Delay(10);
P14 = 0;
break;
}
case CANB_BASE:
{
P15 = 1;
Delay(10);
P15 = 0;
break;
}
default :
{
P14 = 1;
P14 = 0;
Delay(10);
P15 = 1;
P15 = 0;
break;
}
}
}
void Delay(WORD j)
{
WORD data k;
for(k=0;k<j;k++)
_nop_();
}
void C25045Outbyt(BYTE obyt )
{
BYTE g,l;
for( g=0;g<8;g++)
{
C25045SCK=0;
l=0x80>>g;
C25045SI= (obyt&l) ? 1:0 ;
C25045SCK=1;
}
C25045SI=0;
}
BYTE C25045Inbyt ()
{
BYTE h,iadd;
iadd=0;
for( h=0;h<8;h++)
{
C25045SCK=1;
C25045SCK=0;
if(C25045SO) iadd=iadd|(1<<(7-h));
}
return( iadd );
}
void C25045Wrfish()
{
BYTE ina;
do
{
C25045SCK=0;
C25045CS=0;
C25045Outbyt(RDSR);
ina=C25045Inbyt();
C25045SCK =0;
C25045CS=1;
}
while ((ina&0x01)==1);
}
void C25045Rstdog()
{
C25045CS=0;
C25045CS=1;
}
void canint(void) interrupt 0 using 3
{
BYTE data Interrupt_Value;
EX0 = 0;
P2 = CANA_BASE;
Interrupt_Value = CAN_IR;
if(CAN_IR)
Interrupt_Process(Interrupt_Value,CANA_BASE);
P2 = CANB_BASE;
Interrupt_Value = CAN_IR;
if(CAN_IR)
Interrupt_Process(Interrupt_Value,CANB_BASE);
EX0 = 1;
}
void Interrupt_Process(BYTE Interrupt_Value,BYTE port) using 3
{
BYTE data i,j,Rxmessage[13];
if(CAN_IR_DOI)
{
CAN_CMD |= BIT02 | BIT03;
return;
}
if(CAN_IR_EI)
{
return;
}
if(CAN_IR_EPI)
{
return;
}
if(CAN_IR_RI)
{
for(i=0; i<((PBYTE[16]&0X0F)+ 5); i++)
Rxmessage[i] = PBYTE[16+i];
CAN_CMD |= BIT02;
if (port == CANA_BASE)
CounterA = 0;
else if (port == CANB_BASE)
CounterB = 0;
if(port == CANA_BASE)
{
for (i=0;i<NODE_NUMBER;i++)
{
if (Rxmessage[2] == XBYTE[Mrcu_Warn_Pointer+i*2])
XBYTE[Mrcu_Counter_Pointer+1+i*3] = 0;
}
}
if(port == CANB_BASE)
{
for (i=0;i<NODE_NUMBER;i++)
{
if (Rxmessage[2] == XBYTE[Mrcu_Warn_Pointer+i*2])
XBYTE[Mrcu_Counter_Pointer+2+i*3] = 0;
}
}
P2 = port;
switch(Rxmessage[3])
{
case MRCU_TYPE<<4|RES_Frame:
{
for (j=0;j<MRCU_NUMBER;j++)
{
if (Rxmessage[2]==XBYTE[Ccr_Data_Pointer+j*CCR_DATA_LENGTH])
{
if(Rxmessage[4]>>4 == 0)
{
for (i=1;i<=8;i++)
XBYTE[Ccr_Data_Pointer+8+i+j*CCR_DATA_LENGTH] = Rxmessage[4+i];
}
if(Rxmessage[4]>>4 == 1)
{
for (i=1;i<=8;i++)
XBYTE[Ccr_Data_Pointer+i+j*CCR_DATA_LENGTH] = Rxmessage[4+i];
}
}
}
}
break;
case IRMU_TYPE<<4|RES_Frame:
{
for (j=0;j<IRMU_NUMBER;j++)
{
if (Rxmessage[2]-5==XBYTE[Ccr_Data_Pointer+j*CCR_DATA_LENGTH])
{
XBYTE[Ccr_Data_Pointer+j*19+17] = Rxmessage[5];
XBYTE[Ccr_Data_Pointer+j*19+18] = Rxmessage[6];
}
}
}
break;
case SFLU_TYPE<<4|RES_Frame:
{
for (j=0;j<SFLU_NUMBER;j++)
{
if (Rxmessage[2]==XBYTE[Sflu_Data_Pointer+j*SFLU_DATA_LENGTH])
{
for (i=1;i<=6;i++)
XBYTE[Sflu_Data_Pointer+i+j*SFLU_DATA_LENGTH] = Rxmessage[4+i];
}
}
}
break;
case IOCU_TYPE<<4|RES_Frame:
{
for (j=0;j<IOCU_NUMBER;j++)
{
if (Rxmessage[2]==XBYTE[Di_Data_Pointer+j*DI_DATA_LENGTH])
{
for (i=1;i<=2;i++)
XBYTE[Di_Data_Pointer+i+j*DI_DATA_LENGTH] = Rxmessage[4+i];
}
}
}
break;
case ADMU_TYPE<<4|RES_Frame:
{
for (j=0;j<ADMU_NUMBER;j++)
{
if (Rxmessage[2]==XBYTE[Admu_Data_Pointer+j*ADMU_DATA_LENGTH])
{
if(Rxmessage[4]>>4 == 0)
{
for (i=1;i<=8;i++)
XBYTE[Admu_Data_Pointer+i+j*ADMU_DATA_LENGTH] = Rxmessage[4+i];
}
if(Rxmessage[4]>>4 == 1)
{
for (i=1;i<=8;i++)
XBYTE[Admu_Data_Pointer+i+8+j*ADMU_DATA_LENGTH] = Rxmessage[4+i];
}
}
}
}
break;
default:break;
}
}
}
void timer1_int(void) interrupt 3 using 2
{
BYTE i,j;
// TMOD = 0X10;
// TR1 = 0;
TH1 = 0;
TL1 = 0;
C25045CS = 0;
C25045CS = 1;
CounterA++;
if (CounterA>100)
{
CounterA = 0;
EX0=0;
Can_Reset(CANA_BASE);
Can_Initate(CANA_BASE);
EX0=1;
}
CounterB++;
if (CounterB>100)
{
CounterB = 0;
EX0=0;
Can_Reset(CANB_BASE);
Can_Initate(CANB_BASE);
EX0=1;
}
for (i=0;i<NODE_NUMBER;i++)
{
if (XBYTE[Mrcu_Counter_Pointer+1+i*3] < 205)
XBYTE[Mrcu_Counter_Pointer+1+i*3] += 1;
if (XBYTE[Mrcu_Counter_Pointer+2+i*3] < 205)
XBYTE[Mrcu_Counter_Pointer+2+i*3] += 1;
}
for (i=0;i<NODE_NUMBER;i++)
{
if (XBYTE[Mrcu_Counter_Pointer+1+i*3] > 200)
{
XBYTE[Mrcu_Warn_Pointer+1+i*2] |= 0xA0;
XBYTE[Refresh_Data_Pointer]=REFRESH_END;
}
else
{
XBYTE[Mrcu_Warn_Pointer+1+i*2] &= 0x0F;
XBYTE[Refresh_Data_Pointer]=REFRESH_END;
}
if (XBYTE[Mrcu_Counter_Pointer+2+i*3] > 200)
{
XBYTE[Mrcu_Warn_Pointer+1+i*2] |= 0x0A;
XBYTE[Refresh_Data_Pointer]=REFRESH_END;
}
else
{
XBYTE[Mrcu_Warn_Pointer+1+i*2] &= 0xF0;
XBYTE[Refresh_Data_Pointer]=REFRESH_END;
}
}
TR1=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -