Forum: Mikrocontroller und Digitale Elektronik MCP2515 behebn von Buffer0 Overflow


von Andreas H. (andy78)


Lesenswert?

Hallo

Habe eine Displayeinheit wo die Daten von 6 Knoten ausgwertet werden.
Habe aber das problem das ich beim Auslesen des Registers 0x2d immer das 
Bit 6 RX0OVR aktiv ist ich setzte es zurück und bekomme immer wieder 
einen Overflow auf Buffer0

obwohl ich nurch setzten des Bits BULK=1 den MCP sage das wenn Buffer0 
voll ist auf Buffer 1 zugeriffen wird.

Der Code ist von hier
http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515

wie kann man den Buffer0 Overflow beseitigen.
Bus läuft mit 250kbit.

MCP alle mit 16Mhz SPI Takt 8Mhz.


void mcp2515_init(void)
{


    // MCP2515 per Software Reset zuruecksetzten,
    // danach ist der MCP2515 im Configuration Mode
    CAN_cs_low();
    spi_putc( SPI_RESET );
    _delay_ms(1);
    CAN_cs_high();
    // etwas warten bis sich der MCP2515 zurueckgesetzt hat
    _delay_ms(10);



    mcp2515_write_register( CNF1, 0x01 );

    mcp2515_write_register( CNF2, 0xB8);

    mcp2515_write_register( CNF3, 0x05 );


    mcp2515_write_register( CANINTE, (1<<RX1IE)|(1<<RX0IE) );




    // Buffer 0 : Empfangen aller Nachrichten
    mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0)|(1<<BUKT) );

    // Buffer 1 : Empfangen aller Nachrichten
    mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0) );

    // Alle Bits der Empfangsmaske loeschen,
    // damit werden alle Nachrichten empfangen
    mcp2515_write_register( RXM0SIDH, 0 );
    mcp2515_write_register( RXM0SIDL, 0 );
    mcp2515_write_register( RXM0EID8, 0 );
    mcp2515_write_register( RXM0EID0, 0 );

    mcp2515_write_register( RXM1SIDH, 0 );
    mcp2515_write_register( RXM1SIDL, 0 );
    mcp2515_write_register( RXM1EID8, 0 );
    mcp2515_write_register( RXM1EID0, 0 );


    // Deaktivieren der Pins RXnBF Pins (High Impedance State)
    mcp2515_write_register( BFPCTRL, 0 );

    // TXnRTS Bits als Inputs schalten
    mcp2515_write_register( TXRTSCTRL, 0 );

    // Device zurueck in den normalen Modus versetzten
    mcp2515_bit_modify( CANCTRL, 0xE0, 0);

}


Danke

Gruß

ANdy

von Andreas H. (andy78)


Lesenswert?

Hallo

Ich habe mal eine Frage zur realisierung der Interrupt abfrage vom MCP

Momentan mache ich dies in der Hauptschleife mit abfrage ob INT Pin high 
oder low.

habe mir gedacht ich frage den mcp int pin in der Hauptschleife 3x ab 
und ich bekomme jetzt pro minute 150 overflows statt vorher in der 
minute >1500.

Ist es noch besser den Interrupt pin des AVR zu benutzen um die 
Hauptschleife zu un terbrechen????

Ich merke jetzt schon das die anzeigen flüssiger und sofort reagieren 
wie z.b Tankanzeige und Batteriespannungsanzeige da hat man vorher 2sek 
geartet bis was kommt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.