Hallo,

Ich hab mich ja ziemlich mit dem CAN-BUS nun beschäftigt und hab wieder ein Codeschnipsel für euch.

Mit diesem gelingt es ganz schnell einen freien TX-Buffer automatisch suchen zu lassen.

Lasst euch aber von "sender" und "befehl" nicht verwirren. Aus diesen beiden setzt sich in meinen CAN-Systemen der Identifyer zusammen...

Code:
uint8_t MCP2515_status( void ){
	uint8_t status;
	SPI_cs_low();
	SPI_master_transmit( 0b10100000 );		// Read Status ( S.64 bzw. S.67 )
	status = SPI_master_transmit( 0xFF );
	SPI_cs_high();
	return status;
}


void CAN_transmit( uint8_t sender, uint8_t befehl, uint8_t rtr, uint8_t dlc, uint8_t *data ){
	
	uint8_t status = MCP2515_status();
	uint8_t buffer;
	
	if( !(status & (1<<6)) ){ buffer = 0b01000100; }	// TXB2CTRL.TXREQ
	if( !(status & (1<<4)) ){ buffer = 0b01000010; }	// TXB1CTRL.TXREQ
	if( !(status & (1<<2)) ){ buffer = 0b01000000; }	// TXB0CTRL.TXREQ
	
	uint8_t i = 0;
	
	SPI_cs_low();
	SPI_master_transmit( buffer );
	SPI_master_transmit( (sender<<3) + (befehl>>3) );
	SPI_master_transmit( (befehl<<5) );
	SPI_master_transmit( 0x00 );
	SPI_master_transmit( 0x00 );
	SPI_master_transmit( (rtr<<6) + (dlc) );
	
	while( i<dlc ){	
		SPI_master_transmit( data[i] );
		i++;
	}

	SPI_cs_high();	
	
	switch (buffer){
		case 0b01000000:	MCP2515_bit_modify( TXB0CTRL, (1<<TXREQ), 0xFF ); break;
		case 0b01000010:	MCP2515_bit_modify( TXB1CTRL, (1<<TXREQ), 0xFF ); break;
		case 0b01000100:	MCP2515_bit_modify( TXB2CTRL, (1<<TXREQ), 0xFF ); break;
	}	
	
}