/******************************************************************************* * 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; } } }
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(); }
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); } } }