void Test_NormalMode_Rx() { if(CAN_SetRxMsgObj(MSG(0),CAN_STD_ID, 0x7FF,TRUE) < 0) { printf("Set Rx Msg Object failed\n"); return; } if(CAN_SetRxMsgObj(MSG(5),CAN_EXT_ID, 0x12345,TRUE) < 0) { printf("Set Rx Msg Object failed\n"); return; } if(CAN_SetRxMsgObj(MSG(31),CAN_EXT_ID, 0x7FF01,TRUE) < 0) { printf("Set Rx Msg Object failed\n"); return; } /*Choose one mode to test*/ #if 1 /* Polling Mode */ while(1) { while(CAN->IIDR ==0); /* Wait IDR is changed */ printf("IDR = %x\n",CAN->IIDR); CAN_ReadMsgObj(CAN->IIDR -1,TRUE,&rrMsg); CAN_ShowMsg(&rrMsg); } #else /* INT Mode */ CAN_EnableInt(CAN_CON_IE); CAN_InstallCallback(CALLBACK_MSG, (CAN_CALLBACK)CAN_CallbackFn); printf("Wait Msg\n"); printf("Enter any key to exit\n"); GetChar(); #endif }
void CAN_Com_LoopBack_IRQ(void) { /* initialize the interrupt controller */ VIC_Config(CAN_ITLine, VIC_IRQ, Priority_1); /* initialize the CAN at a standard bitrate, interrupts enabled */ CAN_InitStructure.CAN_ConfigParameters=CAN_CR_IE; CAN_InitStructure.CAN_Bitrate=CAN_BITRATE_100K; 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_EXT_ID); CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_EXT_ID, 0, CAN_LAST_EXT_ID, TRUE); /* enable global interrupt */ VIC_ITCmd(CAN_ITLine, ENABLE); /* Send the pre-defined frame */ CAN_SendMessage(CAN_TX_MSGOBJ, &TxCanMsg[2]); /* wait until end of transmission */ CAN_WaitEndOfTx(); /* reception and release are done in the interrupt handler */ /* delay to add when the reception occurs */ delay(0x7FF); /* Test Received Msg */ if((RxCanMsg.IdType == CAN_EXT_ID)&&(RxCanMsg.Id == 0x12345678)&&(RxCanMsg.Dlc == 8) &&(RxCanMsg.Data[0]==0x10)&&(RxCanMsg.Data[1]==0x11)&&(RxCanMsg.Data[2]==0x12)&&(RxCanMsg.Data[3]==0x13) &&(RxCanMsg.Data[4]==0x14)&&(RxCanMsg.Data[5]==0x15)&&(RxCanMsg.Data[6]==0x16)&&(RxCanMsg.Data[7]==0x17)){ /*Received Msg OK*/ LED_ON(LD3); } else { /*Received Msg KO*/ LED_ON(LD4); } /* switch back into Normal mode */ CAN_LeaveTestMode(); /* disable interrupts globally */ VIC_ITCmd(CAN_ITLine, DISABLE); }
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(); }
void Test_SetMaskFilter() { STR_CANMASK_T MaskMsg; CAN_EnableInt(CAN_CON_IE); CAN_InstallCallback(CALLBACK_MSG, (CAN_CALLBACK)CAN_CallbackFn); /* Set b'0' means don't care*/ /* Set Messge Object No.0 mask ID */ MaskMsg.u8Xtd = 1; MaskMsg.u8Dir = 1; MaskMsg.u8IdType = 0; /* 1:EXT or 0:STD */ MaskMsg.u32Id = 0x707; CAN_SetMsgObjMask(MSG(0),&MaskMsg); CAN_SetRxMsgObj(MSG(0), CAN_STD_ID, 0x7FF , TRUE); printf("The sample code should be with Item[4]\n\n"); printf("Set Receive Message Object Contect\n"); printf("===================================\n"); printf("Message Object No.0 :Receive STD_ID:0x7FF\n\n\n"); printf("Set Mask Content\n"); printf("==========================\n"); printf("Compare Xtd: %s\n",MaskMsg.u8Xtd?"YES":"NO"); printf("Compare Dir: %s\n",MaskMsg.u8Dir?"YES":"NO"); printf("Compare MaskID:%s 0x%x\n\n\n",MaskMsg.u8IdType? "EXT":"STD",MaskMsg.u32Id); printf("If there is a message-ID 0x700~0x70F,\n ONLY 0x707/0x70F can pass acceptance filter.\n"); printf("Waiting Message\n"); SYS_SysTickDelay(100000); GetChar(); CAN_UninstallCallback(CALLBACK_MSG); CAN_DisableInt(CAN_CON_IE); }