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