Ejemplo n.º 1
0
/*******************************************************************************
* Function Name  : CAN_IRQHandler
* Description    : This function handles the CAN interrupt request
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void CAN_IRQHandler(void)
{
  u32 msgobj = 0;

  if(CAN->IDR == 0x8000)	/* status interrupt */
  {
    (void)CAN->SR;	/* read the status register to clear*/
  }
  else if(CAN->IDR >= 1 && CAN->IDR <= 32)
  {
    /* get the message object number that caused the interrupt to occur */
    switch(msgobj = CAN->IDR - 1)
    {
      case  0 /* CAN_TX_MSGOBJ */:
        CAN_ReleaseTxMessage(msgobj);
	break;

      case 1 /* CAN_RX_MSGOBJ */:
        CAN_ReceiveMessage(msgobj, FALSE, &RxCanMsg);
	CAN_ReleaseRxMessage(msgobj);
	break;

      default:
	CAN_ReleaseMessage(msgobj);
        break;
    }
  }
}
Ejemplo n.º 2
0
void CAN_Com_LoopBack(void)
{
  /* initialize the CAN at a standard bitrate, interrupts disabled */
  CAN_InitStructure.CAN_ConfigParameters=0x0;
  CAN_InitStructure.CAN_Bitrate=CAN_BITRATE_1M;
  CAN_Init(&CAN_InitStructure);

  /* switch into Loopback+Silent mode (self-test) */
  CAN_EnterTestMode(CAN_TESTR_LBACK | CAN_TESTR_SILENT);

  /* configure the message objects */
  CAN_InvalidateAllMsgObj();
  CAN_SetTxMsgObj(CAN_TX_MSGOBJ, CAN_STD_ID);
  CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_STD_ID, 0, CAN_LAST_STD_ID, TRUE);

  /* Send the pre-defined answer */
  CAN_SendMessage(CAN_TX_MSGOBJ, &TxCanMsg[1]);

  /* wait until end of transmission */
  CAN_WaitEndOfTx();

  /* wait for reception of a data frame */
  while (!CAN_ReceiveMessage(CAN_RX_MSGOBJ, FALSE, &RxCanMsg))
  {
    /*Add Timer*/
  }


  /* Test Received Msg */
  if((RxCanMsg.IdType == CAN_STD_ID)&&(RxCanMsg.Id == 0x321)&&(RxCanMsg.Dlc == 4)
    &&(RxCanMsg.Data[0]==0xAA)&&(RxCanMsg.Data[1]==0x55)&&(RxCanMsg.Data[2]==0xAA)&&(RxCanMsg.Data[3]==0x55)){
    /*Received Msg OK*/
    LED_ON(LD2);
  } else {
    /*Received Msg KO*/
    LED_ON(LD4);
  }


  /* release the message objects */
  CAN_ReleaseTxMessage(CAN_TX_MSGOBJ);
  CAN_ReleaseRxMessage(CAN_RX_MSGOBJ);

  /* switch back into Normal mode */
  CAN_LeaveTestMode();

}
Ejemplo n.º 3
0
int main(void)
{
	
	StandartMessage TxMessage;
	StandartMessage RxMessage;
	
	TxMessage.OutputBuffer = 0;
	TxMessage.Priority = 0;
	TxMessage.StdIdentifier = DEVICE_ID;
	TxMessage.MessageLength = 4;
	TxMessage.RemoteTransmission = 0;
	TxMessage.Messages[0] = 0xA0;
	TxMessage.Messages[1] = 0x0A;
	TxMessage.Messages[2] = 0x50;
	TxMessage.Messages[3] = 0x05;
	
	
		
	DDRD = 0xff;
	PORTD = 0xff;
	
	uint8_t OutTable[8];
	SPI_Init();
	CAN_Reset();
	CAN_Init();
	 
	 PORTD = ~(CAN_GetBuffer(CANSTAT_ADR));
	  _delay_ms(1000);
	 //CAN_SetLoopbackMode();
	 CAN_SetNormalMode();
	  _delay_ms(100);
	  PORTD = ~(CAN_GetBuffer(CANSTAT_ADR));
	  _delay_ms(1000);
	
	 //CAN_TransmitMessage(&TxMessage);
	 
	int counter = 0;
	
	
    while(1)
    {
		
		//if(counter > 2)
		//{
			//CAN_TransmitMessage(&TxMessage);
			//counter = 0;
		//}
		//else
		//{
			//counter++;
		//}
		
		
        if(CAN_GetBuffer(CANINTF_ADR)&RX0IF)
        {
	        CAN_ReceiveMessage(0,&RxMessage);
	        
	        blink();
	        PORTD = ~RxMessage.StdIdentifier;
	        _delay_ms(2000);
	        blink();
	        PORTD = ~RxMessage.MessageLength;
	        _delay_ms(2000);
	        
	        if(RxMessage.RemoteTransmission)
				PORTD = ~RxMessage.RemoteTransmission;
	        else
	        {
		        for(int i=0; i<RxMessage.MessageLength; i++)
		        {
			        blink();
			        PORTD = ~RxMessage.Messages[i];
			        _delay_ms(2000);
		        }
		        
	        }
        }
		else
		{
			blink();
			PORTD = ~(0b11000011);
			_delay_ms(2000);
		}			
    }
}