Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi + CAN MCP2515


von Roland H. (blacksmoke)


Lesenswert?

Hallo,

Ich habe mir vorgenommen den Raspberry mit einem Can-Interface 
auszustatten. In Zukunft soll ein Bus aus mehreren Mikrocontrollern und 
Embedded-Boards entstehen. Dazu habe ich die folgende Schaltung auf 
einem Breadboard aufgebaut:

http://lnxpps.de/rpie/rpi_mcp2515.png

Ich verwende das neueste Raspbian-Jessie Image. Wünschenswert wäre es 
diese Standard-Image, indem ja bereits die Treiber als Modul enthalten 
sind zu verwenden ohne den Kernel neu Kompilieren zu müssen.
Vorgegangen bin ich nach folgendem Tutorial:

http://skpang.co.uk/blog/archives/1165

Leider komme ich nicht weiter. Bekomme keine vernünftigen Ergebnisse bei 
folgenden Commandos

cat /proc/interrupts    kein Interrupt für mcp2515
dmesg | grep mcp        keine Ausgabe
dmesg | grep can        keine Ausgabe
ip link                 can0 taucht auf

Auf diversen Freescale-Boards habe ich CAN schon mal am Laufen gehabt.

Wenn benötigt gebe ich natürlich noch mehr Ausgaben.

für Hilfe oder Hinweise warum ich so garnichts vom mcp2515 sehe wäre ich 
sehr Dankbar

: Bearbeitet durch User
von MCP2515 (Gast)


Lesenswert?

Software OK und Hardware kaputt?

von Roland H. (blacksmoke)


Lesenswert?

So nun habe ich wenigstens folgende Situtation:
Ich sehen ihn mit ip link und auch unter den interrupts ist er nach dem 
aktivieren nun aufgelistet. Ich finde es nur seltsam dass ich unter 
/boot/config.txt
oscillator=16000000 einstelle und angeblich eine clock von 8000000 habe. 
Dann habe ich versucht zu senden und mit einem Logic-Analyzer zu 
horchen. Leider bisher ohne vernünftige Ausgabe.
Hier einige Ausgaben:

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


root@raspberrypi:~# cat /proc/interrupts
           CPU0
  3:       9095   ARMCTRL   3 Edge      BCM2708 Timer Tick
 16:          0   ARMCTRL  16 Edge      bcm2708_fb dma
 20:       3062   ARMCTRL  20 Edge      DMA IRQ
 21:          0   ARMCTRL  21 Edge      DMA IRQ
 24:          0   ARMCTRL  24 Edge      DMA IRQ
 32:     119647   ARMCTRL  32 Edge      dwc_otg, dwc_otg_pcd, 
dwc_otg_hcd:usb1
 49:          3   ARMCTRL  49 Edge      20200000.gpio:bank0
 50:          0   ARMCTRL  50 Edge      20200000.gpio:bank1
 65:         16   ARMCTRL  65 Edge      2000b880.mailbox
 66:          2   ARMCTRL  66 Edge      VCHIQ doorbell
 75:          1   ARMCTRL  75 Edge
 77:        220   ARMCTRL  77 Edge      DMA IRQ
 80:          0   ARMCTRL  80 Edge      20204000.spi
 83:          5   ARMCTRL  83 Edge      uart-pl011
 84:      10779   ARMCTRL  84 Edge      mmc0
416:          3  pinctrl-bcm2835  22 Edge      mcp251x
FIQ:              usb_fiq
Err:          0


root@raspberrypi:~# dmesg | grep mcp
[   12.516503] mcp251x spi0.0 can0: bit-timing not yet defined
[   12.516548] mcp251x spi0.0: unable to set initial baudrate!
[   12.520098] mcp251x spi0.0 can0: bit-timing not yet defined
[   12.520140] mcp251x spi0.0: unable to set initial baudrate!
[   12.520210] mcp251x spi0.0 can0: bit-timing not yet defined
[   12.520231] mcp251x spi0.0: unable to set initial baudrate!
[   12.520290] mcp251x spi0.0 can0: bit-timing not yet defined
[   12.520312] mcp251x spi0.0: unable to set initial baudrate!
[   12.520369] mcp251x spi0.0 can0: bit-timing not yet defined
[   12.520391] mcp251x spi0.0: unable to set initial baudrate!
[   13.622634] mcp251x spi0.0 can0: bit-timing not yet defined
[   13.622679] mcp251x spi0.0: unable to set initial baudrate!
[   14.623927] mcp251x spi0.0 can0: bit-timing not yet defined
[   14.623973] mcp251x spi0.0: unable to set initial baudrate!
[   15.625292] mcp251x spi0.0 can0: bit-timing not yet defined
[   15.625336] mcp251x spi0.0: unable to set initial baudrate!
[   16.626091] mcp251x spi0.0 can0: bit-timing not yet defined
[   16.626137] mcp251x spi0.0: unable to set initial baudrate!

Aktiviert habe ich can0 mit

ip link set can0 up type can bitrate 125000

root@raspberrypi:~# lsmod
Module                  Size  Used by
can_raw                 7427  8
can                    30360  1 can_raw
cfg80211              501663  0
rfkill                 22491  1 cfg80211
mcp251x                 9554  0
can_dev                13042  1 mcp251x
spi_bcm2835             7980  0
bcm2835_gpiomem         3703  0
uio_pdrv_genirq         3690  0
uio                    10009  1 uio_pdrv_genirq
i2c_dev                 6737  0
snd_bcm2835            22339  3
snd_pcm                92573  1 snd_bcm2835
snd_timer              23456  1 snd_pcm
snd                    68161  9 snd_bcm2835,snd_timer,snd_pcm
fuse                   91842  3
ipv6                  360365  24

Die Module can und can-raw werden dabei nicht automatisch mitgeladen. 
Diese habe ich manuell nachgeladen. Für was brauche ich welches Modul ?

Unsicher bin ich mir auch bei den Pull-Up Widerständen für z.B. 
Interrupt. Ich nehme aber an dass ich diese brauche um die Pegel auf 
einen Invertierten Zustand zu bringen

: Bearbeitet durch User
von MCP2515 (Gast)


Lesenswert?

>can state ERROR-PASSIVE

In dem Zustand sollter er auch nichts senden..

>clock 8000000

ist normal bei oscillator=16000000

von Roland H. (blacksmoke)


Lesenswert?

Ich muss dazu sagen das dies der Zustand ist, nachdem ich gesendet habe. 
Vor dem Senden ist er auf ERROR-Active. Das wäre soweit ich weiß in 
Ordnung. Nur die Ausgabe von dmesg ist nicht in Ordnung denk ich. Beim 
Freescale-Board war es so, dass weil ich keinen aktiven zweiten 
Teilnehmer dranhängen hatte die Message immer wieder gesendet wird 
(logisch, da kein ACK).
Ah ok mit oscillator=8000000 scheint es soweit zu gehen.
Zumindest kommt das am Logic-Analzyer an was ich sende. Dennoch 
ERROR-Passive. Aber ich nehme mal an das das der MCP2515 einfach n 
bisschen anders regelt als ein integrierter im imx. Deshalb gehe ich 
jetz mal davon aus das es daher kommt das einfach keine ACK-Meldung 
kommt.

: Bearbeitet durch User
von Gerhard (Gast)


Lesenswert?

Kenne die CAN Hardware von dir nicht. Hier nur zur Info:

Habe das CAN Interface usb2can von www.8devices.com. Hier klappt's bei 
mir folgendermaßen:

  sudo modprobe can_raw
  sudo modprobe can_dev
  sudo insmod /usr/local/lib/usb_8dev.ko
  sudo ip link set can0 up type can bitrate 500000 sample-point 0.875

und mit dem USBtin Interface von http://www.fischl.de/usbtin/
funktionierts so:

  modprobe can
  modprobe can-raw
  modprobe slcan

  slcan_attach -f -s6 -o /dev/ttyACM2
  slcand ttyACM2 can0
  sleep 2
  ifconfig can0 up

Da beide Interface über USB angeschlossen werden hilft es dir vielleicht 
nicht.

Gerhard

von Steffen R. (steffen_rose)


Lesenswert?

MCP2515 schrieb im Beitrag #4317215:
>>can state ERROR-PASSIVE
>
> In dem Zustand sollter er auch nichts senden..

Doch er sendet, sendet aber keine aktiven Error Bits mehr.

von temp (Gast)


Lesenswert?

Gerhard schrieb:
> und mit dem USBtin Interface von http://www.fischl.de/usbtin/
> funktionierts so:
>
>   modprobe can
>   modprobe can-raw
>   modprobe slcan
>
>   slcan_attach -f -s6 -o /dev/ttyACM2
>   slcand ttyACM2 can0
>   sleep 2
>   ifconfig can0 up

Kommt auch immer drauf an was man vor hat. Ich verwende das usbtin auch 
unter windows und linux. Dazu braucht es überhaupt keine 
can-Kernelmodule. Wenn man eine lib hat um mit der seriellen 
Schnittstelle umzugehen hat man schon gewonnen. Sowas sollte unter allen 
Sprachen zu finden sein. Socket Can hat halt den Nachteil nur unter 
Linux zu gehen. Raspi und MCP2515 ist wohl generell keine glückliche 
Konstellation.

von Gerhard (Gast)


Lesenswert?

temp schrieb:
> Ich verwende das usbtin auch
> unter windows und linux. Dazu braucht es überhaupt keine
> can-Kernelmodule. Wenn man eine lib hat um mit der seriellen
> Schnittstelle umzugehen hat man schon gewonnen.

Stimmt schon. Leider sind die can-utils, die es unter Linux für Socket 
Can gibt so ein mächtiger Werkzeugkasten. Ich möchte sie nicht missen 
und gäbe einiges dafür, ich hätte sie auch unter Windows zur Verfügung.

Gerhard

von Roland H. (blacksmoke)


Lesenswert?

Ja das stimmt. Es wäre wohl deutlich besser nen Beaglebone zu verwenden 
und einfach n Transceiver noch hin zu hängen. Ich bin n ziemlicher 
Linux-Fan und bin auch beruflich genau in dieser Ecke unterwegs 
(Embedded-Linux). Ich habe den 2515 genommen, da er überall verwendet 
wird und es eben besagten treiber als Modul bereits gibt und der 2515 
auch am Mikrocontroller gut laufen soll. Möchte damit evtl n paar 
versuche als Hausbus mit mehreren Mikrocontrollern (Atmel) und 
Embedded-Linux-Devices (ala Raspberry, Beaglebone) aufbauen. Hatte sowas 
in der Art schon mal mit RS485 aufgebaut. Nun eben mal in Can n bisschen 
einarbeiten, da es ja immer als relativ guter Bus für diese Zwecke 
angepriesen wird. Mit dem Raspberry habe ich es wie in der Anleitung 
beschrieben gemacht und anschließend

modprobe can
modprobe can-raw
ip link set can0 up type can bitrate 125000

und funktioniert wohl auch soweit einigermaßen. Alles weiter wird sich 
zeigen, wenn mehr als ein Teilnehmer dran hängt.

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.