Hallo,

Was haltet Ihr von dieser Transmit-Funktion?
Mit Autosuche nach einem freien Transmit-Puffer,
Priorität einstellbar,
Remotetransmit einschaltbar,
11Bit Standart Identifyer,
16Bit Extended identifyer, ( wer hier die 18 Bit haben will, muss sich halt das nötige daruproggen, aber ich denke kaum dass von uns jemand überhaupt einen Extended identifyer braucht )
8-DatenBytes

Bitte Verbessert mich!

Code:
// CAN-Sendefunktion:              Priorität|      Remote|          SID|          EID|        Daten|     Datenlänge|
// 						                 0-3|         0-1|      11 Bits|      16 Bits|     1-8Stück|    =Anz. Daten|
void mcp2515_can_transmit(uint8_t prioritiy, uint8_t rtr, uint16_t sid, uint16_t eid, uint8_t data, uint8_t length)
{

//|========================= Freien Sendepuffer suchen ========================|
	uint8_t buffer[4];

	buffer[0] = mcp2515_read_register(0x30);
	buffer[1] = mcp2515_read_register(0x40);
	buffer[2] = mcp2515_read_register(0x50);

	if ( buffer[2] !& (1<<TXREQ) ){ buffer[3] = 0x50; }
	if ( buffer[1] !& (1<<TXREQ) ){ buffer[3] = 0x40; }
	if ( buffer[0] !& (1<<TXREQ) ){ buffer[3] = 0x30; }
	

//|============================= Bytes vorbereiten ============================|
	uint8_t x[6];

	// Byte für TXBnCTRL vorbereiten, Datasheet S.18, TRANSMIT BUFFER n CONTROL REGISTER
	if(priority > 3){ priority = 3; }
	x[0] = ( priority );

	// Byte für TXBnSIDH vorbereiten, Datasheet S.19, TRANSMIT BUFFER n STANDARD IDENTIFIER HIGH
	x[1] = ( sid >> 3 );
	
	// Byte für TXBnSIDL vorbereiten, Datasheet S.20, TRANSMIT BUFFER n STANDARD IDENTIFIER LOW
	if(eid){ x[2] = ( 5 << sid ) + 0b00001000; }
	   else{ x[2] = ( 5 << sid ); }
	
	// Byte für TXBnEID8 vorbereiten, Datasheet S.20, TRANSMIT BUFFER n EXTENDED IDENTIFIER HIGH
	x[3] = ( eid >> 8 );

	// Byte für TXBnEID0 vorbereiten, Datasheet S.20, TRANSMIT BUFFER n EXTENDED IDENTIFIER LOW
	x[4] = ( eid );

	// Byte für TXBnDLC  vorbereiten, Datasheet S.21, TRANSMIT BUFFER n DATA LENGTH CODE
	if(length > 8){ length = 8; }
	if(RTR){ x[5] = length + 0b01000000; }
	   else{ x[5] = length; }	


//|============================= Bytes übertragen =============================|

	PORTB &= ~(1<<SPI_CS); 	// CS low
	
	spi_putc(SPI_WRITE);		// Write condition
	
	spi_putc(buffer[3]);		// TXBnCTRL von Puffer n adressieren
	
	spi_putc(x[0]);				// in TXBnCTRL schreiben, Datasheet S.18, TRANSMIT BUFFER n CONTROL REGISTER 
	
	spi_putc(x[1]);				// in TXBnSIDH schreiben, Datasheet S.19, TRANSMIT BUFFER n STANDARD IDENTIFIER HIGH
	
	spi_putc(x[2]);				// in TXBnSIDL schreiben, Datasheet S.20, TRANSMIT BUFFER n STANDARD IDENTIFIER LOW
	
	spi_putc(x[3]);				// in TXBnEID8 schreiben, Datasheet S.20, TRANSMIT BUFFER n EXTENDED IDENTIFIER HIGH
	
	spi_putc(x[4]);				// in TXBnEID0 schreiben, Datasheet S.20, TRANSMIT BUFFER n EXTENDED IDENTIFIER LOW
	
	spi_putc(x[5]);				// in TXBnDLC  schreiben, Datasheet S.21, TRANSMIT BUFFER n DATA LENGTH CODE

	while(length > 1){			// in TXBnDm   schreiben, Datasheet S.21, TRANSMIT BUFFER n DATA BYTE m
		spi_putc(*data++);
		length--;
	}

	PORTB |= (1<<SPI_CS);		// CS high


//|=========================== Übertragung Starten ============================|

	// TXREQ setzen, um Transmission zu starten
	mcp2515_bit_modify(buffer[3], TXREQ, TXREQ);  

}