Ejemplo n.º 1
0
// -----------------------------------------------------------------------------
void mcp2515_regdump(void)
{
	uint8_t mode = mcp2515_read_register( CANSTAT );
	
	// change to configuration mode
	mcp2515_change_operation_mode( (1<<REQOP2) );
	
	printf_P("MCP2515 Regdump:\n");
	uint8_t i;
	for (i=0; i < 16; i++) {
		printf_P("%3i: %02x   ", i, mcp2515_read_register(i));
		printf_P("%3i: %02x   ", i+16*1, mcp2515_read_register(i+16*1));
		printf_P("%3i: %02x   ", i+16*2, mcp2515_read_register(i+16*2));
		printf_P("%3i: %02x   ", i+16*3, mcp2515_read_register(i+16*3));
		printf_P("%3i: %02x   ", i+16*4, mcp2515_read_register(i+16*4));
		printf_P("%3i: %02x   ", i+16*5, mcp2515_read_register(i+16*5));
		printf_P("%3i: %02x   ", i+16*6, mcp2515_read_register(i+16*6));
		printf_P("%3i: %02x\n", i+16*7, mcp2515_read_register(i+16*7));
	}
	
	mcp2515_change_operation_mode( mode );
}
uint8_t mcp2515_get_filter(uint8_t number, can_filter_t *filter)
{
	uint8_t mask_address;
	uint8_t filter_address;
	uint8_t temp;
	uint8_t mode = mcp2515_read_register(CANSTAT);
	
	if (number > 5)
		return 0;
	
	// change to configuration mode
	mcp2515_change_operation_mode( (1<<REQOP2) );
	
	if (number <= 1)
	{
		mask_address = RXM0SIDH;
		temp = mcp2515_read_register(RXB0CTRL);
	}
	else
	{
		mask_address = RXM1SIDH;
		temp = mcp2515_read_register(RXB1CTRL);
	}
	
	temp &= (1<<RXM1)|(1<<RXM0);
	
	if (temp == 0) {
		// filter and masks are disabled
		#if SUPPORT_EXTENDED_CANID
		filter->flags.extended = 0;
		#endif
		filter->flags.rtr = 0;
		filter->mask = 0;
		filter->id = 0;
		
		return 1;
	}
	
	#if SUPPORT_EXTENDED_CANID
	// transform bits so that they match the format from can.h
	temp >>= 5;
	temp = ~temp;
	if (temp & 1) temp = 0x3;
	
	filter->flags.extended = temp;
	#endif
	
	// read mask
	RESET(MCP2515_CS);
	spi_putc(SPI_READ);
	spi_putc(mask_address);
	mcp2515_read_id(&filter->mask);
	SET(MCP2515_CS);
	
	if (number <= 2)
	{
		filter_address = RXF0SIDH + number * 4;
	}
	else
	{
		filter_address = RXF3SIDH + (number - 3) * 4;
	}
	
	// read filter
	RESET(MCP2515_CS);
	spi_putc(SPI_READ);
	spi_putc(filter_address);
	mcp2515_read_id(&filter->id);
	SET(MCP2515_CS);
	
	// restore previous mode
	mcp2515_change_operation_mode( mode );
	
	return 1;
}
Ejemplo n.º 3
0
bool mcp2515_set_filter(uint8_t number, const can_filter_t *filter)
{
	uint8_t mask_address = 0;
	uint8_t mode = mcp2515_read_register(CANSTAT);
	
	if (number > 5)
		return false;
	
	// change to configuration mode
	mcp2515_change_operation_mode( (1<<REQOP2) );
	
	// set filter mask
	if (number == 0)
	{
		mask_address = RXM0SIDH;
		
		#if SUPPORT_EXTENDED_CANID
			if (filter->flags.extended == 0x3) {
				// only extended identifier
				mcp2515_write_register(RXB0CTRL, (1<<RXM1));
			}
			else if (filter->flags.extended == 0x2) {
				// only standard identifier
				mcp2515_write_register(RXB0CTRL, (1<<RXM0));
			}
			else {
				// receive all messages
				mcp2515_write_register(RXB0CTRL, 0);
			}
		#else
			// Buffer 0: Empfangen aller Nachrichten mit Standard Identifier 
			// die den Filter Kriterien gengen
			mcp2515_write_register(RXB0CTRL, (1<<RXM0));
		#endif
	}
	else if (number == 2)
	{
		mask_address = RXM1SIDH;
		
		#if SUPPORT_EXTENDED_CANID
			if (filter->flags.extended == 0x3) {
				// only extended identifier
				mcp2515_write_register(RXB1CTRL, (1<<RXM1));
			}
			else if (filter->flags.extended == 0x2) {
				// only standard identifier
				mcp2515_write_register(RXB1CTRL, (1<<RXM0));
			}
			else {
				mcp2515_write_register(RXB1CTRL, 0);
			}
		#else
			// Buffer 1: Empfangen aller Nachrichten mit Standard Identifier 
			// die den Filter Kriterien gengen
			mcp2515_write_register(RXB1CTRL, (1<<RXM0));
		#endif
	}
	
	if (mask_address)
	{
		RESET(MCP2515_CS);
		spi_putc(SPI_WRITE);
		spi_putc(mask_address);
		#if SUPPORT_EXTENDED_CANID
			mcp2515_write_id(&filter->mask, (filter->flags.extended == 0x2) ? 0 : 1);
		#else
			mcp2515_write_id(&filter->mask);
		#endif
		SET(MCP2515_CS);
		
		_delay_us(1);
	}
	
	// write filter
	uint8_t filter_address;
	if (number >= 3) {
		number -= 3;
		filter_address = RXF3SIDH;
	}
	else {
		filter_address = RXF0SIDH;
	}
	
	RESET(MCP2515_CS);
	spi_putc(SPI_WRITE);
	spi_putc(filter_address | (number * 4));
	#if SUPPORT_EXTENDED_CANID
		mcp2515_write_id(&filter->id, (filter->flags.extended == 0x2) ? 0 : 1);
	#else
		mcp2515_write_id(&filter->id);
	#endif
	SET(MCP2515_CS);
	
	_delay_us(1);
	
	// restore previous mode
	mcp2515_change_operation_mode( mode );
	
	return true;
}
Ejemplo n.º 4
0
uint8_t mcp2515_set_filter(uint8_t number, const can_filter_t *filter)
{
	uint8_t mask_address = 0;
	
	if (number > 5)
		return false;
	
	// Konfiguration einschalten
	mcp2515_change_operation_mode( (1<<REQOP2) );
	
	// Filtermaske setzen
	if (number == 0)
	{
		mask_address = RXM0SIDH;	
	}
	else if (number == 2)
	{
		mask_address = RXM1SIDH;
	}
	
	if (mask_address)
	{
		RESET(MCP2515_CS);
		spi_putc(SPI_WRITE);
		spi_putc(mask_address);
		mcp2515_write_id(&filter->mask);

		asm volatile ("nop");
		asm volatile ("nop");
		
		SET(MCP2515_CS);
		
		asm volatile ("nop");
		asm volatile ("nop");

	}
	
	// Filter setzen
	uint8_t filter_address;
	if (number >= 3) {
		number -= 3;
		filter_address = RXF3SIDH;
	}
	else {
		filter_address = RXF0SIDH;
	}
	
	RESET(MCP2515_CS);
	spi_putc(SPI_WRITE);
	spi_putc(filter_address | (number * 4));
	mcp2515_write_id(&filter->id);

	asm volatile ("nop");
	asm volatile ("nop");

	SET(MCP2515_CS);
	
	asm volatile ("nop");
	asm volatile ("nop");

	if (number == 0)
	{
		mcp2515_write_register(RXB0CTRL, (1<<RXM1));
	} 
	else if (number==2)
	{
		mcp2515_write_register(RXB1CTRL, (1<<RXM1));
	} ;
	
	// zurueck zum normalen modus
	mcp2515_write_register(CANCTRL, 0);
	
	return true;
}