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.
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.
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.
Hi, kannst du mir bitte prinzipell sagen was ich in welchen Register schreiben muss damit ich nur Nachrichten mit einem speziellen Identifier empfangen kann?
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.
korrigiere mich, es sind ein paar Byte mehr auf der SPI. 18, wenn ich micht verzählt habe. Ändert aber nichts wesentliches.
Hallo, setze die Masken auf 0xFFFF und du empfängst nur die Nachrichten, welche über Filter freigegeben wurden. Gruss, Edson
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.