Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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");
	}
	
	
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
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;

}
Exemplo n.º 5
0
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);
}