int can_setup(int baudrate) { spi__init(); mcp2515_reset(); /* Wait until reset finishes. */ int count = 100; while (1) { if (get_mode() == REQOP_CONFIG) { break; } else { udelay(1); count--; } if (count <= 0) { printf("CAN controller not responding. Check daughter board connection!\n"); return -1; } } set_baudrate(baudrate); enable_intrrupt(); set_mode(REQOP_NORMAL); return 0; }
void mcp2515_init(){ char status; spi_init(); mcp2515_reset(); status = mcp2515_read_status(); if ((status & MODE_MASK) != MODE_CONFIG) { printf("MCP2515 is not in config mode!\n"); } }
int can_tx_setup(int baudrate) { mcp2515_reset(); /* Wait until reset finishes. */ while (1) { if (get_mode() == REQOP_CONFIG) { break; } } set_baudrate(baudrate); enable_intrrupt(); enable_rollover(); set_rx_mode(0, RXM_ANY); set_mode(REQOP_NORMAL); return 0; }
/********************************************************************************************************* ** Function name: mcp2515_init ** Descriptions: init the device *********************************************************************************************************/ INT8U MCP_CAN::mcp2515_init(const INT8U canSpeed, const INT8U clock) /* mcp2515init */ { INT8U res; mcp2515_reset(); res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); if (res > 0) { #if DEBUG_MODE Serial.print("Enter setting mode fall\r\n"); #endif return res; } #if DEBUG_MODE Serial.print("Enter setting mode success \r\n"); #endif /* set boadrate */ if (mcp2515_configRate(canSpeed, clock)) { #if DEBUG_MODE Serial.print("set rate fall!!\r\n"); #endif return res; } #if DEBUG_MODE Serial.print("set rate success!!\r\n"); #endif if (res == MCP2515_OK) { /* init canbuffers */ mcp2515_initCANBuffers(); /* interrupt mode */ mcp2515_setRegister(MCP_CANINTE, MCP_RX0IF | MCP_RX1IF); #if (DEBUG_RXANY==1) /* enable both receive-buffers */ /* to receive any message */ /* and enable rollover */ mcp2515_modifyRegister(MCP_RXB0CTRL, MCP_RXB_RX_MASK | MCP_RXB_BUKT_MASK, MCP_RXB_RX_ANY | MCP_RXB_BUKT_MASK); mcp2515_modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, MCP_RXB_RX_ANY); #else /* enable both receive-buffers */ /* to receive messages */ /* with std. and ext. identifie */ /* rs */ /* and enable rollover */ mcp2515_modifyRegister(MCP_RXB0CTRL, MCP_RXB_RX_MASK | MCP_RXB_BUKT_MASK, MCP_RXB_RX_STDEXT | MCP_RXB_BUKT_MASK); mcp2515_modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, MCP_RXB_RX_STDEXT); #endif /* enter normal mode */ res = mcp2515_setCANCTRL_Mode(MODE_NORMAL); if (res) { #if DEBUG_MODE Serial.print("Enter Normal Mode Fall!!\r\n"); #endif return res; } #if DEBUG_MODE Serial.print("Enter Normal Mode Success!!\r\n"); #endif } return res; }
void CAN_init(){ clear_bit(INTERRUPT_DDR, INTERRUPT_BIT); //Input on the interrupt pin uint8_t value; SPI_init(); // Initialize SPI mcp2515_reset(); // Send reset-command _delay_us(20); // Self-test value = mcp2515_read(MCP_CANSTAT); if ((value & MODE_MASK) != MODE_CONFIG) { puts("MCP2515 is NOT in configuration mode after reset!\n"); } //Sets up RXBOCTRL //RXM = 01, activate filter, only short ID mcp2515_bit_modify(MCP_RXB0CTRL, MCP_RXB0RXM_MASK, 1 << 5); //BUKT: 1 -> transfers to RXB1 when RXB0 is full mcp2515_bit_modify(MCP_RXB0CTRL, MCP_RXB0BUKT_MASK, 1 << 2); //RXB1CTRL //RXM = 01, activate filter, only short ID mcp2515_bit_modify(MCP_RXB1CTRL, MCP_RXB1RXM_MASK, 1 << 5); //Set interrupt enable //MERRE = 0 Message error interrupt //WAKIE = 0 (We dont use sleep) //ERRIE = 1 Error interrupt //TX2IE = 0 Transmit 2 empty interrupt //TX1IE = 0 Transmit 1 empty interrupt //TX0IE = 0 Transmit 0 empty interrupt //RX1IE = 1 Interrupt when there is data RX1 //RX0IE = 1 Interrupt when there is data RX2 mcp2515_write(MCP_CANINTE, 0b00000011); //Filters: //Mask for RX0 mcp2515_write(MCP_RXM0SIDH, NODE2_CANID_H_MASK >> 3); mcp2515_bit_modify(MCP_RXM0SIDL, 0b11100000U, NODE2_CANID_H_MASK << 5); //Mask for RX1 mcp2515_write(MCP_RXM1SIDH, NODE2_CANID_L_MASK >> 3); mcp2515_bit_modify(MCP_RXM1SIDL, 0b11100000U, NODE2_CANID_L_MASK << 5); //Filter 0 (RX0, goes to RX1 if RX0 is full) mcp2515_write(MCP_RXF0SIDH, NODE2_CANID_HIGHPRIO_0 >> 3); mcp2515_bit_modify(MCP_RXF0SIDL, 0b11100000U, NODE2_CANID_HIGHPRIO_0 << 5); //Filter 1 (RX0, goes to RX1 if RX0 is full) mcp2515_write(MCP_RXF1SIDH, NODE2_CANID_HIGHPRIO_1 >> 3); mcp2515_bit_modify(MCP_RXF1SIDL, 0b11100000U, NODE2_CANID_HIGHPRIO_1 << 5); //Filter 2 (RX1) mcp2515_write(MCP_RXF2SIDH, NODE2_CANID_0 >> 3); mcp2515_bit_modify(MCP_RXF2SIDL, 0b11100000U, NODE2_CANID_0 << 5); //Filter 3 (RX1) mcp2515_write(MCP_RXF3SIDH, NODE2_CANID_1 >> 3); mcp2515_bit_modify(MCP_RXF3SIDL, 0b11100000U, NODE2_CANID_1 << 5); //Filter 4 (RX1) mcp2515_write(MCP_RXF4SIDH, NODE2_CANID_2 >> 3); mcp2515_bit_modify(MCP_RXF4SIDL, 0b11100000U, NODE2_CANID_2 << 5); //Filter 5 (RX1) mcp2515_write(MCP_RXF5SIDH, NODE2_CANID_3 >> 3); mcp2515_bit_modify(MCP_RXF5SIDL, 0b11100000U, NODE2_CANID_3 << 5); CAN_all_int_clear(); mcp2515_bit_modify(MCP_CANCTRL, MODE_MASK, MODE_NORMAL); }