Forum: Mikrocontroller und Digitale Elektronik MCP2515 SPI Kommunikation myRIO vs. Arduino


von Max (Gast)


Angehängte Dateien:

Lesenswert?

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

von Norbert (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@ 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.

von Max (Gast)


Lesenswert?

@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.

von Falk B. (falk)


Lesenswert?

@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.

von Max (Gast)


Angehängte Dateien:

Lesenswert?

Reicht dir das so als Überblick?

von Falk B. (falk)


Lesenswert?

@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.

von Max (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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 ;-)

von Max (Gast)


Angehängte Dateien:

Lesenswert?

@Falk

Anbei mal die Dateien vom Analyzer. Meinst du du könntest mal einen 
kurzen Blick drauf werfen ?

von Falk B. (falk)


Lesenswert?

Das Datenformat kann ich nicht lesen.

von Max (Gast)


Lesenswert?

https://www.saleae.com/downloads
Falls du dir die Mühe machen willst :) Ist n kleines Tool

von Falk B. (falk)


Lesenswert?

@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++.

von Max (Gast)


Angehängte Dateien:

Lesenswert?

@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.

von Falk B. (falk)


Lesenswert?

@ 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.

von Max (Gast)


Lesenswert?

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."

von Falk B. (falk)


Lesenswert?

@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.

von Bastian W. (jackfrost)


Lesenswert?

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

von Max (Gast)


Lesenswert?

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?

von Bastian W. (jackfrost)


Lesenswert?

Genau , dann dürften ja nur die drei höchsten Bit gesetzt sein.

Gruß JackFrost

von Max (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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.

von Bastian W. (jackfrost)


Lesenswert?

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

von Max (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Max (Gast)


Lesenswert?

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 ?

von Bastian W. (jackfrost)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

AUTSCH!!!!

Siehe Pegelwandler!!!!

von Max (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.