Hallo, noch einmal eine kleine Verständnisfrage zum MCP2515: Eine Nachricht sollte doch wie folgt abgesendet werden koennen: SpiOn(); SpiWriteByte(0x02); // Schreib-Kommando SpiWriteByte(0x0F); // Can-Controlregister SpiWriteByte(0x08); // One-Shot-Modus, Normal-Modus SpiOff(); [...] SpiOn(); SpiWriteByte(0x02); // Schreib-Befehl SpiWriteByte(0x31); // Identifier0-High-Register SpiWriteByte(0xFF); // ID-High (0b11111111) SpiWriteByte(0xE0); // ID-Low (0b11100000), Standard-Identifier SpiOff(); SpiOn(); SpiWriteByte(0x02); // Schreib-Befehl SpiWriteByte(0x35); // Datenlaengen-Register0 SpiWriteByte(0x01); // Länge: 1 Byte SpiOff(); SpiOn(); SpiWriteByte(0x02); // Schreib-Befehl SpiWriteByte(0x36); // Daten-Register0 SpiWriteByte(0xAA); // Data: 0b10101010 SpiOff(); SpiOn(); SpiWriteByte(0x81); //Request-to-Send fuer Nachricht0 SpiOff(); Zum testweisen Empfangen sollte das hier ausreichen: SpiOn(); SpiWriteByte(0x02); // Schreib-Befehl SpiWriteByte(0x60); // Receiver0 einstellen SpiWriteByte(0x60); // Alle Nachrichten empfangen (keine Filter, keine Masken), kein Rollover SpiOff(); [selbstverstaendlich vor dem Request-to-Send oben] SpiOn(); SpiWriteByte(0x03); // Lese-Befehl SpiWriteByte(0x65); // RX0-Laengenregister temp1=SpiReadByte(); // Datenlänge auslesen SpiOff(); SpiOn(); SpiWriteByte(0x03); // Lese-Befehl SpiWriteByte(0x66); // RX0-Datenregister temp2=SpiReadByte(); // Datenbyte auslesen SpiOff(); [...] Jetzt zur Frage: Kann/muss/soll der Baustein auch die Daten empfangen, die er versendet? Wenn ja, dann habe ich hier ein Problem. Die empfangenen Daten stimmen leider nicht (Daten vorhanden, aber falsch). Im Sendepuffer kann ich sie auslesen, die sind korrekt. Kann das an der Hardware liegen? Ein 20cm-Bus ist angehaengt und terminiert. Eventuell spinnt der Treiberbaustein (PCA82C250)? Gibt's eine Möglichkeit,den ohne größe Hilfsmittel zu testen? Oder habe ich oben nur einen Denkfehler gemacht? Dankbar für Hinweise aller Art, Dirk
Autsch. Loopback-Mode heißt das Zauberwort, Register CANCTRL... Das habe ich jetzt etwa 20x überlesen, und 2 Minuten nach dem Posting gefunden -- wie immer. Na ja, vielleicht hilft's ja im Archiv dem nächsten "Blinden". Ein glücklich grüßender Dirk
Hallo Dirk, ich schon wieder, (...trotz meiner fehlenden Kenntnis zum MCP2515) Auf dem CAN wird die Botschaft, die du gesendet hast, nie vom Controller wieder empfangen. Er liest auf Bit-Ebene den BUS zurück, und kontrolliert anhand des ACK-Bit's ob mindestens einer da war der den Empfang verstanden hat, gleichzeitig überprüft er ob eine höher-priore Botschaft, die gesendete Boschaft überschrieben hat. In diesem Fall versucht er das Senden erneut, bis die Botschaft aus richtig übermittelt wurde. Tritt hierbei ein Problem auf zählt er intern einen Fehlerzähler hoch und bei Erreichen eines (meist) konfigurierbaren Zählerstandes geht er in den BUS-OFF Zustand. Das alles passiert jedoch auf Bitebene und ist (...ohne entsetzlich teuere Hilfsmittel) nicht von aussen sichtbar. Erkennen ob die Botschaft übertragen wurde kannst du an den entsprechenden Status-Registern. Es müsste eigentlich Bit's dafür geben, die besagen ob die Übertragung noch läuft und ob die Übertragung erfolgreich abgeschlossen ist. Das dein CAN etwas empfängt hört sich schon mal gut an. Gruss, Peter
Hallo Peter, dass normalerweise ein ACK kommen muss, hatte ich bereits mehrmals gelesen -- aber der sog. One-Shot-Modus des MCP hat mich da irritiert. Ich dachte, damit wäre das erledigt. Man sollte Datenblätter eben ganz genau lesen. Der Loopback-Modus funktioniert jetzt auch ganz prima. Am Wochenende wird hoffentlich das zweite Modul fertig, dann kann ich das ganze mal "real" austesten. Viele Grüße, Dirk
Guten Tag ! ich versuche nun schon seit tagen 2 mega8 + mcps miteinanden zum reden zu bekommen.. klappt aber irgendwie nciht.. könnte ihr vielleicht mal eueren kompletten code posten ? oder mail.. oder so senden + empfangen falls möglich ! vielen dank schonmal
da gibbet es doch schon sooooo viele hier im forum... such doch mal ;-)
ich habe schon jede menge gesucht den einzigen kompletten den ich gefunden habe ist für einen zum senden aber zum empfangen fing ich gar nix
emfangen ist simpel. 1. als erstes ließt du das CANINTF register aus. ist es gesetzt, wurde was empfangen. 2. CANINTF&0x03 und du erhälst den reciver, auf dem das frame empfangen wurde. ( vergleiche hierzu CANINTF&0x03 mit RX0IF (reciver 0) und RX1IF (reciver 1)) 3. du ließt die register der ID, extID, dlc, und die daten des ermittelten recivers aus. 4. CANINTF wieder 0x00 setzten, damit der reciver wieder freigegeben wird. ^^ so klappt es zumindest bei mir auf meinem msp430
Vielen vilen dank ! endlich einer der helfen kann + will.. habs jetzt am laufen nur noch problemem mit dem timing btw probleme mit dem resetten probiere uim moment erst mal nur mit einem mega 8 + mcp im loopback mode klappt auch schon fast. nur das der atmega 8 wohl manchmal zu schnell ist für den mcp und gehen die daten durcheinander.. brauche ich evnetuell irghendwo verzögerungschleifen zwischen spi init , mcp init (reset), und der datenübermittlung ? lasse das system über 2 quarze laufen.. der interne im atmega8 auf 8 mhz und der mcp mit nem externen 16 mhz ist das vielleicht das problem ?
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.