Forum: PC Hard- und Software RaspberryPiB+ mit CAN (MCP2515)


von René P. (speedy909)


Lesenswert?

Hallo zusammen,

ich stehe derzeit vor einem großen Problem und komme einfach nicht 
weiter. Bin schon mehrere Tage mit diversen Versuchen beschäftigt und 
komme nicht zu einer annähernd funktionierenden Lösung.

Ziel:
Ansteuerung von CAN-BUS Komponenten über einen RaspberryPiB+ für 
Hausautomatisierungszwecke.

Ich habe eine Versuchsschaltung aufgebaut bei der ein 
Atmega8+MCP2515+MCP2551 Daten auf den Bus legt, ein zweiter 
Atmega8+MCP2515+MCP2551 zeigt diese ankommenden Daten auf einem Display 
an. Der CAN-Bus an sich läuft also ohne Probleme.

Jetzt will ich per Raspberry ebenfalls Daten auf den BUS legen, bzw. 
Daten vom BUS lesen und verarbeiten.
Meine Erfahrung mit dem Raspberry ist gleich=0, habe bisher ein paar 
eigenständige Experimente durchgeführt um Linux etwas kennenzulernen.

Ich habe inzwischen in zahlreichen Foreneinträgen Informationen über den 
Betrieb eines MCP2515 an einem Raspberry gefunden, und mehrere Versuche 
angestellt, leider alle ohne den geringsten Erfolg.


Mein bisher größter Fortschritt:
Ich konnte einen "vcan" auf dem Raspberry betreiben, senden und 
empfangen von Daten klappte problemlos. auf dem selben Raspberry habe 
ich anschließend einen MCP2515 angeschlossen, und ich dachte ich habe es 
endlich geschafft, dem war aber nicht so :(
Ich habe das Gefühl, dass der Raspberry überhaupt nicht mit dem MCP 
kommuniziert (Treiberproblem)?!?

Gibt es irgendjemand hier im Forum der auf einem RaspberryPiB+ einen 
CAN-BUS über einen MCP2515 zum laufen gebracht hat?
(wenn möglich auf dem aktuellsten Kernel 3.16 --> ist aber nur 
zweitrangig)und mir ein paar Tipps hierzu geben kann?

Weitere Informationen bezüglich meiner genauen 
Vorgehensweise/Konfiguration/Schaltplan kann ich natürlich auch noch 
bekanntgeben, aber währe froh wenn ich zuvor schon die ein oder andere 
Person finde die mir weiterhelfen kann.

Gruß
René

von temp (Gast)


Lesenswert?

Ich finde eine USB-Lösung am Raspberry besser als die Orgie mit den 
Treibern für den MCP2515. Der preiswerte Bausatz von Thomas Fischl 
reicht völlig aus.

http://www.fischl.de/usbtin/

Läuft auf dem Raspberry problemlos.

von Frank K. (fchk)


Lesenswert?

Immer der PI!
Der Prozessor auf dem BeagleBoneBlack hat CAN bereits direkt eingebaut, 
Du musst nur noch einen Transceiver anschließen.

http://www.koervernet.de/elektronik/beagle-bone-black

Und da der CAN Controller direkt im Prozessor drin ist, ist der auch bei 
hoher Buslast zu gebrauchen.

fchk

von René P. (speedy909)


Lesenswert?

@temp:
USB-Lösung klingt super, nur habe ich derzeit kein passendes USB-Modul 
zur Hand und wollte eigentlich den MCP verwenden, da diese auf Hardware 
beruht und "weniger Probleme" mit sich bringt... dachte ich zumindest 
bis jetzt!


@Frank K.:
Ich dachte mir damals "man fängt immer klein an" und habe mich für den 
Raspberry entschieden, da dieser meines Wissens mehr verbreitet ist, 
dass die simple Ansteuerung eines SPI Moduls solche Probleme bereitet, 
habe ich nicht gedacht...

von Frank K. (fchk)


Lesenswert?

René P. schrieb:

> @Frank K.:
> Ich dachte mir damals "man fängt immer klein an" und habe mich für den
> Raspberry entschieden, da dieser meines Wissens mehr verbreitet ist,
> dass die simple Ansteuerung eines SPI Moduls solche Probleme bereitet,
> habe ich nicht gedacht...

Der MCP2515 gehört nicht zu den Glanzleistungen von Microchip. Die haben 
mittlerweile selber besseres, und die verbesserten ECAN-Module sind in 
den PICs drin. Ein PIC18F25K80 ist billiger, kleiner und 
CAN-Bus-technisch besser als ein AVR+MCP2515, weil (a) der 
SPI-Flaschenhals wegfällt, (b) der ECAN des PIC mehr Buffer und weniger 
Fehler als der MCP2515 hat, (c) der anzuschließende Quarz CAN und den 
Rest des Prozessors taktet und (d) Du einen Chip weniger hast.

fchk

von René P. (speedy909)


Lesenswert?

Frank K. schrieb:
> Der MCP2515 gehört nicht zu den Glanzleistungen von Microchip. Die haben
> mittlerweile selber besseres, und die verbesserten ECAN-Module sind in
> den PICs drin. Ein PIC18F25K80 ist billiger, kleiner und
> CAN-Bus-technisch besser als ein AVR+MCP2515, weil (a) der
> SPI-Flaschenhals wegfällt, (b) der ECAN des PIC mehr Buffer und weniger
> Fehler als der MCP2515 hat, (c) der anzuschließende Quarz CAN und den
> Rest des Prozessors taktet und (d) Du einen Chip weniger hast.

OK, verstehe ich,... aber jemand der mir hier ein paar Tipps geben kann, 
wie ich es mit dieser Hardware bewerkstelligen kann die ich zur 
Verfügung habe muss es ja auch geben.

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Hallo Rene,

hast Du die Konfiguration Deines Adapters über spi-config geladen ?
In etwa so:

# CS0 ; MCP2515/INT -> GPIO25 ; MCP2515 Quarz 16 Mhz
sudo spi-config devices=\
bus=0:cs=0:modalias=mcp2515:speed=1000000:gpioirq=25:pd=20:pds32-0=16000 
000:pdu32-4=0x2002:force_release
sudo modprobe mcp251x
sudo ip link set can0 type can bitrate 250000
sudo ifconfig can0 up

Was sagt 'dmesg | egrep -i "can|mcp251|spi"' ?

Gruß

Gerd

: Bearbeitet durch User
von René P. (speedy909)


Angehängte Dateien:

Lesenswert?

Hallo Gerd,

ich habe schon mehrere Methoden probiert den CAN zum laufen zu bekommen, 
das von dir beschriebene Prozedere kommt mir sehr bekannt vor.

mein aktueller Stand ist nach folgender Anleitung:
http://skpang.co.uk/blog/archives/1165


vorab noch eine prinzipielle Frage:
Der MCP2515 hat ja einen Takt Ausgang auf Pin3, dieser läuft beim 
anlagen der Betriebsspannung mit 2Mhz. Im selben Moment startet der 
Raspberry, nach einigen Sekunden (genau bei der Initialisierung von SPI) 
hört der MCP auf dem Pin3 auf zu Takten... ist das Normal? --> ist das 
ein Zeichen für eine funktionierende Initialisierung?


hier ein kleiner Auszug aus dem LOG, kompletter LOG siehe Anhang
1
...
2
[    6.676666] sd 0:0:0:0: [sda] 7831552 512-byte logical blocks: (4.00 GB/3.73 GiB)
3
[    6.696595] CAN device driver interface
4
[    6.721487] sd 0:0:0:0: [sda] Write Protect is off
5
[    6.744905] spi spi0.0: setting up native-CS0 as GPIO 8
6
[    6.757416] sd 0:0:0:0: [sda] Mode Sense: 23 00 00 00
7
[    6.759220] sd 0:0:0:0: [sda] No Caching mode page found
8
[    6.783921] sd 0:0:0:0: [sda] Assuming drive cache: write through
9
[    6.842181] random: nonblocking pool is initialized
10
[    6.854253]  sda: sda1
11
[    6.886432] sd 0:0:0:0: [sda] Attached SCSI removable disk
12
[    7.333585] spi spi0.1: setting up native-CS1 as GPIO 7
13
[    9.008537] sd 0:0:0:0: Attached scsi generic sg0 type 0
14
[   12.534009] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
15
[   13.102326] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
16
[   23.776403] mcp251x spi0.0 can0: bit-timing not yet defined
17
[   23.776450] mcp251x spi0.0: unable to set initial baudrate!
18
...
19
[   24.720899] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
20
[   24.879310] mcp251x spi0.0 can0: bit-timing not yet defined
21
[   24.879357] mcp251x spi0.0: unable to set initial baudrate!
22
[   25.879995] mcp251x spi0.0 can0: bit-timing not yet defined
23
[   25.880047] mcp251x spi0.0: unable to set initial baudrate!
24
[   26.325205] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1
25
26
[   30.886607] mcp251x spi0.0 can0: bit-timing not yet defined
27
[   30.886656] mcp251x spi0.0: unable to set initial baudrate!
28
[   31.592628] Adding 102396k swap on /var/swap.  Priority:-1 extents:2 across:2134012k SSFS
29
[   31.888007] mcp251x spi0.0 can0: bit-timing not yet defined
30
[   31.888056] mcp251x spi0.0: unable to set initial baudrate!
31
...
32
[   60.924084] mcp251x spi0.0: unable to set initial baudrate!
33
[  269.569538] can: controller area network core (rev 20120528 abi 9)
34
[  269.571126] NET: Registered protocol family 29
35
[  269.615014] can: raw protocol (rev 20120528)

Außer dem Eintrag in der "/boot/config.txt" steht keine weitere 
Konfiguration in der benutzten Anleitung?!?

Das CAN Interface lässt sich auch ohne Fehler aktivieren: (meistens 
zumindest)
1
ip link set can0 up type can bitrate 500000

es kann auch mit "cansend can0 7DF#01..." gesendet werden, nur zählen 
weder die gesendeten bit laut "ifconfig" hoch, noch habe ich das Gefühl 
das etwas per SPI an den MCP gesendet wird.


Gruß René

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Hallo Rene,

das mit dem MCP2515 Clkout kann ich Dir nicht beantworten. Kann gut 
sein, das die (erfolgreiche) Initialisierung das stoppt. Allgemein sieht 
es gar nicht so schlecht aus - die Meldung "can0: bit-timing not yet 
defined" ist ein gutes Zeichen. BTW: was passiert, wenn Du noch ein 
"sudo ifconfig can0 up" mitgibst ?

Ok. Du verwendest jetzt einen neueren Kernel mit Device Tree Overlay. 
Kannst Du noch den Output von "cat /proc/interrrupts ; cat 
/sys/kernel/debug/gpio ; ip -s -d link show can0" geben ?
Ich vermute, das noch etwas mit der MCP2515-Int Leitung nicht in Ordnung 
ist. Die Initialisierung scheint erfolgreich gewesen zu sein.

Gruß

Gerd

: Bearbeitet durch User
von René P. (speedy909)


Lesenswert?

Gerd B. schrieb:
> Ok. Du verwendest jetzt einen neueren Kernel mit Device Tree Overlay.

ja, es ist der aktuellste Kernel, und er ist noch komplett 
unkonfiguriert sozusagen "jungfräulich"


"sudo ifconfig can0 up" wird durchgeführt, kein Fehler... aber ändert 
nichts an der Situation.


cat /proc/Interrupts:
1
           CPU0       
2
  3:      11490   ARMCTRL   3  BCM2708 Timer Tick
3
 16:          0   ARMCTRL  16  bcm2708_fb dma
4
 24:        161   ARMCTRL  24  DMA IRQ
5
 25:       2760   ARMCTRL  25  DMA IRQ
6
 32:     232738   ARMCTRL  32  dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1
7
 49:          0   ARMCTRL  49  20200000.gpio:bank0
8
 50:          0   ARMCTRL  50  20200000.gpio:bank1
9
 65:         14   ARMCTRL  65  ARM Mailbox IRQ
10
 66:          2   ARMCTRL  66  VCHIQ doorbell
11
 75:          1   ARMCTRL  75
12
 80:          0   ARMCTRL  80  20204000.spi
13
 83:          4   ARMCTRL  83  uart-pl011
14
 84:       9388   ARMCTRL  84  mmc0
15
419:          0  pinctrl-bcm2835  25  mcp251x
16
FIQ:              usb_fiq
17
Err:          0


cat /sys/kernel/debug/gpio:
1
Datei oder Verzeichnis nicht gefunden


ip -s -d link show can0:
1
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 10
2
    link/can 
3
    can state ERROR-ACTIVE restart-ms 0 
4
    bitrate 500000 sample-point 0.875 
5
    tq 125 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
6
    mcp251x: tseg1 3..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1
7
    clock 8000000
8
    re-started bus-errors arbit-lost error-warn error-pass bus-off
9
    0          0          0          0          0          0         
10
    RX: bytes  packets  errors  dropped overrun mcast   
11
    0          0        0       0       0       0      
12
    TX: bytes  packets  errors  dropped carrier collsns 
13
    0          0        0       0       0       0


can state ERROR-ACTIVE --> klingt nicht so gut...


PS: vielen Dank für die kräftige Unterstützung!

Gruß René

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Wie ist der Pegel der Int Leitung ?

can state ERROR-ACTIVE --> ist richtig. Siehe MCP2515 Doku.

Bitte mach noch folgendes:
mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/gpio

: Bearbeitet durch User
von René P. (speedy909)


Lesenswert?

der Pegel liegt im Normalfall bei 3.3V (sollte ja nur bei Empfang einer 
Nachricht auf 0V sinken wenn ich das richtig verstanden habe.

Jetzt habe ich es gerade geschafft etwas zu senden! (weiß aber noch 
nicht wieso es auf einmal gehen sollte...

habe folgendes gemacht:
- MCP sendete auf einmal Daten an den MCP2551 (Bus war noch nicht 
angeschlossen)
- Raspberry reboot
- CAN an "CAN Monitor" (Atmega mit MCP2515 und Display) angeschlossen
- ip -s -d link Show can0 (can state STOPPED, mode DEFAULT, ...)
- sudo ip link set can0 up type can Bitrate 125000 (endgültige Baudrate)
- ip -s -d link Show can0 (can state ERROR-ACTIVE, mode DEFAULT, ...)
- cansend can0 7DF#01020301
- ip -s -d link Show can0 (TX zeigte 4 Byte und 1 Paket)
- sudo ifconfig can0 up
- ip -s -d link Show can0 (TX zeigte immer noch 4 Byte und 1 Paket)

anschließend konnte ich Daten senden!!!

wie wäre hier die richtige Vorgehensweise?
was bewirkt "sudo ifconfig can0 up" -> "up" wurde ja schon bei der 
Baudrateneinstellung mitgegeben.

Gruß René

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Hallo Rene,

ich kann nicht alles nachvollziehen, was Du gemacht hast.

Hilfreich zur Analyse kann auch:
candump -tA -xe can0,0:0,#FFFFFFFF
sein.

Gruß

Gerd

von René P. (speedy909)


Lesenswert?

Hallo Gerd,

Danke für deine hilfreichen Tipps! Haben mich echt weiter gebracht.

Habe meine Schaltung gestern wieder auf den Originalzustand 
zurückversetzt (ohne Oszi), um alle äußeren Einflüsse zu minimieren. 
Dann den Raspberry neugestartet um nochmals zu checken welche 
Vorgehensweise zum Erfolg führt. Interessanterweise musste ich nur den 
CAN mit der Baudrate 125000 konfigurieren und konnte sofort mit candump 
Werte empfangen.

Werde Heute nochmals eine neue SD Karte in den Raspberry stecken und die 
Konfiguration wiederholen, und alle nötigen Schritte notieren, damit ich 
nicht nächstes Mal wieder vor dem Nichts stehe.

Für mich ist Linux eine neue Materie mit der ich mich erst noch richtig 
beschäftigen muss.

Nochmals Danke für deine Hilfe!

Gruß René

von EGS T. (egs_ti)


Lesenswert?

Es wäre auch toll, wenn du deine Aufzeichnungen dann auch hier uploaden 
könntest.

von René P. (speedy909)


Lesenswert?

@EGS TI
Natürlich, werde ich gerne zur Verfügung stellen...

von Thomas S. (doschi_)


Lesenswert?

EGS TI schrieb:
> Es wäre auch toll, wenn du deine Aufzeichnungen dann auch hier uploaden
> könntest.

Hall René,
Ich wäre auch an Deiner Schritt-für-Schritt-Anleitung interessiert.

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

René P. schrieb:
> Hallo Gerd,
>
> Danke für deine hilfreichen Tipps! Haben mich echt weiter gebracht.
>

Bitte, gern gesachehen. Eine Frage noch: Hast Du beide Enden Deines 
CAN-Busses mit 120 Ohm terminiert ?

Gruß

Gerd

von René P. (speedy909)


Lesenswert?

Gerd B. schrieb:
> Bitte, gern gesachehen. Eine Frage noch: Hast Du beide Enden Deines
> CAN-Busses mit 120 Ohm terminiert ?

Ja, wobei die komplette Leitungslänge des CAN-Bus derzeit nur etwa 50cm 
beträgt.

von René P. (speedy909)


Angehängte Dateien:

Lesenswert?

So, habe nun nochmals einen Pi neu Konfiguriert (funktionierte alles 
problemlos) und gleichzeitig diese Anleitung geschrieben, ich hoffe der 
ein oder andere kann etwas damit anfangen.
Ich habe versucht die ganzen Tipps von Gerd B. auch mit einfließen zu 
lassen.

Gruß René

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Sehr gute Beschreibung, Rene. Das wird vielen helfen. Darf ich diese auf 
meiner Internet-Seite (http://lnxpps.de/rpie) veröffentlichen ?

Alternativ zum CAN Tranceiver MCP2551 kann man auch den MCP2562 
verwenden.
Vorteil: Der Spannungsteiler entfällt, da der Tranceiver mit zwei 
Spannungen arbeitet (VDD und VIO).

Gruß

Gerd

von René P. (speedy909)


Lesenswert?

Habe kein Problem damit Gerd, ich bin froh wenn ich der Gemeinschaft 
wieder einen Teil zurückgeben kann...

Wenn mindestens einer mit dieser Anleitung Erfolg hat, und nicht solange 
mit Recherche verbringen muss, hat sich meine Mühe gelohnt.

Über Rückmeldungen/Verbesserungsvorschläge hier im Forum würde ich mich 
natürlich freuen.

von René P. (speedy909)


Lesenswert?

kleiner Nachtrag:
habe vor kurzer Zeit die von mir erstellte Anleitung auch erfolgreich an 
einem Raspberry Pi 2 Model B getestet!

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.