Hallo, ich habe schon paar Mal gelesen, dass es "1-byte-Befehle" zum Auslesen gibt. Was ist das, und wie funktioniert das? Konnte im DB dazu Nichts finden. Danke
Nun, Du sendest an den MCP2515 0x90, 0x92, 0x94, 0x96 und dann bei den Befehlen 0x92 und 0x94 dann 8 mal eine Null, weil der Controller sonst nichts sendet. Dann gibt er die Daten der Messageboxen aus. Und setzt das Interruptflag automatisch zurück! Bei den anderen Befehlen muß man 13 Bytes senden (man kann auch was anderes senden, da es eh ignoriert wird.) Dann erhält man neben den CAN-Daten noch die DLC und die empfangene CAN-ID Tag. Mit dem ATmega1280 / 16mhz und 8 mhz-SPI-Taktrate brauche ich ca 40 µs, um 13-Bytes auszulesen. Das ist kürzer als eine 1MBaud-Nachricht mit 8 Datenbytes lang ist. Ich empfehle, die Interruptleitung der RXB0 und RXB1 an entsprechende externe Interrupts anzuschließen. Dann entfällt das Auslesen des CANINTF - Registers um herauszufinden, welche Box entleert werden möchte. Viel Erfolg
Danke schön. Gibt es noch andere Quellen zum Nachlesen? Mir ist noch nicht ganz klar, wie das funktioniert. Dann werde ich selbst nachlesen, um Euch nicht zu nerven. Gruss
Wie kommst du auf 0x90, 0x92, 0x94, 0x96? Und wie muss ich die Daten empfangen? Aktuelle mache ich das so, dass ich beim Interrupt den RXB0 komplett auslese. Und das dauert mir zu lange. Gruss
Also, angenommen ich möchte den RXB0 auslesen. Dann schicke ich 0x92 (an welche adresse?) Dann schicke 0000 0000 ? wohin? Sorry, komme da nicht ganz mit. Gruss
Hi. Wenn ich das richtig sehe, musst du 0x92 an Adresse 0x66 senden. Dann gleich hinterher auch an die 0x66 acht Mal die 0 senden, damit der MCP2515 was rausschickt. Was ich mich frage, wie soll ich das empfangen? Wenn ich zum Beispiel RXB0D0 auslese, dann weiss ich ja was ich da habe und kann mit Wert1 = Canin den D0 speichern. Schliesse mich der Frage also an. Gruss Alex S.
Hi, Alex klingt logisch mit 0x66 als Adresse. @cskulkw Kannst du das bestätigen? Wie sehen die zu erwartenden Daten aus? so z.B. : A1 12 4C......? Danke Gruss
Wenn du den gesamten RX0 Buffer lesen willst, schickst du 0x90 und dann taktest du mittels Clock so lange bis du alle gewünschten Byte hast, der MCP2515 beginnt mit dem Inhalt der Adresse 0x61 und schickt dir Byte für Byte. Wenn du den gesamten Buffer gelesen hast, dann wird der Interrupt gelöscht. Christian
Habe ich das richtig verstanden? Wenn ich byte0-7 vom RXB0 auslesen will, dann schicke ich per SPI 0x92 und dann schicke ich ein 0 (wegen clock). I n der zeit bekomme ich einen Wert. Diesen kann ich speichern und dann noch ein 0 schicken damit byte1 rüber kommt usw. Richtig? Danke Gruss Alex
@ Alex S. (dj_beat) >Wenn ich byte0-7 vom RXB0 auslesen will, dann schicke ich per SPI 0x92 >und dann schicke ich ein 0 (wegen clock). Sicher. SPI überträgt immer zwei Bytes parallel, eins in Senderichtung und eins in Leserichtung. Wenn man nur lesen will, muss man einen beliebigen Wert, meist Null, senden. MfG Falk
Christoph schrieb: > Hi, Alex > > klingt logisch mit 0x66 als Adresse. > > > > @cskulkw > > Kannst du das bestätigen? > > Wie sehen die zu erwartenden Daten aus? > > so z.B. : A1 12 4C......? > > > > Danke > > Gruss Nein, kann ich nicht bestätigen. Also, ihr habt es ja herausgefunden, oder? Ansonsten könnt ihr Euch den Screenshot noch einmal anschauen. Man muß bei den 1-Byte-Befehlen nicht an oder in irgendeine Adreese des Controler schreiben. Der Befehl selbst veranlaßt den Controler, die mit ihr verbundene Aktion durchzuführen. Bei 0x90 an den MCP gesendet, stellt dieser seinen Registerzeiger auf die Adresse 0x61 (entspricht dem Datenregister RXB0SIDH) von sich aus ein und wenn Du die Clockleitung spielen läßt, dann schiebt er den Inhalt von 0x61 auf den SPI-Bus raus. nach weiteren 8 Clocksignalen den Inhalt von 0x62 usw. Und wenn Du das SPI-Interface Deines Mikrokontrolers benutzt und dieser als Master konfiguriert ist, dann kann die SCLK-Leitung in der Regel nur dann Takten, wenn das SPI-Datenregister beschrieben worden ist. (Bei ColdFire, AVR und AVR32) ist das so. Bei den anderen kenne ich mich nicht aus. Vielleicht gibt es da ja die Möglichkeit den Clock unabhängig vom SPI-Datenregister takten zu lassen. Deshalb habe ich aus Programmierersicht empfohlen 8 bzw. 13 Null-Bytes (oder was auch immer) zu schreiben. Dabei ist dann zu berücksichtigen, dass nach einem geschriebenen Byte, man die Empfangsdaten aus dem SPI-Datenempfangsregister ausliest und entsprechend geeignet für die Weiterverarbeitung speichert. Sorry jungs ich konnte leider nicht früher antworten. Erfolg brauche ich dann ja nicht mehr wünschen, da er offensichtlich eingetreten ist.
Ja, ich habe es so wie du sagst zum Laufen bekommen. Hast du beim Auslesen irgendwo Pausen zwischen? Bei mir läuft das so: CS auf low Spi ausgabe &H92 Spi ausgabe &H0 warten 10µs Byte0 = Spi empfangen ... CS auf high Muss ich zwischen meinem gesendeten 0 und Datenempfang warten? Ich stelle mit das so vor, dass der MCP noch etwas Zeit zum reagieren braucht. Danke Gruss Alex S.
Pausen sind nur beim Senden auf der gleichen TX-Box erforderlich. Solange die Messagebox sendet sind die Register gegen das Beschreiben geschützt. hat mich ein graues Haar gekostet. Bei Lesen gibt es keine notwendigkeit irgendwie zu warten. Mit dem SPI ist man schneller als ein Datenframe bei DLC = 0 @ 1MBaud. ...
Ich habe ein kleines aber komisches Phänomen Jede Nachricht, die ich absende ist numeriert. Manchmal werden die Nachrichten nicht verschickt. Anhang der Numerierung kann man sehen, dass was fehlt. Von ablauf her sieht das so aus: nachricht im unterprogramm numerieren nachricht absenden Meine SPI Leitungen sehen so aus: siehe Anhang Kann das sein, dass es daran liegt? Oder was kann noch das Problem sein? Möchte hier kein Quellcode posten, bitte um Verständnis. Gruss Alex
Was vielleicht noch wichtig ist: Ich versuche mich in ein funktionierendes Can-Bus System zu integrieren. Was macht der MCP2515, wenn gerade ein Knoten mit höherer Priorität sendet? Wartet er solange, bis der Andere fertig ist, oder verwirft er die Can-Nachricht? Wenn er die Nachricht verwirft, dann kann es Einiges erklären. Und noch was. Der m32 arbeitet mit 16Mhz. Die SPI-Rate ist 1/16 vom Quarztakt. Also 1Mhz über mein Flachbandkabel, der erwas verdreht ist und ca. 6 cm lang ist. Kann das funktionieren? Gruss Alex S.
Wenn 2 Teilnehmer gleichzeitig senden wollen Teilnehmer 1: 11010100 Teilnehmer 2: 11010101 Teilnehmer 1 "gewinnt" weil er eine 0 hat, und kann die Übertragung fortsetzen. Der Teilnehmer 2 sendet mit dem MCP2515 und muss die Übertragung abbrechen, weil Teilnehmer 1 ja schon weiter sendet. Wird der MCP die Übertragung noch mal versuchen, oder ist die Nachricht quasi as nicht erfolgreich abgehackt und geht somit verloren? Register CANCTRL bit3 ist auf 1 Danke Gruss Alex S.
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.