MCP2515 auf 100kbit/s Speed

Hi,

ich nutze aktuell die Sparkfun CAN Bus (Shield) Lib für einige Projekte. Die Lib bringt 125/250/500kbits Bus Geschwindigkeit mit, diese sind einfach definiert.

Jedoch benötige ich nun für ein Projekt 100kbits. Bei der Suche in der Lib findet man folgende Settings für die Baud:

spi_putc((1<<PHSEG21)); // Bitrate 250 kbps at 16 MHz
 spi_putc((1<<BTLMODE)|(1<<PHSEG11));
 //spi_putc(1<<BRP0);
    spi_putc(speed);

die var speed ist bei 125kbits = 7, bei 250kbits = 3 und bei 500kbits = 1

die komplette Funktion sieht wie folgt aus:

uint8_t mcp2515_init(uint8_t speed)
{
 
 
 SET(MCP2515_CS);
 SET_OUTPUT(MCP2515_CS);
 
 RESET(P_SCK);
 RESET(P_MOSI);
 RESET(P_MISO);
 
 SET_OUTPUT(P_SCK);
 SET_OUTPUT(P_MOSI);
 SET_INPUT(P_MISO);
 
 SET_INPUT(MCP2515_INT);
 SET(MCP2515_INT);
 
 // active SPI master interface
 SPCR = (1<<SPE)|(1<<MSTR) | (0<<SPR1)|(1<<SPR0);
 SPSR = 0;
 
 // reset MCP2515 by software reset.
 // After this he is in configuration mode.
 RESET(MCP2515_CS);
 spi_putc(SPI_RESET);
 SET(MCP2515_CS);
 
 // wait a little bit until the MCP2515 has restarted
 _delay_us(10);
 
 // load CNF1..3 Register
 RESET(MCP2515_CS);
 spi_putc(SPI_WRITE);
 spi_putc(CNF3);
 
/* spi_putc((1<<PHSEG21)); // Bitrate 125 kbps at 16 MHz
 spi_putc((1<<BTLMODE)|(1<<PHSEG11));
 spi_putc((1<<BRP2)|(1<<BRP1)|(1<<BRP0));
*/
/* 
 spi_putc((1<<PHSEG21)); // Bitrate 250 kbps at 16 MHz
 spi_putc((1<<BTLMODE)|(1<<PHSEG11));
 spi_putc((1<<BRP1)|(1<<BRP0));
*/ 
 spi_putc((1<<PHSEG21)); // Bitrate 250 kbps at 16 MHz
 spi_putc((1<<BTLMODE)|(1<<PHSEG11));
 //spi_putc(1<<BRP0);
    spi_putc(speed);

 // activate interrupts
 spi_putc((1<<RX1IE)|(1<<RX0IE));
 SET(MCP2515_CS);
 
 // test if we could read back the value => is the chip accessible?
 if (mcp2515_read_register(CNF1) != speed) {
 SET(LED2_HIGH);

 return false;
 }
 
 // deaktivate the RXnBF Pins (High Impedance State)
 mcp2515_write_register(BFPCTRL, 0);
 
 // set TXnRTS as inputs
 mcp2515_write_register(TXRTSCTRL, 0);
 
 // turn off filters => receive any message
 mcp2515_write_register(RXB0CTRL, (1<<RXM1)|(1<<RXM0));
 mcp2515_write_register(RXB1CTRL, (1<<RXM1)|(1<<RXM0));
 
 // reset device to normal mode
 mcp2515_write_register(CANCTRL, 0);
// SET(LED2_HIGH);
 return true;
}

Kann mir da jemand weiter helfen?

Ich weiß das ich die Register nun anders verschieben muss, es gibt Rechner im Netz die das ausrechnen jedoch komme ich nicht ganz klar dabei.

Ich habe die Bibliothek mcp_can verwendet, die diese Geschwindigkeit anbietet. Verwendete Werte, wobei es sich um CNF1 bis CNF3 handeln sollte:

CFG1 0x44
CFG2 0xE5
CFG3 0x83

Die Werte werden wegen der Adresse in der Reihenfolge CNF3 - CNF2 - CNF1 übertragen.

Ohne Gewähr!