www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MCP2515: Senden/Empfangen


Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Mahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: tüddel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da gibbet es doch schon sooooo viele hier im forum...
such doch mal ;-)

Autor: andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

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.