mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN-Bus MCP2515, Empfang bestimmter Identifier


Autor: Manuel(CAN-Anfänger) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

ich kommen nicht mehr weiter,...

Ich habe ein CAN-Netzwerk über den MCP2515 controller aufgebaut.

Es funktioniert bestens!(mit zwei knoten:)) Mit mehren klappt es nicht 
mehr ganz. Da alle knoten alles empfangen(mcp besitzt nur zwei buffer!). 
Dadurch sind die µC zu sehr belastet.

Ich habe mir zu diesem Thema das Tutorial " kreatives-chaos.com " 
angeschaut.
Erst mal ein dickes Lob, zu dieser Seite!

Es gibt ja die Möglichkeit der Nachrichtenfilterung über Identifier -- 
dies macht can gerade so attraktive.

Wie kann ich denn MCP miteilen, dass es nur Nachrichten mit dem 
identifier "12" empfangen soll, und alle anderen filtern.

Autor: Matthias R. (mnr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um dazu etwas sagen zu können, müßte man wissen:

1. Werden Extended oder Standard Id benutzt?
2. Sind die Buffer als Rollover definiert ?

Dazu solltest du mal das Datenblatt lesen, da steht das alles drin.

Autor: Manuel(CAN-Anfänger) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich ja 
gemacht!(http://www.reichelt.de/?SID=271@kAw6wQARsAAC4lyk44...)

Ich benutze std. ID.
Die Init(kreat. chaos) sieht folgendermaßen aus:
void init_mcp2515(void)
{
  // SPI Interface initialisieren
  spi_init();
  // MCP2515 per Software Reset zuruecksetzten,
  // danach ist der MCP2515 im Configuration Mode

  IOCLR1 |= SLAVE;//CHECK!!!!! in chaose
  spi_putc( SPI_RESET );
  IOSET1 |= SLAVE;

  /*
  * Einstellen des Bit Timings
  *
  * Fosc = 16MHz
  * BRP = 7 (teilen durch 8)
  * TQ = 2 * (BRP + 1) / Fosc (=> 1 uS)
  *
  * Sync Seg = 1TQ
  * Prop Seg = (PRSEG + 1) * TQ = 1 TQ
  * Phase Seg1 = (PHSEG1 + 1) * TQ = 3 TQ
  * Phase Seg2 = (PHSEG2 + 1) * TQ = 3 TQ
  *
  * Bus speed = 1 / (Total # of TQ) * TQ
  * = 1 / 8 * TQ = 125 kHz
  */
  // BRP = 7
  mcp2515_write_register( CNF1, (1<<BRP0)|(1<<BRP1)|(1<<BRP2) );
  // Prop Seg und Phase Seg1 einstellen
  mcp2515_write_register( CNF2, (1<<BTLMODE)|(1<<PHSEG11) );

  // Wake-up Filter deaktivieren, Phase Seg2 einstellen
  mcp2515_write_register( CNF3, (1<<PHSEG21) );
  // Aktivieren der Rx Buffer Interrupts
  mcp2515_write_register( CANINTE, (1<<RX1IE)|(1<<RX0IE) );
  /*
  * Einstellen der Filter
  */
  // Buffer 0 : Empfangen aller Nachrichten
  mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) );
  // 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 );
  /*
  * Einstellen der Pin Funktionen
  */
  // 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);
}


Ich habe versucht
mcp2515_write_register( RXM0SIDH, 0 );
durch
mcp2515_write_register( RXM0SIDH, 0x23 ); //für Id 23
ersetzen, ohne erfolg.

Autor: Manuel(CAN-Anfänger) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
kannst du mir bitte prinzipell sagen was ich in welchen Register 
schreiben muss damit ich nur Nachrichten mit einem speziellen Identifier 
empfangen kann?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe noch nie mit Filterung im CAN-Controller gearbeitet, und bis 
jetzt auch noch nicht die Notwendigkeit dafür gesehen - nice to have.
Ich betreibe die SPI mit 8MHz und lese für eine Botschaft 12Byte=96bit 
ein. Macht nach Adam Ries 12µs. Ein normaler Datenframe hat um die 
120bit (schwankt etwas je nach Anzahl der stuff-Bits) bei max. 1Mbit 
Busgeschwindigkeit, macht also 120µs. Also, selbst bei einem zu 100% 
vollgestopftem 1Mbit-Bus kostet dich die Kommunikation mit dem 
CAN-Controller 10% der Zeit.
Die folgende Auswahl mit einer case-Anweisung filtert dir ruckzuck die 
Identifier. Was nicht passt, wird weggeschmissen.
Dein Problem liegt ganz woanders.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
korrigiere mich, es sind ein paar Byte mehr auf der SPI. 18, wenn ich 
micht verzählt habe. Ändert aber nichts wesentliches.

Autor: Meister Eder (edson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

setze die Masken auf 0xFFFF und du empfängst nur die Nachrichten, welche 
über Filter freigegeben wurden.

Gruss,
Edson

Autor: mnr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kapitel 4.5.2 ist das, was du dir mal anschauen solltest, d.h. die Maske 
auf 0xff, und der dazugehörige Filter auf 0x12.

Weiterhin schaltest du mit
// Buffer 0 : Empfangen aller Nachrichten
  mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) );
die Filterung ab. Richtig wäre
// Buffer 0 : Empfangen mit Filterung
  mcp2515_write_register( RXB0CTRL, (1<<RXM0) );
(selbiges für RXB1CTRL).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.