LabVIEWForum.de - SPI - Correlated DIO

LabVIEWForum.de

Normale Version: SPI - Correlated DIO
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen.
Ich bin kurz davor, dass ich mein erstes größeres LabView Projekt fertig stelle. Ca 90% des Programmes hab ich, dabei geht es hauptsächlich um Messgerätesteuerung, Messdatenerfassung, schalten von Relais,... .
Der letzte Teil bereitet mir aber seit Tagen Kopfzerbrechen. Ich muss noch mit einer elektronischen Baugruppe über SPI kommunizieren.

Zur HW: Ein USB-8451 von NI hatten wir im Haus, kann aber nicht verwendet werden, da die Taktfrequenz 600Hz (bis max. 1kHz) sein muss. (die min. Freq. vom 8451 liegt bei 12MHz)
Nach Rücksprache mit NI wurde mir (aufgrund der Anforderung vom Projekt inkl. SPI) ein USB-6341 DAQ empfohlen und dann auch angeschafft. Einer der DIO Ports des 6341 ist HW getaktet und somit für die realisierung der SPI Schnittstelle verwendbar.

Soweit sogut, Analog- und Digital ausgaben funktionieren im Programm wie sie sollten, jedoch komme ich wie gesagt beim SPI einfach nicht weiter.

Zur Anforderung:
Es soll mit 600Hz bis max. 1kHz getaktet werden. CS 1 wird auf high gelegt (CS active high), 4 Datenbyte gesendet und der CS 1 geht wieder auf low. 10ms später geht CS 2 auf high, die Baugruppe sendet zum DAQ 7 Datenbyte und CS 2 geht wieder auf low. Nach einer Sekunde geht das Spiel wieder von vorne los und die 7 Datenbyte können dazwischen natürlich weiterverarbeitet werden. - Siehe "spi.jpg"

Folgende Librarys gibts von NI für diese Thematik:
SPI Digital Waveform Reference Library
http://zone.ni.com/devzone/cda/epd/p/id/6163
Serial Protocol Communication Reference Design for Digital Waveform Devices
http://zone.ni.com/devzone/cda/epd/p/id/6200

Für das Forum habe ich ein Beispiel VI vom "Serial Protocol Cummunication..." genommen und die Erstellung vom SPI Signal dazugepackt. (jetzt nur ein Slave und nur Daten schreiben)
Die Daten werden, wie auf Bild "spi_fp.jpg" ausgegeben, auch CS ist auf high. Das ist am Oszi schön anzusehen.
Die Bezeichnung in der Anzeige für MOSI und CS habe ich gemacht, wofür "Plot 0" und "Leitung 3" sind ist mir leider auch noch nicht ganz klar. Ich denke, auf "Plot 0" sollte das Taktsignal ausgegeben werden, messen kann ich aber aber nur ein Signal, wie in der Anzeige unter "Leitung 3" zu sehen ist. Nach den 4 Datenbyte wird ein kurzes high ausgegeben.
Wie in Kanaleinstellungen zu sehen sollte der Takt auf Port0/0, MOSI auf 0/1 CS1 auf 0/2 und später CS2 auf 0/3 ausgegeben werden. MOSI und CS1 passen wie gesagt auch.
Ich denke, dass beim Takt das Problem liegt und warum meine Baugruppe nicht reagiert. Aber ich habs einfach noch nicht geschafft, dass ich den Takt ausgebe....
Beim Bild "spi_clk.jpg" habe ich noch ein Bild wie ich denke, dass es aussehen sollte (in dem Fall halt CS active low).

Wenn ich dem Programm in der Bus config. sage, dass zwei Slaves vorhanden sind bekomme ich eine Fehlermeldung von dem VI, welches ich im Bild "spi_bd.jpg" rot markiert habe. Die Funktion vom dem habe ich leider noch nicht 100%ig verstanden und deshalb bekomm ich den Fehler auch nicht weg.

Hab das VI für Version 8.0 konvertiert und samt SubVIs hochgeladen.
Es liegt im Unterordner: \DAQmx SPI - Correlated DIO Ordner\user.lib\Serial Protocols with Waveform Devices\DAQmx


Hoffe ich hab alles halbwechs verständlich formuliert und bitte um Eure Hilfe!
Keiner?
Hallo pdengg,

ohne den Takt geht nichts.
Du musst zuerst versuchen den Takt von der USB-6341 mit Deiner elektronischen Baugruppe verbinden.

Manchmal werden bei SPI die Buskabel verdreht:

SPI MOSI (SDO) ist der Ausgang Deiner USB-Karte und der muss mit SDI (digital In) Deiner elektronischen Baugruppe verbunden werden.

SPI MISO (SDI) ist der Eingang Deiner USB-Karte und der muss mit SDO (digital Out) Deiner elektronischen Baugruppe verbunden werden.

Noch was:

Die NI USB-8451 hat laut Spec. :


Supported clock rates..............................48 kHz, 50 kHz, 60 kHz, 75 kHz,
80 kHz, 96 kHz, 100 kHz,
120 kHz, 125 kHz, 150 kHz,
160 kHz, 200 kHz, 240 kHz,
250 kHz, 300 kHz, 375 kHz,
400 kHz, 480 kHz, 500 kHz,
600 kHz, 750 kHz, 800 kHz,
1 MHz, 1.2 MHz, 1.5 MHz,
2 MHz, 2.4 MHz, 3 MHz, 4 MHz,
6 MHz, 12 MHz

Grüße

kpa
Genau, ohne Takt geht nichts, aber ich bekomm den Takt wie gesagt nicht wie gewollt aus dem USB-6341. CS und MOSI jedoch kommen wie sie sollen heraus... Bahn
Das mit den unterstützten Taktfrequenzen vom 8451 hab ich verwechselt. Die max. Frequ. liegt bei 12MHz und min. 48kHz. - Ist aber halt leider auch zu viel.
So, habs jetzt geschafft, dass bei einem Taktfrequenz von 1kHz das CLK Signal auch ausgegeben wird. Cool
Der Fehler lag darin, dass in den SPI Timings die Werte erhöht werden mussten wenn die Taktfrequenz gesenkt wird.

Die nächste Frage ist aber, wie bzw kann ich den Takt weiter laufen lassen wenn ich gerade mit keinem Slave kommuniziere?
Wozu willst du den Bustakt laufen lassen, wenn du nicht kommunizierst?
Du brauchst den Bustakt doch nur bei Kommunikation.

Gruß, Jens
Stimmt, sorry, war ein Denkfehler von mir.

In der Zwischenzeit hatte ich endlich die Möglichkeit mit dem Entwickler zu sprechen.
Fehler war, dass ich 4 Byte einzeln geschrieben habe und somit auch nach jedem Byte das CS Signal kurz auf low ging. Wenn ich 4 Byte auf einmal schreibe funktioniert es wie es soll. Dais

Aber leider macht mir der nächste Schritt probleme. Wollte jetzt den zweiten CS hinzufügen um die Daten die vom zweiten Slave kommen auch lesen zu können.
Das SPI Signal wird auch erstellt, jedoch bekomme ich vom "RunCorDIO" Vi den Fehler -200463.

"Mögliche Ursachen:
Die angegebene Lese- oder Schreiboperation ist fehlgeschlagen, da die Anzahl der Leitungen in den Daten nicht mit der Anzahl der Leitungen im Kanal übereinstimmt.
Wenn Sie den digitalen Signalverlaufstyp verwenden, müssen Sie sicherstellen, dass die Anzahl der Leitungen im digitalen Signalverlauf mit der Anzahl der Leitungen im Kanal übereinstimmt. Wenn Sie boolesche Daten verwenden, müssen Sie sicherstellen, dass die Array-Dimension für die Leitungen in den Daten mit der Anzahl der Leitungen im Kanal übereinstimmt.
Anzahl von Leitungen in Kanal: 5
Anzahl von Zeilen in Daten: 4
Task-Name: _unnamedTask<88>"

Der Fehler hängt mit der Größe des Bool'schen Array vor dem "InitCorDIO" VI zusammen. Wenn dieses Array aber 5 Bool'sche Eingänge hat bekomme ich Fehler -200562.
"Mögliche Ursachen:
Es wurde versucht analoge Daten zu schreiben, die nicht gültig sind.
Daten: 5
Unterstützte Werte: 0, 1
Task-Name: _unnamedTask<8E>"

Kann mir da wieder jemand weiterhelfen?
Referenz-URLs