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







Zitieren

Lesezeichen