Forum: Mikrocontroller und Digitale Elektronik socketCAN mcp2515 - rx buffer overflow Raspberry Pi


von Hakan D. (Firma: KIT) (ise1989)


Angehängte Dateien:

Lesenswert?

Hi,

Ich möchte gerne mit meinem Raspberry Pi CAN Daten von einem Long range 
term Radar auslesen. Hierfür hab ich folgendes modul mit mcp2515 
gekauft:

http://wiki.gnublin.org/index.php/MCP2515_CAN#RaspberryPi

Die Konfiguration habe ich auch wie im link Beschrieben befolgt, jedoch 
habe ich nicht die erwünschten Ergebnisse.
Mein CAN Bus läuft mit 500kb/s. Ist auch die richtige Baudrate. Ich 
bekomme zwar meine Daten jedoch sieht es ganz komisch aus. Ich erhalte 
an einigen Zeilen die ERRORFRAME Meldung mit rx buffer overflow. Was 
weiterhin mich stört sind die Null Zeilen die ich erhalte.

nach eingabe folgender befehle:

ip link set can0 type can bitrate 500000
ip link set can0 up


--------------------------------------------------------
Erhalte ich folgendes:

$ ip -details -statistics link show can0
4: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN 
qlen 20
    link/can
    can state ERROR-ACTIVE restart-ms 0
    bitrate 500000 sample-point 0.875
    tq 125 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          0          0          0
    RX: bytes  packets  errors  dropped overrun mcast
    13086      2308     213     0       213     0
    TX: bytes  packets  errors  dropped carrier collsns
    0          0        0       0       0       0


--------------------------------------------------------

dmesg output:

can: controller area network core (rev 20090105 abi 8)
NET: Registered protocol family 29
CAN device driver interface
can: raw protocol (rev 20090105)
PM: Adding info for No Bus:can0
mcp251x spi1.0: probed
mcp251x spi1.0: CNF: 0x00 0xb5 0x01
PM: Adding info for No Bus:vcs3
PM: Adding info for No Bus:vcsa3
eth0: no IPv6 routers present


--------------------------------------------------------

Als beispiel ein paar daten vom Candump:

 candump -ta -d -e any,0:0,#FFFFFFFF
 (125.351573)  can0     15004  [2] 00 00
 (126.193767)  can0    400060  [4] FF FF 00 00
 (126.194163)  can0    600060  [4] FF FF 00 00
 (126.194469)  can0  20000004  [8] 00 01 00 00 00 00 00 00   ERRORFRAME
        controller-problem{rx-overflow}
 (126.194743)  can0    E00060  [4] FF FF 00 00
 (126.195018)  can0   1200060  [4] FF FF 00 00
 (126.195323)  can0   1800060  [4] FF FF 00 00
 (126.195567)  can0  20000004  [8] 00 01 00 00 00 00 00 00   ERRORFRAME
        controller-problem{rx-overflow}
 (126.195842)  can0      5067  [6] 01 00 00 00 00 00
 (126.196086)  can0   1A00060  [4] FF FF 00 00
 (126.196361)  can0  20000004  [8] 00 01 00 00 00 00 00 00   ERRORFRAME
        controller-problem{rx-overflow}
 (126.196635)  can0    200060  [4] FF FF 00 00
 (126.196818)  can0      D067  [6] 01 00 00 00 00 00
 (126.197093)  can0      F066  [6] 01 00 00 00 00 00
 (126.197337)  can0  20000004  [8] 00 01 00 00 00 00 00 00   ERRORFRAME
        controller-problem{rx-overflow}
 (126.197673)  can0      7067  [6] 01 00 00 00 00 00
 (126.197978)  can0      B067  [6] 01 00 00 00 00 00
 (126.198253)  can0     19066  [6] 01 00 00 00 00 00
 (126.198558)  can0     1B066  [6] 01 00 00 00 00 00
 (126.198894)  can0     11066  [6] 01 00 00 00 00 00
 (126.199168)  can0      3067  [6] 01 00 00 00 00 00
 (126.199443)  can0  20000004  [8] 00 01 00 00 00 00 00 00   ERRORFRAME
        controller-problem{rx-overflow}
 (126.199718)  can0     17066  [6] 01 00 00 00 00 00
 (126.199931)  can0     1D066  [6] 01 00 00 00 00 00
 (126.200328)  can0     1F066  [6] 01 00 00 00 00 00
^C$



Leider weiss ich nicht mehr was ich ab hier machen kann.
An was liegt dieser overflow? Ich bin ziemlich unerfahren in Sachen CAN. 
Liegts an meiner Hardware bzw. an dem GNUBLIN Modul? Würdet Ihr mir was 
bessere als den GNUBLIN empfehlen?

Danke im Vorraus
Ise_1989

von dunno.. (Gast)


Lesenswert?

Rx Overflow ist, wenn du die receive buffer des MCP nicht schnell genug 
leerst.
Benutzt der Treiber Interrupts, oder wird gepollt?
Falls letzteres, ist das schon dein Problem.

von Hakan D. (Firma: KIT) (ise1989)


Lesenswert?

Hallo dunno,
die Treiber liegen im Kernel:

http://gnublin.googlecode.com/files/rpi_kernel_can.tar.gz

kenn mich damit leider nicht aus :( . Um was genaues zu sagen. Vielen 
dank für die schnelle Rückmeldung.

von Frank K. (fchk)


Lesenswert?

Du hast Dir die falsche Hardware ausgesucht. Zum einen ist der MCP2515 
nicht der leistungsfähigste Controller (selbst aktuelle PICs haben 
heutzutage besseres eingebaut), und dann ist da noch der Flaschenhals 
namens SPI dazwischen.

Nimm besser einen BeagleBone Black. Der dort verwendete Prozessor hat 
CAN bereits eingebaut. Du musst nur noch einen CAN-Transceiver mit 3.3V 
Logikspannung wie zB MAX13054 an Pin 24/26 (dcan1_tx/dcan1_rx) 
anschließen oder Dir ein CAN Bus Cape ("Capes" sind die 
Erweiterungsboards, so was wie die "Shields" bei Arduino) besorgen. Da 
der CAN Bus Controller direkt im Prozessor drin ist, gibts da keine 
unnötigen Bremsen.

fchk

von dunno.. (Gast)


Lesenswert?

Also bei nem 500k can sollte man selbst mit nem 2515 noch alle frames 
kriegen.
Klar ist das mit dem SPI ein ziemlicher Flaschenhals, aber der rpi 
sollte das doch wohl schaffen..

Klemm mal n oszi dran und schau dir die Latenzen zwischen interrupt und 
Reaktion des rpis an. Danach schau was der Treiber macht.
Zur not halt ein eigener Treiber. Ist eh cool wenn man weiß wie das 
geht.

Ich denke nicht, dass man das Problem sofort mit ner Hardwareschlacht 
lösen muss.

Als allerletzte Notlösung: vielleicht kannst du den Sender drosseln?

von Hakan D. (Firma: KIT) (ise1989)


Lesenswert?

Vielen Dank nochmals..

Nach mehrmaligen rumspielen mit dem Kernels

http://gnublin.googlecode.com/files/rpi_kernel_can.tar.gz

und

http://lnxpps.de/rpie/can-test.tar.bz2

habe ich es nun zum Laufen bekommen (hoffe ich). Auf beiden Seiten wird 
das alte libsocketcan verwendet inzwischen gibts den 10er

http://www.pengutronix.de/software/libsocketcan/download/libsocketcan-0.0.10.tar.bz2

Wie gesagt das ist ein Projekt und ich Weiss nicht ob die Can Ausgaben 
richtig oder falsch sind.

Die AUSGABE sieht wie folgt aus :

pi@raspberrypi ~/gps/output/2014-12-28 $ sudo candump -tA -c -d any
 (2014-12-28 05:46:03.990666)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.011946)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.014815)  can0  794   [8]  00 00 00 00 00 00 33 33
 (2014-12-28 05:46:04.017642)  can0  795   [8]  AA 65 88 FF 00 76 01 00
 (2014-12-28 05:46:04.020804)  can0  796   [8]  56 00 00 00 33 37 79 84
 (2014-12-28 05:46:04.029672)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.050797)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.071803)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.089886)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.110803)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.112308)  can0  794   [8]  00 00 00 00 00 00 33 33
 (2014-12-28 05:46:04.113945)  can0  795   [8]  AA 63 8A FF 00 77 01 00
 (2014-12-28 05:46:04.116654)  can0  796   [8]  56 00 00 00 33 38 79 84
 (2014-12-28 05:46:04.131929)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.149860)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.170647)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.191655)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.209660)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.212617)  can0  794   [8]  00 00 00 00 00 00 33 33
 (2014-12-28 05:46:04.215662)  can0  795   [8]  AA 64 8A FF 00 77 01 00
 (2014-12-28 05:46:04.218566)  can0  796   [8]  56 00 00 00 33 39 79 84
 (2014-12-28 05:46:04.230660)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.251728)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.269659)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.290665)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.308616)  can0  794   [8]  00 00 00 00 00 00 33 33
 (2014-12-28 05:46:04.311712)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.313305)  can0  795   [8]  AA 65 8B FF 00 78 01 00
 (2014-12-28 05:46:04.315376)  can0  796   [8]  56 00 00 00 33 3B 79 84
 (2014-12-28 05:46:04.329674)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.350711)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.371708)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.389670)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.410676)  can0  797   [8]  00 00 00 00 00 00 00 00
 (2014-12-28 05:46:04.413609)  can0  794   [8]  00 00 00 00 00 00 33 33
 (2014-12-28 05:46:04.416643)  can0  795   [8]  AA 65 8B FF 00 78 01 00
 (2014-12-28 05:46:04.419973)  can0  796   [8]  56 00 00 00 33 3B 79 84


Hier ist zu Beobachten, dass sich die Zeilen wiederholen
00 00 00 00 00 00 00 00
00 00 00 00 00 00 33 33
AA 65 88 FF 00 76 01 00  <--- Bis auf diese es verändert sich
56 00 00 00 33 37 79 84
-----------------------------------------------------------------------

Damit wir eine Übersicht haben, habe ich Zeile mit AA nur dargestellt
1
pi@raspberrypi ~/gps/output/2014-12-28 $ sudo candump -tA -c -d any,1:23
2
 (2014-12-28 05:48:49.207177)  can0  795   [8]  AA 62 87 FF 00 75 01 00
3
 (2014-12-28 05:48:49.305468)  can0  795   [8]  AA 64 87 FF 00 75 01 00
4
 (2014-12-28 05:48:49.404480)  can0  795   [8]  AA 63 87 FF 00 75 01 00
5
 (2014-12-28 05:48:49.497463)  can0  795   [8]  AA 63 87 FF 00 75 01 00
6
 (2014-12-28 05:48:49.599421)  can0  795   [8]  AA 64 85 FF 00 75 01 00
7
 (2014-12-28 05:48:49.695421)  can0  795   [8]  AA 62 85 FF 00 74 01 00
8
 (2014-12-28 05:48:49.794450)  can0  795   [8]  AA 64 83 FF 00 74 01 00
9
 (2014-12-28 05:48:49.890473)  can0  795   [8]  AA 63 84 FF 00 73 01 00
10
 (2014-12-28 05:48:49.992467)  can0  795   [8]  AA 65 81 FF 00 73 01 00
11
 (2014-12-28 05:48:50.088988)  can0  795   [8]  AA 64 81 FF 00 73 01 00
12
 (2014-12-28 05:48:50.190503)  can0  795   [8]  AA 64 81 FF 00 73 01 00
13
 (2014-12-28 05:48:50.289455)  can0  795   [8]  AA 64 82 FF 00 73 01 00
14
 (2014-12-28 05:48:50.388963)  can0  795   [8]  AA 62 82 FF 00 72 01 00
15
 (2014-12-28 05:48:50.487950)  can0  795   [8]  AA 64 83 FF 00 73 01 00
16
 (2014-12-28 05:48:50.586926)  can0  795   [8]  AA 62 86 FF 00 74 01 00
17
 (2014-12-28 05:48:50.685452)  can0  795   [8]  AA 64 85 FF 00 75 01 00
18
 (2014-12-28 05:48:50.784443)  can0  795   [8]  AA 62 86 FF 00 74 01 00
19
 (2014-12-28 05:48:50.880455)  can0  795   [8]  AA 62 86 FF 00 74 01 00
20
 (2014-12-28 05:48:50.985496)  can0  795   [8]  AA 62 87 FF 00 75 01 00
21
 (2014-12-28 05:48:51.081508)  can0  795   [8]  AA 62 87 FF 00 75 01 00
22
 (2014-12-28 05:48:51.183438)  can0  795   [8]  AA 63 85 FF 00 74 01 00
23
 (2014-12-28 05:48:51.279426)  can0  795   [8]  AA 63 85 FF 00 74 01 00
24
 (2014-12-28 05:48:51.381556)  can0  795   [8]  AA 64 85 FF 00 74 01 00
25
 (2014-12-28 05:48:51.477565)  can0  795   [8]  AA 62 85 FF 00 74 01 00
26
 (2014-12-28 05:48:51.582410)  can0  795   [8]  AA 64 86 FF 00 75 01 00
27
 (2014-12-28 05:48:51.678416)  can0  795   [8]  AA 62 89 FF 00 76 01 00
28
 (2014-12-28 05:48:51.783590)  can0  795   [8]  AA 61 88 FF 00 75 01 00
29
 (2014-12-28 05:48:51.882452)  can0  795   [8]  AA 61 88 FF 00 75 01 00
30
--------------------------------------------------------------------

Es sieht etwas besser aus...
Mit dem Befehl:

pi@raspberrypi ~ $ sudo ip -details -statistics link show can0
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN 
mode DEFAULT qlen 10
    link/can
    can state ERROR-ACTIVE restart-ms 0
    bitrate 500000 sample-point 0.875
    tq 125 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          0          0          0
    RX: bytes  packets  errors  dropped overrun mcast
    620112     77514    9       0       9       0
    TX: bytes  packets  errors  dropped carrier collsns
    0          0        0       0       0       0

9 overrun/Fehlermeldungen bei 77514 Paketen ist OK denke ich. Können 
diese Fehler auch durch die Unterbrechungen mit STRG+C auftreten ? Denn 
dann müsste es etwa hinhauen, da ich candump etwa 8-9 mal aufgerufen 
habe.



@Frank: Ja es mag sein, dass ich die falsche Hardware ausgesucht habe.. 
Nun ist es so, dass ich in meinem Projekt die Implementierung der CAN 
Daten die letzte Hürde ist. D.h. ein Umstieg würde mich sehr viel Zeit 
und nochmals Nerven kosten. Aber für die Zukunft bin ich nun schlauer :D

@dunno: Ich bin ein stink normaler Student ^^ Einen Oszi habe ich leider 
nicht.. vielleicht später mal :)
Falls einer von euch nähe Karlsruhe-Pforzheim wohnt und nen Oszi besitzt 
sehr gerne :D

@ALL:
Ich wüsste nur gerne ob die CAN Daten richtig sind... Mir ist klar, dass 
man nicht sofort erkennen kann ob es ein richtig oder falsch gibt. Ich 
würd e gerne von euch wissen, ob dieses Outputs "richtig" aussehen.

Diese Can Daten sind von einem Radar Sensor, welches die
Entfernung, Geschwindigkeit in x y Achse und die Beschleunigung angibt. 
Wobei die Aufgezeichneten Daten natürlich in Ruhe Zustand sind.

Ein Paar Fragen habe ich noch:
1.Kann es mal vorkommen das man falsche CAN DATEN hat?
2.Wieso bekomme ich so viele Nullen?
  Hat das was mit dem overflow zutun?
3.Für was steht die 8 in Eckigen Klammern? [8]
4.Für was steht die Zahl 795 vor dieser Eckigen Klammer?


Vielen Dank nochmals!!

Ich bin sehr froh darüber dieses Forum gefunden zu haben :D
Leider sind in den meisten Foren eine qualitative Antwort zu bekommen 
eine Seltenheit.

: Bearbeitet durch User
von dunno.. (Gast)


Lesenswert?

Was die Interpretation der Daten angeht, da muss natürlich das 
Datenblatt deines radar-sensors Auskunft geben. Btw, was ist das 
eigentlich fürn ding? Klingt ja spannend..

Die [8] ist imho einfach die zahl der dargestellten bytes.. ;)

795..can Identifier vielleicht? Es sollte doch ein manpage zu candump 
geben..?


Falsche can Daten: weiß nicht was du meinst, can hat jedenfalls 
Mechanismen um Übertragungsfehler auszuschließen Bzw zu erkennen. Du 
bekommst als schon das was gesendet wurde.

von Hakan D. (Firma: KIT) (ise1989)



Lesenswert?

Hi, nochmals ich

Leider bekomme ich die rx-overflow Meldung weiterhin.

Das Letzte mal hab ich ein anderes Can-bus Anschluss genommen gehabt 
(siehe Bild).

Sehr komisch das eigentlich Beide Can-Anschlüsse unterschiedliche Sachen 
rausgeben.

Ich habe nun auch den PICAN
http://skpang.co.uk/catalog/pican-canbus-board-for-raspberry-pi-p-1196.html

leider erfolglos bekomme ich auch hier die selbe Fehlermeldung 
rx-overflow


-----------------------------------------------------------------------

Ist es wirklich sinnvoll den BeagleBone Black zu nehmen?

Wenn ja wie lange dauert es mich da einzuarbeiten? Ich habe gelesen, 
dass Ubuntu läuft.. Gibt es gute Anleitungen hierzu mit dem Can Bus?

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Hakan Demirel schrieb:

> Ist es wirklich sinnvoll den BeagleBone Black zu nehmen?

Wie gesagt, ich hätte den PI gleich links (oder rechts) liegen gelassen.

> Wenn ja wie lange dauert es mich da einzuarbeiten? Ich habe gelesen,
> dass Ubuntu läuft.. Gibt es gute Anleitungen hierzu mit dem Can Bus?

Wenn Du den PI kennst, solltest Du mit dem BBB auch keine Probleme 
haben. Pass auf, dass Du die Rev C mit 4GB EMMC bekommst. Die wird mit 
Debian ausgeliefert, aber Du kannst auch Angstrøm haben.

CAN funktioniert im Userspace genauso mit SocketCAN.

Das ist das CAN Cape:
http://elinux.org/CircuitCo:CAN_Bus_Cape_RevA
Es gibt mittlerweile Rev B.
Farnell hat das Zeugs.

fchk

von Hakan D. (Firma: KIT) (ise1989)


Angehängte Dateien:

Lesenswert?

Ich habe nicht aufgegeben :D

nach langer Recherche und rumbastelei habe ich einen How To erstellt. 
Ich hoffe das es einigen hilfreich sein wird um den MCP2515 Treiber 
benutzen zu können. Das Overflow Problem wird dadurch behoben, da man 
den langsameren MCP251x nicht benutzt.

Auch mit aktuellen RPI Kernels ist es möglich den MCP2515 zu benutzen.

Gruß ise1989

Vielen Dank an dunno, der mich auf die richtige Spur gebracht hat ;)
und Danke Frank das nächste mal hol ich mir nen BeagleBone Black :D

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Hallo ise1989,

vielen Dank für deine Mühe und dein pdf - funktioniert auf Anhieb!

Gruß Martin

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Hallo,

wer sich mit dem CAN-Bus geschäftigen möchte, der sollte einen Bogen um 
die momentanen RPi-CAN-Bus Boards (basierend auf SPI-MCP2515) machen und 
sich stattdessen das wesentlich bessere (in Bezug auf Schnittstellen) 
BeagleBone Black kaufen. Ein einfacherer Tranceiver reicht und man hat 
einen performanten und stabilen CAN-Bus.


Gruß

Gerd

von Mathias Köppchen (Gast)


Lesenswert?

Hallo Zusammen,
wir haben vor kurzem gute Erfahrungen mit der mcp2515 Implementierung 
aus dem Mailline Kernel (5.12-rc8) mit dem RPi3 gemacht. Der Kernel für 
das raspberry pi 3 ist dann aus dem foundation repo. Wer es mal tesen 
möchte:
https://github.com/pyavitz/rpi-img-builder/releases/download/images/rpi-3-ubuntu-hirsute-5.12.0-rc8-v7-2021-04-23.img.xz

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Kann ich bestätigen. Die Treiber Situation hat sich wesentlich 
gebessert. Die früheren Probleme (Paketverluste, hängender Treiber) sind 
behoben worden. Ursache war insbesondere das Linux damals den Interrupt 
(Interrupt Level Low) im Gegensatz zu heute nicht unterstützte.

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.