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

📄 can841.c

📁 PCL的一个原代码,工业控制和数据处理,自控方面的一个小东东.
💻 C
📖 第 1 页 / 共 2 页
字号:
		  can0w(0x100,v);
		  delay(500);
		  can0w(0,1);
		  delay(500);/*important! wait for the card to change protocol  */
		  v=can0r(31);
		  v |=0x80;
		  can0w(31,v);


	  }
	  else
	  {
		  can1w(0,1);
		  v=can1r(0x100);
		  can1w(0x100,v);
		  delay(500);
		  can1w(0,1);
		  delay(500);
		  v=can1r(31);
		  v |=0x80;
		  can1w(31,v);



	  }

	  if( port ==0)
	  {
		  if( gIrq0 == IRQ_POLLING)
		  {
			  v=can0r(4);
			  v &=0xfe;
			  can0w(4,v);
		  }
		  else
		  {
			  v=can0r(4);
			  v |=0x09;
			  can0w(4,v);/* reset mode and receive irq */

		  }
	  }
	  else
	  {
		  if( gIrq1 == IRQ_POLLING)
		  {
			  v=can1r(4);
			  v &=0xfe;
			  can1w(4,v);

		  }
		  else
		  {
			  v=can1r(4);
			  v |=0x09;
			  can1w(4,v);/* reset mode and receive irq */

		  }
	  }


	  if( port ==0)
	  {
		  can0w(6,can.bt0); /* BT0 */
		  can0w(7,can.bt1); /* BT1 */
		  temp=can0r(6);
		  if( temp !=can.bt0)
			  return(0);
		  temp=can0r(7);
		  if( temp !=can.bt1)
			  return(0);
	  }
	  else
	  {
		  can1w(6,can.bt0); /* BT0 */
		  can1w(7,can.bt1); /* BT1 */
		  temp=can1r(6);
		  if( temp !=can.bt0)
			  return(0);
		  temp=can1r(7);
		  if( temp !=can.bt1)
			  return(0);
	  }

	  if( port ==0)
	  {
		  v       = can0r( 0 );
		  if ( can.ssFilterSetting.dwFilterType == 0 )
		  {
			 v |= 0x08;
		  }
		  else
		  {
			  v &= 0xf7;
		  }
		  can0w(0, v);
		  delay(200);
		  can0w(16,can.ssFilterSetting.uchAcceptCode0);/* accept code */
		  can0w(17,can.ssFilterSetting.uchAcceptCode1);/* accept code */
		  can0w(18,can.ssFilterSetting.uchAcceptCode2);/* accept code */
		  can0w(19,can.ssFilterSetting.uchAcceptCode3);/* accept code */
		  can0w(20,can.ssFilterSetting.uchAcceptMask0);/* accept mask */
		  can0w(21,can.ssFilterSetting.uchAcceptMask1);/* accept mask */
		  can0w(22,can.ssFilterSetting.uchAcceptMask2);/* accept mask */
		  can0w(23,can.ssFilterSetting.uchAcceptMask3);/* accept mask */

	  }
	  else
	  {
		  v       = can1r( 0 );
		  if ( can.ssFilterSetting.dwFilterType == 0 )
		  {
			  v |= 0x08;
		  }
		  else
		  {
			  v &= 0xf7;
		  }
		  can1w(0, v);
		  delay(200);
		  tag=can1r(0);
		  can1w(16,can.ssFilterSetting.uchAcceptCode0);/* accept code */
		  tag=can1r(16);
		  can1w(17,can.ssFilterSetting.uchAcceptCode1);/* accept code */
		  tag=can1r(17);
		  can1w(18,can.ssFilterSetting.uchAcceptCode2);/* accept code */
		  can1w(19,can.ssFilterSetting.uchAcceptCode3);/* accept code */
		  can1w(20,can.ssFilterSetting.uchAcceptMask0);/* accept mask */
		  can1w(21,can.ssFilterSetting.uchAcceptMask1);/* accept mask */
		  can1w(22,can.ssFilterSetting.uchAcceptMask2);/* accept mask */
		  can1w(23,can.ssFilterSetting.uchAcceptMask3);/* accept mask */

	  }
	  if( port ==0)
	  {
		  can0w(8,0xfa);
	  }
	  else
	  {
		  can1w(8,0xfa);
	  }
	  return(1);
  }

}
/*--------------------------------------------------------------------------*/
int  canNormalRun( BYTE port )
{
BYTE v;
  if( port ==0)
  {
	v=can0r(0);
	if( v & 1)
	  can0w(0,v&0xfe);

  }
  else
  {
	v=can1r(0);
	if( v & 1)
	  can1w(0,v&0xfe);

  }
  if( port ==0)
  {
	  if( gIrq0 == IRQ_POLLING)
	  {
		  v=can0r(4);
		  v &=0xfe;
		  can0w(4,v);
		  return 1;
	  }
	  else
	  {
		  v=can0r(4);
		  v |=0x09;
		  can0w(4,v);/* reset mode and receive irq */
		  delay(500);
		  return 1;
	  }
  }
  else
  {
	  if( gIrq1 == IRQ_POLLING)
	  {
		  v=can1r(4);
		  v &=0xfe;
		  can1w(4,v);
		  return 1;
	  }
	  else
	  {
		  v=can1r(4);
		  v |=0x09;
		  can1w(4,v);/* reset mode and receive irq */
		  delay(500);
		  return 1;
	  }
  }
return 0;
}
/*--------------------------------------------------------------------------*/
int canSendMsg( BYTE  port, MSG_STRUCT msg)
{
  BYTE v;
  BYTE i;

  if( port==0)
  {
    v=msg.id>>3;
    can0w(10,v);
    v=msg.id &7;
    v<<=5;
    if( msg.rtr ==1)
      v|=0x10;
      v+=msg.dlen;
    can0w(11,v);
    for(i=0;i<msg.dlen; i++)
    {
      can0w(12+i,msg.data[i]);
    }
    can0w(1,1);
    while(1)
    {
      v=can0r(2);
      if( v & 0x40)
      {
	return( 0);
      }
      if( v &0x08)
	return( 1);
    }
  }
  else
  {
    v=msg.id>>3;
    can1w(10,v);
    v=msg.id &7;
    v<<=5;
    if( msg.rtr ==1)
      v|=0x10;
      v+=msg.dlen;
    can1w(11,v);
    for(i=0;i<msg.dlen; i++)
    {
      can1w(12+i,msg.data[i]);
    }
    can1w(1,1);
    while(1)
    {
      v=can1r(2);
      if( v & 0x40)
      {
	return( 0);
      }
      if( v &0x08)
	return( 1);
    }
  }
}

/*add by jinzhong*/
int canSendMsgEx( BYTE  port, CAN_MSG_T_EX msgex)
{
	long v,temp1,temp2;
	BYTE i;

	if( port==0)
	{
		temp1=can0r(2);
		if(temp1 & 0x04)
		{
			if( msgex.ff==PELICAN_SFF)
			{
				temp1=0;
				temp1 |=msgex.dlen;
				if ( msgex.rtr == 1 )
				{
					temp1 |= 1<<6;
				}
				can0w(16,temp1);
				temp1 = 0;
				temp1 = msgex.id>>3;
				can0w(17,temp1);
				temp1 = 0;
				temp1 =  msgex.id & 0x07 ;
				temp1 <<= 5;
				can0w(18,temp1);
				for(i=0;i<msgex.dlen; i++)
				{
					can0w(19+i,msgex.data[i]);
				}
			}
			else
			{
				temp1 = 0;
				temp1 |= msgex.dlen;
				if ( msgex.rtr == 1 )
				{
					temp1 |= 1<<6;
				}
				temp1 |= 1<<7;
				can0w(16,temp1);
				temp1 = msgex.id>>21;
				can0w(17,temp1);
				temp1 =  msgex.id & 0x1fffff ;
				temp1 >>= 13;
				can0w(18,temp1);
				temp1 =  msgex.id & 0x1fff ;
				temp1 >>= 5;
				can0w(19,temp1);
				temp1 =  msgex.id & 0x1f ;
				temp1 <<= 3;
				can0w(20,temp1);
				for(i=0;i<msgex.dlen; i++)
				{
					can0w(21+i,msgex.data[i]);
				}
			}
			can0w(1,1);
			while(1)
			{
				temp1=can0r(2);
				if( temp1 & 0x40)
				{
					return( 0);
				}
				if( temp1 &0x08)
					return( 1);
			}
		}
		else return(0);
	}
	else
	{
		temp2=can1r(2);
		if(temp2 & 0x04)
		{
			if( msgex.ff==PELICAN_SFF)
			{
				temp2=0;
				temp2 |=msgex.dlen;
				if ( msgex.rtr == 1 )
				{
					temp2 |= 1<<6;
				}
				can1w(16,temp2);
				temp2 = 0;
				temp2 = msgex.id>>3;
				can1w(17,temp2);
				temp2 = 0;
				temp2 =  msgex.id & 0x07 ;
				temp2 <<= 5;
				can1w(18,temp2);
				for(i=0;i<msgex.dlen; i++)
				{
					can1w(19+i,msgex.data[i]);
				}
			}
			else
			{
				temp2 = 0;
				temp2 |= msgex.dlen;
				if ( msgex.rtr == 1 )
				{
					temp2 |= 1<<6;
				}
				temp2 |= 1<<7;
				can1w(16,temp2);
				temp2 = msgex.id>>21;
				can1w(17,temp2);
				temp2 =  msgex.id & 0x1fffff ;
				temp2 >>= 13;
				can1w(18,temp2);
				temp2 =  msgex.id & 0x1fff ;
				temp2 >>= 5;
				can1w(19,temp2);
				temp2 =  msgex.id & 0x1f ;
				temp2 <<= 3;
				can1w(20,temp2);
				for(i=0;i<msgex.dlen; i++)
				{
					can1w(21+i,msgex.data[i]);
				}
			}
			can1w(1,1);
			while(1)
			{
				temp2=can1r(2);
				if( temp2 & 0x40)
				{
					return( 0);
				}
				if( temp2 &0x08)
					return( 1);
			}
		}
		else return(0);
	}
}
/*edd added*/
/*--------------------------------------------------------------------------*/
int  canReceiveMsg( BYTE port, MSG_STRUCT *msg_ptr, BYTE * IsEmpty)
{
   BYTE i;
   pMSG_STRUCT pcan_msg;
   MSG_STRUCT msg;
   ULONG head,tail;
   *IsEmpty = 1;
   if( port == 0)
   {
      if( gIrq0 == IRQ_POLLING)
      {
         if( can0r(2)&1)
         {
            rBuf0[0]=can0r(20);
            rBuf0[1]=can0r(21);
            for(i=0; i< (rBuf0[1]&0x0f); i++)
               rBuf0[i+2]=can0r(22+i);
            /* release receive buffer*/
            can0w(1,4);
            msg_ptr->id=rBuf0[0];
            msg_ptr->id <<=3;
            msg_ptr->id |=(rBuf0[1] >>5);
            msg_ptr->rtr =(rBuf0[1]>>4)&1;
            msg_ptr->dlen =rBuf0[1]&0x0f;
            for(i=0;i< msg_ptr->dlen; i++)
               msg_ptr->data[i]=rBuf0[2+i];
            return(1);
         }
         else
            return(0);
      }
      else
      {
         head = READ_FIFO0.head;
         tail = READ_FIFO0.tail;
         if(head == tail)
         return(0);
         pcan_msg= (MSG_STRUCT *)&READ_FIFO0.buffer[tail];
         READ_FIFO0.tail += CAN_MSG_LEN;
         if(READ_FIFO0.tail == RD_FIFO_LEN )
         {
            READ_FIFO0.tail %= RD_FIFO_LEN;
            READ_FIFO0.status = FIFO_OK;
         }
         if(READ_FIFO0.tail == head )
            *IsEmpty = 1;
         else
            *IsEmpty = 0;
         msg = *pcan_msg;
         *((MSG_STRUCT *)msg_ptr) = msg;
         return(1);
      }
   }
   else if(port == 1)
   {
      if( gIrq1 == IRQ_POLLING)
      {
	if( can1r(2)&1)
         {
            rBuf1[0]=can1r(20);
            rBuf1[1]=can1r(21);
            for(i=0; i< ( rBuf1[1]&0x0f); i++)
               rBuf1[i+2]=can1r(22+i);
            can1w(1,4);
            msg_ptr->id=rBuf1[0];
            msg_ptr->id <<=3;
            msg_ptr->id |=(rBuf1[1] >>5);
            msg_ptr->rtr =(rBuf1[1]>>4)&1;
            msg_ptr->dlen =rBuf1[1]&0x0f;
            for(i=0;i< msg_ptr->dlen; i++)
               msg_ptr->data[i]=rBuf1[2+i];
            return(1);
         }
         else
            return(0);
      }
      else
      {
         head = READ_FIFO1.head;
         tail = READ_FIFO1.tail;
         if(head == tail)
         return(0);
         pcan_msg= (MSG_STRUCT *)&READ_FIFO1.buffer[tail];
         READ_FIFO1.tail += CAN_MSG_LEN;
         if(READ_FIFO1.tail == RD_FIFO_LEN )
         {
            READ_FIFO1.tail %= RD_FIFO_LEN;
            READ_FIFO1.status = FIFO_OK;
         }
         if(READ_FIFO1.tail == head )
            *IsEmpty = 1;
         else
            *IsEmpty = 0;
         msg = *pcan_msg;
         *((MSG_STRUCT *)msg_ptr) = msg;
         return(1);
      }
   }
   else
     return( 0);
}
/*--------------------------------------------------------------------------*/
/*--------------------------
---add by jinzhong----------
---------------------------*/
/*--------------------------------------------------------------------------*/
int  canReceiveMsgEx( BYTE port, CAN_MSG_T_EX *msg_ptrex, BYTE * IsEmpty)
{
   BYTE i;
   PCAN_MSG_T_EX pcan_msgex;
   CAN_MSG_T_EX msgex;
   long head,tail;
   long temp1,temp2;
   unsigned int tag1;
   *IsEmpty = 1;
   if( port == 0)
   {
      if( gIrq0 == IRQ_POLLING)
      {
         if( can0r(2)&1)
         {

			 temp1=can0r(16);
			 msg_ptrex->ff   =  temp1 & 0x80 ;
			 msg_ptrex->dlen =  temp1 & 0x0f ;
			 msg_ptrex->rtr  = ( temp1>> 6) & 1;
			 if ( msg_ptrex->ff == PELICAN_SFF )
			 {
				 temp1 = can0r(17);
				 msg_ptrex->id = temp1 << 3;
				 temp1 = can0r(18);
				 msg_ptrex->id |= temp1 >> 5;
				 for ( i = 0; i < msg_ptrex->dlen; i++ )
					 msg_ptrex->data[i] =  can0r(19+i);

			 }
			 else
			 {
				 temp1 = can0r(17);
				 msg_ptrex->id = temp1 << 21;
				 temp1 = can0r(18);
				 msg_ptrex->id |= temp1 << 13;
				 temp1 = can0r(19);
				 msg_ptrex->id |= temp1 << 5;
				 temp1 = can0r(20);
				 msg_ptrex->id |= temp1 >> 3;
				 for ( i = 0; i < msg_ptrex->dlen; i++ )
					 msg_ptrex->data[i] =  can0r(21+i);
			}

            /* release receive buffer*/
            can0w(1,4);
            return(1);
         }
         else
            return(0);
      }
      else
      {
         head = READ_FIFO_EX0.head;
         tail = READ_FIFO_EX0.tail;
         if(head == tail)
         return(0);
         pcan_msgex= (CAN_MSG_T_EX *)&READ_FIFO_EX0.buffer[tail];
         READ_FIFO_EX0.tail += CAN_MSG_EX_LEN;
         if(READ_FIFO_EX0.tail == RD_FIFO_EX_LEN )
         {
            READ_FIFO_EX0.tail %= RD_FIFO_EX_LEN;
            READ_FIFO_EX0.status = FIFO_OK;
         }
         if(READ_FIFO_EX0.tail == head )
            *IsEmpty = 1;
         else
            *IsEmpty = 0;
         msgex = *pcan_msgex;
         *((CAN_MSG_T_EX *)msg_ptrex) = msgex;
         return(1);
      }
   }
   else if(port == 1)
   {
      if( gIrq1 == IRQ_POLLING)
      {
	tag1 = can1r(0);
	if(tag1&1)
	return 0;
	tag1 = can1r(2);
         if( can1r(2)&1)
         {
			 temp2=can1r(16);
			 msg_ptrex->ff   =  temp2 & 0x80 ;
			 msg_ptrex->dlen =  temp2 & 0x0f ;
			 msg_ptrex->rtr  = ( temp2 >> 6) & 1;
			 if ( msg_ptrex->ff == PELICAN_SFF )
			 {
				 temp2 = can1r(17);
				 msg_ptrex->id = temp2 << 3;
				 temp2 = can1r(18);
				 msg_ptrex->id |= temp2 >> 5;
				 for ( i = 0; i < msg_ptrex->dlen; i++ )
					 msg_ptrex->data[i] =  can1r(19+i);

			 }
			 else
			 {
				 temp2 = can1r(17);
				 msg_ptrex->id = temp2 << 21;
				 temp2 = can1r(18);
				 msg_ptrex->id |= temp2 << 13;
				 temp2 = can1r(19);
				 msg_ptrex->id |= temp2 << 5;
				 temp2 = can1r(20);
				 msg_ptrex->id |= temp2 >> 3;
				 for ( i = 0; i < msg_ptrex->dlen; i++ )
					 msg_ptrex->data[i] =  can1r(21+i);
			 }

			 /* release receive buffer*/
			 can1w(1,4);
			 return(1);
         }
         else
            return(0);
      }
      else
      {
         head = READ_FIFO_EX1.head;
         tail = READ_FIFO_EX1.tail;
         if(head == tail)
         return(0);
	 pcan_msgex= (CAN_MSG_T_EX *)&READ_FIFO_EX1.buffer[tail];
         READ_FIFO_EX1.tail += CAN_MSG_EX_LEN;
         if(READ_FIFO_EX1.tail == RD_FIFO_EX_LEN )
         {
            READ_FIFO_EX1.tail %= RD_FIFO_EX_LEN;
            READ_FIFO_EX1.status = FIFO_OK;
         }
         if(READ_FIFO_EX1.tail == head )
            *IsEmpty = 1;
         else
            *IsEmpty = 0;
         msgex = *pcan_msgex;
         *((CAN_MSG_T_EX *)msg_ptrex) = msgex;
         return(1);
      }
   }
   else
     return( 0);
}
int  canSetProtocolType( BYTE port,BYTE protocoltype )
{
	BYTE v;
	if (port==0)
	{
		if(protocoltype==CANBUS_PROTOCOL_20A)
		{
			
			protocol1=CANBUS_PROTOCOL_20A;
			return(1);
		}
		if(protocoltype==CANBUS_PROTOCOL_20B)
		{
			
			protocol1=CANBUS_PROTOCOL_20B;
			return(1);
		}
		else return(0);
	}
	if (port==1)
	{
		if(protocoltype==CANBUS_PROTOCOL_20A)
		{
		
			protocol2=CANBUS_PROTOCOL_20A;
			return(1);
		}
		if(protocoltype==CANBUS_PROTOCOL_20B)
		{
		
			protocol2=CANBUS_PROTOCOL_20B;
			return(1);
		}
		else return(0);
	}
	return(0);
}

⌨️ 快捷键说明

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