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


von Manuel(CAN-Anfänger) (Gast)


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.

von Matthias R. (mnr)


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.

von Manuel(CAN-Anfänger) (Gast)


Lesenswert?

Habe ich ja 
gemacht!(http://www.reichelt.de/?SID=271@kAw6wQARsAAC4lyk44b391a12984a7073b5c0c727d82961f2;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A200%252FMCP2515%2523microchip.pdf)

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.

von Manuel(CAN-Anfänger) (Gast)


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?

von crazy horse (Gast)


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.

von crazy horse (Gast)


Lesenswert?

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

von Meister E. (edson)


Lesenswert?

Hallo,

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

Gruss,
Edson

von mnr (Gast)


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
1
// Buffer 0 : Empfangen aller Nachrichten
2
  mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) );
die Filterung ab. Richtig wäre
1
// Buffer 0 : Empfangen mit Filterung
2
  mcp2515_write_register( RXB0CTRL, (1<<RXM0) );
(selbiges für RXB1CTRL).

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.