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 ;-)
@Falk Anbei mal die Dateien vom Analyzer. Meinst du du könntest mal einen kurzen Blick drauf werfen ?
@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?
Genau , dann dürften ja nur die drei höchsten Bit gesetzt sein. Gruß JackFrost
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.
1 | #include "mcp_can.h" |
2 | #include <SPI.h> |
3 | #include <Wire.h> |
4 | #include "RTClib.h" |
5 | |
6 | RTC_DS1307 RTC; |
7 | MCP_CAN CAN0(10); // Set CS to pin 10 |
8 | int k=0; |
9 | |
10 | void setup() |
11 | {
|
12 | Serial.begin(9600); |
13 | SPI.begin(); |
14 | digitalWrite(10, HIGH); |
15 | // init can bus, baudrate: 500k
|
16 | //if(CAN0.begin(CAN_500KBPS) == CAN_OK) Serial.print("can init ok!!\r\n");
|
17 | // else Serial.print("Can init fail!!\r\n");
|
18 | }
|
19 | |
20 | |
21 | int n=0; |
22 | int m=0; |
23 | int l=0; |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | void loop() |
30 | {
|
31 | //CAN0.mcp2515_readRegister(16);
|
32 | digitalWrite(10, LOW); |
33 | n = SPI.transfer(3); |
34 | m = SPI.transfer(15); |
35 | l = SPI.transfer(0); |
36 | digitalWrite(10, HIGH); |
37 | |
38 | Serial.println(n); |
39 | Serial.println(m); |
40 | Serial.println(l); |
41 | }
|
42 | |
43 | }
|
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
Bin halt doch nur Hobbyist und kein Profi ;) Dank euch für eure Hilfe.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.