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

📄 can_adpe.c

📁 这是一个CAN总线适配器的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -