Hallo liebe Community,
Projekt:
ich versuche momentan den MCP2515 Can transceiver über den myRIO von
NationalInstruments ans laufen zu bekommen.
Zu dem Zweck versuche ich die C-Bibliothek, welche es für den Arduino
gibt in Labview zu übersetzen.
Status:
Aktuell versuche ich zu überprüfen ob die Kommunikation mittels SPI
"erfolgreich" abläuft indem ich zum einen die Daten welche vom Arduino
über den SPI bus gesendet werden mit denen vom myRio zu vergleichen. Als
debug tool nutze ich einen Digital Analyzer (salea).
Fehler:
Ich sende den selben "Satz" an Daten mit dem myRIO so wie ich ihn vom
Arduino beim initialisieren des Transceivers getraced habe. Leider
bekomme ich auf der MISO Leitung nicht das selbe Rücksignal so wie ich
es beim Arduino bekomme.
In den beiden Bildern habe ich mal den Signalverlauf vom myRIO mit dem
vom Arduino verglichen. Ich bin der Meinung, dass die SPI Kommunikation
richtig eingestellt ist.
Ich kann zwischen beiden Signalen nur einen Unterschied feststellen
(siehe Bild 2) und zwar, dass der myRio natürlich etwas langsamer agiert
(Zeit zwischen CS fallend bis zur ersten Flanke der SCK). Hier fehlt mir
leider die Erfahrung ob das ok ist oder zu meinem Problem führen kann.
Bilder:
1: Links Arduino, Rechts myRIO. oranger Rahmen: betrachtete Daten. roter
Rahmen: Klar zu sehen, dass beim Arduino etwas auf der MISO Leitung
zurück kommt. Beim myRIO würde ich das selbe erwarten.
2: der myRIO ist wohl deutlich langsamer. Kann so etwas zu meinem
Problem führen ?
Vielen Dank schon mal fürs durchlesen :) Ich wäre echt happy wenn jemand
ne Idee hätte wo ich weiter suchen könnte. Ich bin auch schon froh wenn
irgend jemand eine Vermutung hat.
Gruß,
Max
Max schrieb:> der myRIO ist wohl deutlich langsamer. Kann so etwas zu meinem> Problem führen ?
Bei einem SPI-Slave ist (zu niedrige) Geschwindigkeit eigentlich kein
Problem.
Hat das myRIO nicht auch explizit eine SPI-Schnittstelle?
@ Max (Gast)
>Aktuell versuche ich zu überprüfen ob die Kommunikation mittels SPI>"erfolgreich" abläuft indem ich zum einen die Daten welche vom Arduino>über den SPI bus gesendet werden mit denen vom myRio zu vergleichen. Als>debug tool nutze ich einen Digital Analyzer (salea).
Kann man machen.
>Ich sende den selben "Satz" an Daten mit dem myRIO so wie ich ihn vom>Arduino beim initialisieren des Transceivers getraced habe. Leider>bekomme ich auf der MISO Leitung nicht das selbe Rücksignal so wie ich>es beim Arduino bekomme.
Dann stimmt was nicht.
>In den beiden Bildern habe ich mal den Signalverlauf vom myRIO mit dem>vom Arduino verglichen. Ich bin der Meinung, dass die SPI Kommunikation>richtig eingestellt ist.
Sicht so aus, SPI Mode 0, Abtastung auf der steigenden Flanke,
Datenausgabe auf der fallenden Flanke.
>Ich kann zwischen beiden Signalen nur einen Unterschied feststellen>(siehe Bild 2) und zwar, dass der myRio natürlich etwas langsamer agiert>(Zeit zwischen CS fallend bis zur ersten Flanke der SCK). Hier fehlt mir>leider die Erfahrung ob das ok ist oder zu meinem Problem führen kann.
Das ist egal, da SPI synchron arbeitet.
>1: Links Arduino, Rechts myRIO. oranger Rahmen: betrachtete Daten. roter>Rahmen: Klar zu sehen, dass beim Arduino etwas auf der MISO Leitung>zurück kommt. Beim myRIO würde ich das selbe erwarten.
Sollte so sein.
>2: der myRIO ist wohl deutlich langsamer. Kann so etwas zu meinem>Problem führen ?
Nein.
Möglicherweise hast du eine schlechte, wilde Verdrahtung und die Signale
sehen mies aus. Das sieht man nur bei gescheiter Messung mit dem Oszi,
nicht mit dem Logicanalyzer.
@Norbert:
ja hat der myRIO. Ich nutze das SPI interface und die dazugehörigen SPI
VIs
@Falk:
Falk B. schrieb:> Möglicherweise hast du eine schlechte, wilde Verdrahtung und die Signale> sehen mies aus. Das sieht man nur bei gescheiter Messung mit dem Oszi,> nicht mit dem Logicanalyzer.
Ich nutze für beie Tools die selbe Verdrahtung, ich stecke praktisch
einfach nur die PINs zwischen Arduino und myRIO um.
Ein Oszi habe ich leider nicht, aber ich würde doch erwarten, dass wenn
der Analyzer das Signal interpretieren kann, dass es dann auch
einigermaßen richtig kommen muss.
Habe auch schon überprüft ob die MISO Leitung vom myRIO überhaupt geht
in dem ich das MOSI Signal zurückschleife. -> Geht ohne Probleme.
@Max (Gast)
>Ich nutze für beie Tools die selbe Verdrahtung, ich stecke praktisch>einfach nur die PINs zwischen Arduino und myRIO um.
Zeig mal ein Bild von deinem Aufbau.
@Max (Gast)
>Reicht dir das so als Überblick?
Hmm, unten ist der Logicanalyzer, der hat aber keine Masseverbindung zum
MCP2515. Möglicherweise entstehen durch die extrem lange und
HF-untaugliche Masseanbindung des Logicanalyzers Störungen auf den
Signalen.
Ich nehme an, daß die rot/schwarze Leitung zum RIO die Stromversorgung
für das Board ist. Geht so, auch wenn das nicht optimal ist.
Der Rest scheint OK.
Falk B. schrieb:> Hmm, unten ist der Logicanalyzer, der hat aber keine Masseverbindung zum> MCP2515. Möglicherweise entstehen durch die extrem lange und> HF-untaugliche Masseanbindung des Logicanalyzers Störungen auf den> Signalen.>> Ich nehme an, daß die rot/schwarze Leitung zum RIO die Stromversorgung> für das Board ist. Geht so, auch wenn das nicht optimal ist.>> Der Rest scheint OK.
Genau. Rot und schwarz ist die Stromversorgung.
Hab den Analyzer mal komplett raus genommen und direkt mit Labview die
MISO Signale eingelesen. Leider genau das selber Ergebnis wie mit
Analyzer.
Meinst du wirklich es liegt an der Verdrahtung ?
Ich nutze ja für den Arduino die selbe.
@Max (Gast)
>Meinst du wirklich es liegt an der Verdrahtung ?
Wahrscheinlich nicht, aber das wissen wir erst jetzt. Ich hab hier schon
die tollsten "Kunstwerke" gesehen ;-)
@Max (Gast)
>https://www.saleae.com/downloads>Falls du dir die Mühe machen willst :) Ist n kleines Tool
107 MB für ein bissel Logicanalyzer? Kleines Tool? Nein, ich hab kein
Modem mehr, aber trotzdem.
Naja. So wie ich das sehe, stimmt dein Chip Select Signal beim RIO
nicht! Jeder SPI-Zugriff beim Arduino hat exakt 4 Bytes, beim RIO ist am
Anfang nur ein Byte in einem zugriff, dazwischen geht CS auf HIGH. Das
geht natürlich nicht. Da ist was um 1 Byte versetzt zum CS. Liegt
wahrscheinlich an deinem NI Treiber oder deiner Nutzung de selbigen. Du
darfst CS erst dann verändern, wenn du SICHER weißt, daß alle Bytes
transferiert worden. Je nach Treiber kann das nervig sein. Zum Test
kannst du ja erstmal lange Pausen reinmachen, 100ms++.
@falk
Falk B. schrieb:> Naja. So wie ich das sehe, stimmt dein Chip Select Signal beim RIO> nicht! Jeder SPI-Zugriff beim Arduino hat exakt 4 Bytes, beim RIO ist am> Anfang nur ein Byte in einem zugriff, dazwischen geht CS auf HIGH. Das> geht natürlich nicht. Da ist was um 1 Byte versetzt zum CS. Liegt> wahrscheinlich an deinem NI Treiber oder deiner Nutzung de selbigen. Du> darfst CS erst dann verändern, wenn du SICHER weißt, daß alle Bytes> transferiert worden. Je nach Treiber kann das nervig sein. Zum Test> kannst du ja erstmal lange Pausen reinmachen, 100ms++.
Muss ehrlich gestehen so ganz verstehe ich nicht was du meinst. Aber das
ist so gewollt, dass der CS zwischendurch auf High geht weil dann ein
neuer Befehl beginnt.
Mit 192 wird der MCP resettet, im nächsten Schritt wird das Register mit
der Adresse 15 gesetzt, welches ich dann im dritten Schritt auslese um
zu überprüfen ob es auf den gewünschten Wert gesetzt wurde. Als Antwort
würde ich vom MCP bei der letzten 0 als Antwort eine 135 erwarten, dann
wäre alles ok.
@ Max (Gast)
>Muss ehrlich gestehen so ganz verstehe ich nicht was du meinst.
Schade.
> Aber das>ist so gewollt, dass der CS zwischendurch auf High geht weil dann ein>neuer Befehl beginnt.>Mit 192 wird der MCP resettet, im nächsten Schritt wird das Register mit>der Adresse 15 gesetzt, welches ich dann im dritten Schritt auslese um>zu überprüfen ob es auf den gewünschten Wert gesetzt wurde. Als Antwort>würde ich vom MCP bei der letzten 0 als Antwort eine 135 erwarten, dann>wäre alles ok.
Hmm, jetzt sehe ich es auch, durch den großen Abstand des 1. Resets hab
ich das übersehen. Damit ist der Datenstrom vom RIO eigentlich OK,
trotzdem kommt die falsche Antwort. Merkwürdig.
Hab soeben folgende Aussage im Internet gefunden. Evtl. hat das ganze
doch etwas mit der Geschwindigkeit/Zuverlässigkeit zu tun. Deshalb werde
ich jetzt mal versuchen das ganze über den FPGA zu implementieren.
Bisher habe ich es über das RT OS vom ARM laufen lassen.
"I would have to strongly advise against doing this through RT instead
of the FPGA. The scan engine period is only reliable down to about 1ms,
which is too slow to be used at standard speeds for either communication
protocol. The maximum typical SPI clock frequency is 50 kHz and the
slowest standard speed for I2C is 100 kHz. RT is designed to be
deterministic, but not necessarily fast -- the FPGA is where this type
of communication should be done."
@Max (Gast)
>Hab soeben folgende Aussage im Internet gefunden. Evtl. hat das ganze>doch etwas mit der Geschwindigkeit/Zuverlässigkeit zu tun.
Nein.
> Deshalb werde>ich jetzt mal versuchen das ganze über den FPGA zu implementieren.
Kann man machen, macht die Sache aber nicht besser, nur schneller.
>Bisher habe ich es über das RT OS vom ARM laufen lassen.
Das sollte reichen.
Hast du das Register CANCTRL mal direkt nach dem Powerup ausgelesen , da
düfte ja keine 255 kommen. Nicht das hier der MISO bei dir nicht als
Eingang definiert ist o.ä. Wenn hier auch schon eine 255 kommt , dann
stimmt was bei der Verbindung nicht.
Gruß Jackfrost
Bastian W. schrieb:> Hast du das Register CANCTRL mal direkt nach dem Powerup ausgelesen , da> düfte ja keine 255 kommen. Nicht das hier der MISO bei dir nicht als> Eingang definiert ist o.ä. Wenn hier auch schon eine 255 kommt , dann> stimmt was bei der Verbindung nicht.
Hey jackfrost, das werd ich direkt morgen mal ausprobieren. Du meinst
nach dem ersten spannungsanlegen direkt das CANCTRL register auslesen
richtig?
Bastian W. schrieb:> Genau , dann dürften ja nur die drei höchsten Bit gesetzt sein.
Habe zum Spaß mal die ersten 255 Register ausgelesen. Angeblich alle auf
255 ...
Hab auch nochmal MOSI und MISO gebrückt, bekomme einwandfrei meine
Signale zurück.
Den zweiten SPI Port vom myRIO hergenommen. Auch kein anderes Ergebnis.
Zweiter MCP2515 getestet. Auch selbes Ergebnis.
So langsam gehen mir die Ideen aus.
Hmm, wenn man Pech hat ist es ein dreckiges HF-Problem mit winzigen
Störungen auf dem Taktsignal. Versuch mal die Leitungen zwischen RIO und
MCP auf unter 5cm zu kürzen.
Der MCP2515 hängt an den 5V vom my RIO , oder ?
Nimm mal die 3,3V Versorgung wenn die stark genug ist.
Die Ports sind ja 3,3V ggf reicht es grad nicht das der MCP die high
Flanken sieht.
Gruß JackFrost
Falk B. schrieb:> Hmm, wenn man Pech hat ist es ein dreckiges HF-Problem mit winzigen> Störungen auf dem Taktsignal. Versuch mal die Leitungen zwischen RIO und> MCP auf unter 5cm zu kürzen.
Werd ich versuchen.
Wenn ich folgenden Code auf dem Arduino laufen lasse, also einfach nur
eine simple Registerabfrage per SPI dann bekomme ich eine Antwort. Also
würde ich jetzt generell mal ausschließen, dass es am Befehl oder am
Transceiver liegt. Es muss also einen Unterschied im Signal zwischen RIO
und Arduino geben.
Bastian W. schrieb:> Der MCP2515 hängt an den 5V vom my RIO , oder ?> Nimm mal die 3,3V Versorgung wenn die stark genug ist.> Die Ports sind ja 3,3V ggf reicht es grad nicht das der MCP die high> Flanken sieht.
Halleluja, es geht!!!
Ich dachte das hätte ich auch schon probiert. Jetzt versteh ich aber
nicht ganz wieso ich beim Arduino mit 5V arbeiten kann und beim RIO
nicht. Kannst du mir mal für "Idioten" erklären was genau da schief
läuft ?
Der Arduiono hat auch 5V Ports damit ist hier ein high auch 5V.
Der myRIO hat aber 3,3V Aausgänge und der MCP braucht an CS und SCK
mindestens 0,7xVDD also 3,5V. Also hat der MCP das high vom Takt und CS
nicht gesehen. Bei 3,3V VDD ist das dann je kein Pronlem mehr.
Gruß JackFrost