void USB2CAN_open(u32 speed,u32 flags,CAN_TIMINGS *CanTimings) { CAN_ENABLE(); USB2CAN_set_speed(speed,CanTimings); switch( flags & 0x0003 ) { case CAN_MODE_NORMAL: // normal mode CAN_LeaveTestMode(); break; case CAN_MODE_SILENT: // silent mode CAN_EnterTestMode( CAN_TESTR_SILENT ); break; case CAN_MODE_LOOPBACK: // loopback mode CAN_EnterTestMode( CAN_TESTR_LBACK ); break; case CAN_MODE_SILENT_LOOPBACK: CAN_EnterTestMode( CAN_TESTR_LBACK | CAN_TESTR_SILENT ); break; default: CAN_LeaveTestMode(); break; } // DAR if( flags & 0x0004 ) CAN->CR |= CAN_CR_DAR; // disable auto retransmitions else CAN->CR &= ~CAN_CR_DAR; // enable auto retransmitions }
int can_mode(can_t *obj, CanMode mode) { CAN_T *can_base = (CAN_T *) NU_MODBASE(obj->can); int success = 0; switch (mode) { case MODE_RESET: CAN_LeaveTestMode(can_base); success = 1; break; case MODE_NORMAL: CAN_EnterTestMode(can_base, CAN_TEST_BASIC_Msk); success = 1; break; case MODE_SILENT: CAN_EnterTestMode(can_base, CAN_TEST_SILENT_Msk); success = 1; break; case MODE_TEST_LOCAL: case MODE_TEST_GLOBAL: CAN_EnterTestMode(can_base, CAN_TEST_LBACK_Msk); success = 1; break; case MODE_TEST_SILENT: CAN_EnterTestMode(can_base, CAN_TEST_SILENT_Msk | CAN_TEST_LBACK_Msk); success = 1; break; default: success = 0; break; } return success; }
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_BasicMode_Rx() { STR_CANMSG_T rMsg[5]; int32_t i; CAN_EnterTestMode(CAN_TESTR_BASIC); /* Wait status flag changed and with read IF2 */ printf("\b Total 40 bytes data(using 5 frames)will be receive by CAN0 from CAN BUS\n"); for(i=0;i<5;i++) { CAN_ResetIF(1); CAN->IF[1].MCON =0; CAN_WaitMsg(); CAN_BasicReceiveMsg(&rMsg[i]); } for(i=0;i<5;i++) CAN_ShowMsg(&rMsg[i]); printf("CAN TEST END\n"); return; }
/*----------------------------------------------------------------------------*/ void Test_BasicMode_Tx() { int32_t delaycount; STR_CANMSG_T msg1; delaycount=1000; CAN_EnterTestMode(CAN_TESTR_BASIC); CAN_EnableInt(CAN_CON_IE|CAN_CON_SIE); /* Send Message No.1 */ msg1.FrameType= DATA_FRAME; msg1.IdType = CAN_STD_ID; msg1.Id = 0x001; msg1.DLC = 2; msg1.Data[0] = 0x00; msg1.Data[1] = 0x2; CAN_BasicSendMsg(&msg1); printf("Send STD_ID:0x1,Data[0,2]\n"); SYS_SysTickDelay(delaycount); /* Send Message No.2 */ msg1.FrameType= DATA_FRAME; msg1.IdType = CAN_STD_ID; msg1.Id = 0x1AC; msg1.DLC = 8; msg1.Data[0] = 0x11; msg1.Data[1] = 0x12; msg1.Data[2] = 0x13; msg1.Data[3] = 0x14; msg1.Data[4] = 0x15; msg1.Data[5] = 0x16; msg1.Data[6] = 0x17; msg1.Data[7] = 0x18; CAN_BasicSendMsg(&msg1); printf("Send STD_ID:0x1AC,Data[11,12,13,14,15,16,17,18]\n"); SYS_SysTickDelay(delaycount); /* Send Message No.3 */ msg1.FrameType= DATA_FRAME; msg1.IdType = CAN_STD_ID; msg1.Id = 0x310; msg1.DLC = 8; msg1.Data[0] = 0x21; msg1.Data[1] = 0x22; msg1.Data[2] = 0x23; msg1.Data[3] = 0x24; msg1.Data[4] = 0x25; msg1.Data[5] = 0x26; msg1.Data[6] = 0x27; msg1.Data[7] = 0x28; CAN_BasicSendMsg(&msg1); printf("Send STD_ID:0x310,Data[21,22,23,24,25,26,27,28]\n"); SYS_SysTickDelay(delaycount); /* Send Message No.4 */ msg1.FrameType= DATA_FRAME; msg1.IdType = CAN_EXT_ID; msg1.Id = 0x3377; msg1.DLC = 8; msg1.Data[0] = 0x31; msg1.Data[1] = 0x32; msg1.Data[2] = 0x33; msg1.Data[3] = 0x34; msg1.Data[4] = 0x35; msg1.Data[5] = 0x36; msg1.Data[6] = 0x37; msg1.Data[7] = 0x38; CAN_BasicSendMsg(&msg1); printf("Send EXT_ID:0x3377,Data[31,32,33,34,35,36,37,38]\n"); SYS_SysTickDelay(delaycount); /* Send Message No.5 */ msg1.FrameType= DATA_FRAME; msg1.IdType = CAN_EXT_ID; msg1.Id = 0x7755; msg1.DLC = 8; msg1.Data[0] = 0x41; msg1.Data[1] = 0x42; msg1.Data[2] = 0x43; msg1.Data[3] = 0x44; msg1.Data[4] = 0x45; msg1.Data[5] = 0x46; msg1.Data[6] = 0x47; msg1.Data[7] = 0x48; CAN_BasicSendMsg(&msg1); printf("Send EXT_ID:0x7755,Data[41,42,43,44,45,46,47,48]\n"); SYS_SysTickDelay(delaycount); CAN_LeaveTestMode(); }
void can_monitor(can_t *obj, int silent) { CAN_EnterTestMode((CAN_T *)NU_MODBASE(obj->can), CAN_TEST_SILENT_Msk); }