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
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 ?