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);
}
Lesezeichen