Forum: Mikrocontroller und Digitale Elektronik CAN BUS Raspberry


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein Problem mit meinen CAN BUS und weiß leider nicht mehr 
weiter.

Ich habe 2 Arduinos und einen Raspberry, welche ich alle über einen 
CAN-BUS miteinander kommunizieren lasse.

Die Arduino Schaltung habe ich nach folgenden Prinzip aufgebaut mit 
einem MCP2515, MCP2551 & einem 8Mhz Quarz):
https://www.google.com/search?q=arduino+mcp2551&client=firefox-b-d&sxsrf=ACYBGNTVOO3Z8W83lqPT5Tjz6yL9u0ieDA:1577365696730&tbm=isch&source=iu&ictx=1&fir=jUpY41_pB0CMAM%253A%252CtEUf16LF1rHe5M%252C_&vet=1&usg=AI4_-kQWa7Nsvu2CsXIbKbg_kRhsruHszw&sa=X&ved=2ahUKEwj9_6KQsdPmAhVEyaYKHZtHAgwQ9QEwCHoECAQQBg#imgrc=jUpY41_pB0CMAM:

Beide Arduinos können auch Problemlos miteinander reden. Nur der 
Rasperry kann ich auf der CAN Leitung nicht kommunizieren.

Für meinen Raspberry habe ich folgende Schaltung erstellt, siehe Anhang.
Für den Raspberry habe ich anstatt des MCP2551 einen MCP2561 Chip, sowie 
einen 8Mhz Quarz, ansonsten ist der Aufbau gleich.

Da ich kein Oszilloskop habe, habe ich beide CAN L+H Leitungen auf einen 
Analogen Input meines Arduinos gehängt, um zu sehen, ob eine 
Kommunikation auf der Leitung stattfindet.

Arduino Sketch:
1
void setup() {
2
  Serial.begin(115200);           //  setup serial
3
}
4
5
int lastVal1 = 99;
6
int lastVal2 = 99;
7
void loop() {
8
  int val1 = analogRead(A3) / 30;
9
  int val2 = analogRead(A4) / 30;
10
11
  if (val1 != lastVal1 || val2 != lastVal2) {
12
    lastVal1 = val1;
13
    lastVal2 = val2; 
14
    Serial.print(val1);          
15
    Serial.print(" ");          
16
    Serial.println(val2);   
17
  }
18
}

Zwischen den Ardionos sehe ich bei jeder übertragenen Nachricht 
kurzzeitig eine Änderung des Spannung auf der CAN Leitung (was ja auch 
korrekt ist).

Sende ich mit meinem Raspberry eine Nachricht, so beginnt die Spannung 
auf der CAN Leitung wild hin und her zu schwanken, bis ich den Raspberry 
resete.

Woran kann das liegen? Ein Fehler in meiner Rasperry Schaltung??

Die SPI Initalisierung am Raspberry funktioniert problemlos und der 
MCP2515 wird auf vom Linux Kernel erkannt.

Danke!

lG

von Frank K. (fchk)


Lesenswert?

Entweder hast Du Deinen Pi schon beschädigt, oder Du bist gerade dabei.

Die GPIO-Pins vom Pi vertragen keine 5V. Du versorgst aber den MCP2515 
mit 5V. Dadurch sind für den die Eingangspegel zu niedrig, was 
vielleicht noch gehen würde, aber er gibt auf MISO 5V-Pegel aus, was den 
Pi entweder schon beschädigt hat oder ihn beschädigen wird.

Also: Sofort alles außer Betrieb nehmen.

MCP2515 mit 3.3V versorgen.
Als Transceiver nimmst Du einen MCP2562. Der braucht einmal 5V für den 
CAN-Bus und einmal 3.3V für RX/TX zum MCP2515.

Am MISO machst Du ab Besten noch einen Pullup (irgendwas zwischen 10k 
und 100k nach 3.3V), damit der Pi auch dann noch einen gültigen 
Logikpegel hat, wenn der MCP2515 MISO auf Z (hochohmig) setzt.

fchk

von Guest (Gast)


Lesenswert?

Thomas schrieb:
> Sende ich mit meinem Raspberry eine Nachricht, so beginnt die Spannung
> auf der CAN Leitung wild hin und her zu schwanken, bis ich den Raspberry
> resete.

Vermutlich spamt der PI Error Frames. Das solltest du mit den Arduinos 
erkennen können. Sowas wird normalerweise vom CAN Controller erkannt.

Ansonsten kann ich mich dem Vorredner nur anschließen.

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Frank K. schrieb:
> Die GPIO-Pins vom Pi vertragen keine 5V. Du versorgst aber den MCP2515
> mit 5V. Dadurch sind für den die Eingangspegel zu niedrig, was
> vielleicht noch gehen würde, aber er gibt auf MISO 5V-Pegel aus, was den
> Pi entweder schon beschädigt hat oder ihn beschädigen wird.

Danke für den Hinweis, daran habe ich gar nicht gedacht.

Habe im Internet nun für den Raspberry ein Schaltplan gefunden, diese 
kann ich im Grunde 1:1 übernehmen oder?

Frank K. schrieb:
> Am MISO machst Du ab Besten noch einen Pullup (irgendwas zwischen 10k
> und 100k nach 3.3V), damit der Pi auch dann noch einen gültigen
> Logikpegel hat, wenn der MCP2515 MISO auf Z (hochohmig) setzt.

Kann man mir noch sagen, wieso am MISO ein Pullup benötigt wird? Habe 
davon noch nirgends gelesen oder in einem Schaltplan gesehen.

Danke!

von Frank K. (fchk)


Lesenswert?

Thomas schrieb:

> Habe im Internet nun für den Raspberry ein Schaltplan gefunden, diese
> kann ich im Grunde 1:1 übernehmen oder?

Sieht erstmal gut aus.

>> Am MISO machst Du ab Besten noch einen Pullup (irgendwas zwischen 10k
>> und 100k nach 3.3V), damit der Pi auch dann noch einen gültigen
>> Logikpegel hat, wenn der MCP2515 MISO auf Z (hochohmig) setzt.
>
> Kann man mir noch sagen, wieso am MISO ein Pullup benötigt wird? Habe
> davon noch nirgends gelesen oder in einem Schaltplan gesehen.

Grundregel der Digitalelektronik: immer gültige Pegel haben!
Am Eingang eines Pins sind zwei TRansistoren, einmal N und einmal P. Von 
denen soll immer nur einer durchgeschaltet sein, der andere soll 
sperren. Das funktioniert aber nur, wenn der EIngang entweder auf 0V 
oder auf VCC ist. Wenn er irgendwo dazwischen ist, sind beide 
Transistoren nur halb durchgeschaltet, und es fließen unzulässige 
Querströme.

MISO ist hochohmig, wenn CS high ist. Damit ist der Spannungspegel 
undefiniert. Mit dem Pullup ziehst Du ihn auf einen definierten Pegel 
und vermeidest diese Querströme.

fchk

Beitrag #6086819 wurde von einem Moderator gelöscht.
von Thomas (Gast)


Lesenswert?

Frank K. schrieb:
> Grundregel der Digitalelektronik: immer gültige Pegel haben!
> Am Eingang eines Pins sind zwei TRansistoren, einmal N und einmal P. Von
> denen soll immer nur einer durchgeschaltet sein, der andere soll
> sperren. Das funktioniert aber nur, wenn der EIngang entweder auf 0V
> oder auf VCC ist. Wenn er irgendwo dazwischen ist, sind beide
> Transistoren nur halb durchgeschaltet, und es fließen unzulässige
> Querströme.
>
> MISO ist hochohmig, wenn CS high ist. Damit ist der Spannungspegel
> undefiniert. Mit dem Pullup ziehst Du ihn auf einen definierten Pegel
> und vermeidest diese Querströme.

Ah ok verstehe ich nun.
Gilt das jetzt nur für den MCP2515, dass dieser hochohmig ist, oder gilt 
das generell für alle SPI Kompententen (zB. auch MCP 23S17)

von Frank K. (fchk)


Lesenswert?

Thomas schrieb:

>> MISO ist hochohmig, wenn CS high ist. Damit ist der Spannungspegel
>> undefiniert. Mit dem Pullup ziehst Du ihn auf einen definierten Pegel
>> und vermeidest diese Querströme.
>
> Ah ok verstehe ich nun.
> Gilt das jetzt nur für den MCP2515, dass dieser hochohmig ist, oder gilt
> das generell für alle SPI Kompententen (zB. auch MCP 23S17)

Das gilt generell und auch nicht nur für SPI.

fchk

von Thomas (Gast)


Lesenswert?

Frank K. schrieb:
> Das gilt generell und auch nicht nur für SPI.

Ja das ist schon klar.
Nur im Falle vom SPI, kann es mir nicht egal sein, wenn das HIGH/LOW im 
MISO herumschwankt, wenn das SPI Device gerade nicht den CS auf HIGH 
hat? Da wird der MISO PIN ja sowieso nicht ausgewertet (oder?)

und wenn ich 2 SPI Devices auf einer MISO Leitung habe, und ich habe 
gerade ein Device aktiv, so wird Der HIGH/LOW Pegel dann sowieso von 
diesem einem Device vorgegeben und kann vom anderen nicht aktiven nich 
mehr schwanken.

Oder liege ich da falsch?

von Frank K. (fchk)


Lesenswert?

Thomas schrieb:
> Frank K. schrieb:
>> Das gilt generell und auch nicht nur für SPI.
>
> Ja das ist schon klar.
> Nur im Falle vom SPI, kann es mir nicht egal sein, wenn das HIGH/LOW im
> MISO herumschwankt, wenn das SPI Device gerade nicht den CS auf HIGH
> hat? Da wird der MISO PIN ja sowieso nicht ausgewertet (oder?)

Der Prozessor wertet den Pin nicht aus, aber die Eingangstransistoren 
sind immer aktiv, und dort fließt dann eventuell ein unzulässig hoher 
Querstrom, der bis zur Zerstörung des Einganges gehen kann. Du musst 
immer, grundsätzlich und zu jedem Zeitpunkt für eindeutige Pegel an 
allen digitalen Eingängen sorgen.

fchk

von Thomas (Gast)


Lesenswert?

Frank K. schrieb:
> Der Prozessor wertet den Pin nicht aus, aber die Eingangstransistoren
> sind immer aktiv, und dort fließt dann eventuell ein unzulässig hoher
> Querstrom, der bis zur Zerstörung des Einganges gehen kann. Du musst
> immer, grundsätzlich und zu jedem Zeitpunkt für eindeutige Pegel an
> allen digitalen Eingängen sorgen.
>
> fchk

Super danke, wieder was gelernt :-)

von Rolf M. (rmagnus)


Lesenswert?

Frank K. schrieb:
> Der Prozessor wertet den Pin nicht aus, aber die Eingangstransistoren
> sind immer aktiv, und dort fließt dann eventuell ein unzulässig hoher
> Querstrom, der bis zur Zerstörung des Einganges gehen kann. Du musst
> immer, grundsätzlich und zu jedem Zeitpunkt für eindeutige Pegel an
> allen digitalen Eingängen sorgen.

Wieso ist es dann kein Problem, wenn man den Pinheader vom RPi einfach 
komplett unbeschaltet lässt? So werden die ja millionenfach betrieben.

von Frank K. (fchk)


Lesenswert?

Rolf M. schrieb:
> Frank K. schrieb:
>> Der Prozessor wertet den Pin nicht aus, aber die Eingangstransistoren
>> sind immer aktiv, und dort fließt dann eventuell ein unzulässig hoher
>> Querstrom, der bis zur Zerstörung des Einganges gehen kann. Du musst
>> immer, grundsätzlich und zu jedem Zeitpunkt für eindeutige Pegel an
>> allen digitalen Eingängen sorgen.
>
> Wieso ist es dann kein Problem, wenn man den Pinheader vom RPi einfach
> komplett unbeschaltet lässt? So werden die ja millionenfach betrieben.

Ich habe jetzt keinen hier zum Nachschauen, was die 
Default-KOnfiguration ist. Es gibt mehrere Möglichkeiten:
- Pintreiber komplett abschalten
- schwacher interner Pullup (100k reichen)
- als Ausgang konfigurieren

Offene Eingänge mit undefininierten Pegeln sind jedenfalls immer 
problematisch.

fchk

von Thomas (Gast)


Lesenswert?

Habe den MCP2561 durch einen MCP2562 ersetzt, den MCP2515 mit 3.3V 
versorgt, wie im Diagramm oben angezeigt.

Ich benutze einen 8Mhz Quarz und habe 2x 27pF Kondensator. Ansonsten 
entspricht alles dem Diagramm.

Mein Raspberry bootet, CAN- Interface wird erkannt. Auf beide CAN 
Leitungen liegen je 2.5V an.
Sobald ich eine Nachricht übertragen möchte sehe ich am Bus eine endlos 
lange Übertragung, da anscheiend immer wieder versucht wird, die 
Nachricht zu senden, die Gegenseite aber die Nachricht nicht annehmen 
kann / will.

8Mhz sollte ja kein Problem sein?

Kann es sein, dass ich durch den 5V Pegel im MISO den PIN am Raspberry 
beschädigt habe? Aber dann würde der MCP2515 nicht mehr erkannt werden 
können oder??

Hat noch jemand Tipps?

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.