/* Init CAN Hardware */ void can_init(const char* dev) { bzero(&message, sizeof(can_message_t)); /* ... add your code here ... */ btr0=0x00; btr1=0x14; /* Using Interface cpc_usb0 */ strcpy(interface, dev); // strcpy(interface, "/dev/cpc_usb0"); /*Open the CAN*/ if ((handle = CPC_OpenChannel(interface)) < 0) { fprintf(stderr, "ERROR: %s\n", CPC_DecodeErrorMsg(handle)); exit(1); } PDEBUG("%s is CAN interface -> handle %d\n", interface, handle); /* ############################# Init Parameters ######################*/ /*Define Handlers*/ CPC_AddHandler(handle, cpc_read_message_handler); /*CPC_AddHandler(handle, get_steering_msg_handler); CPC_AddHandler(handle, get_yaw_msg_handler);*/ /* This sets up the parameters used to initialize the CAN controller */ PDEBUG("Initializing CAN-Controller ... "); CPCInitParamsPtr = CPC_GetInitParamsPtr(handle); CPCInitParamsPtr->canparams.cc_type = SJA1000; CPCInitParamsPtr->canparams.cc_params.sja1000.btr0 = btr0; CPCInitParamsPtr->canparams.cc_params.sja1000.btr1 = btr1; CPCInitParamsPtr->canparams.cc_params.sja1000.outp_contr = 0xda; CPCInitParamsPtr->canparams.cc_params.sja1000.acc_code0 = 0xff; CPCInitParamsPtr->canparams.cc_params.sja1000.acc_code1 = 0xff; CPCInitParamsPtr->canparams.cc_params.sja1000.acc_code2 = 0xff; CPCInitParamsPtr->canparams.cc_params.sja1000.acc_code3 = 0xff; CPCInitParamsPtr->canparams.cc_params.sja1000.acc_mask0 = 0xff; CPCInitParamsPtr->canparams.cc_params.sja1000.acc_mask1 = 0xff; CPCInitParamsPtr->canparams.cc_params.sja1000.acc_mask2 = 0xff; CPCInitParamsPtr->canparams.cc_params.sja1000.acc_mask3 = 0xff; CPCInitParamsPtr->canparams.cc_params.sja1000.mode = 0; CPC_CANInit(handle, 0); PDEBUG("Done!\n\n"); cpcfd = CPC_GetFdByHandle(handle); PDEBUG("Switch ON transimssion of CAN messages from CPC to PC\n"); /* switch on transmission of CAN messages from CPC to PC */ CPC_Control(handle, CONTR_CAN_Message | CONTR_CONT_ON); PDEBUG("Initialization finished...\n"); }
int can_cpc_setup(can_cpc_device_p dev, int bitrate, int quanta_per_bit, double sampling_point, double timeout) { CPC_INIT_PARAMS_T* parameters; double t = 1.0/(8*bitrate*1e3); int brp = round(4*t*CAN_CPC_CLOCK_FREQUENCY/quanta_per_bit); int tseg1 = round(quanta_per_bit*sampling_point); int tseg2 = quanta_per_bit-tseg1; parameters = CPC_GetInitParamsPtr(dev->handle); parameters->canparams.cc_type = SJA1000; parameters->canparams.cc_params.sja1000.btr0 = ((CAN_CPC_SYNC_JUMP_WIDTH-1) << 6)+(brp-1); parameters->canparams.cc_params.sja1000.btr1 = (CAN_CPC_TRIPLE_SAMPLING << 7)+((tseg2-1) << 4)+(tseg1-2); parameters->canparams.cc_params.sja1000.outp_contr = 0xda; parameters->canparams.cc_params.sja1000.acc_code0 = 0xff; parameters->canparams.cc_params.sja1000.acc_code1 = 0xff; parameters->canparams.cc_params.sja1000.acc_code2 = 0xff; parameters->canparams.cc_params.sja1000.acc_code3 = 0xff; parameters->canparams.cc_params.sja1000.acc_mask0 = 0xff; parameters->canparams.cc_params.sja1000.acc_mask1 = 0xff; parameters->canparams.cc_params.sja1000.acc_mask2 = 0xff; parameters->canparams.cc_params.sja1000.acc_mask3 = 0xff; parameters->canparams.cc_params.sja1000.mode = 0; if (CPC_CANInit(dev->handle, 0)) return CAN_CPC_ERROR_SETUP; dev->fd = CPC_GetFdByHandle(dev->handle); dev->bitrate = bitrate; dev->quanta_per_bit = quanta_per_bit; dev->sampling_point = sampling_point; dev->timeout = timeout; if (CPC_Control(dev->handle, CONTR_CAN_Message | CONTR_CONT_ON)) return CAN_CPC_ERROR_SETUP; return CAN_CPC_ERROR_NONE; }