MCP2515 Befehl

Gast #2368835
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
Gast #2368984
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.
Gast #2369476
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
#2369989
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
Gast #2369994
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.
Angehängte Dateien:
Gast #2370496
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.
Gast #2373140
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.

...
Gast #2377794
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
Angehängte Dateien:
Gast #2377807
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.
Gast #2378074
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren