Forum: Mikrocontroller und Digitale Elektronik MCP2515: Senden/Empfangen


von Dirk Wiebel (Gast)


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

von Dirk Wiebel (Gast)


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

von Peter Mahler (Gast)


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

von Dirk Wiebel (Gast)


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

von andre (Gast)


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

von tüddel (Gast)


Lesenswert?

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

von andre (Gast)


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

von KoF (Gast)


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

von andre (Gast)


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 ?

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.