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







Zitieren

Lesezeichen