Forum: Mikrocontroller und Digitale Elektronik MCP2515 Befehl


von Christoph (Gast)


Lesenswert?

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

von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

Seite 65 Figure 12-3

von cskulkw (Gast)


Lesenswert?

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

von Christoph (Gast)


Lesenswert?

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

von Christoph (Gast)


Lesenswert?

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

von Christoph (Gast)


Lesenswert?

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

von Alex A. (Gast)


Lesenswert?

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.

von Christoph (Gast)


Lesenswert?

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

von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

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

von Christoph (Gast)


Lesenswert?

Ach, danke :)
probiere ich aus
Gruss

von Alex A. (Gast)


Lesenswert?

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

von Alex A. (Gast)


Lesenswert?

Danke, hat sofort geklappt :)
Gruss Alex S.

von Falk B. (falk)


Lesenswert?

@  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

von cskulkw (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Alex A. (Gast)


Lesenswert?

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.

von cskulkw (Gast)


Lesenswert?

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.

...

von Alex A. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Alex A. (Gast)


Lesenswert?

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.

von Alex A. (Gast)


Lesenswert?

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.

von Alex A. (Gast)


Lesenswert?

Hat sich erledigt, CANCTRL bit3 muss auf 0.
Trotzdem 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
Noch kein Account? Hier anmelden.