/DRDY Timeout?
Moderator: Guido Körber
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
/DRDY Timeout?
Bei der Übertragung per SPI halte ich den IO-Warrior56 über das /DRDY-Signal in Warteposition. Insgesamt sollen 32 Byte (16 16-Bit-Integerwerte) übertragen werden. Das funktioniert meistens. Der Warrior erhält den Befehl die Werte zu lesen. Damit geht die CS-Leitung (Pin 5.1) auf low. Sonst passiert noch nichts, denn /DRDY ist auf high. Sobald /DRDY auf low geht werden die 16 Integer sauber übertragen. Leider nicht immer. Manchmal springt CS (Pin5.1) ohne erkennbaren Grund auf high und die Übertragung stoppt. Damit gerät das Übertragungsgefüge aus dem Takt, denn /DRDY bleibt nun auf low, denn es wurden noch nicht 16 Werte übertragen. Die fehlenden Werte werden sofort übertragen, wenn CS wieder auf low geht. Aber diese werden dann im Empfängerprogramm falsch ausgewertet.
Ich habe zwei Bilder angehängt.
Nun meine Frage: gibt es für /DRDY so etwas wie ein Timeout, was zur Folge hat, dass CS auf high springt? Oder welche Ursache könnte es noch haben?
Ich habe zwei Bilder angehängt.
Nun meine Frage: gibt es für /DRDY so etwas wie ein Timeout, was zur Folge hat, dass CS auf high springt? Oder welche Ursache könnte es noch haben?
- Attachments
-
- Ab und zu springt CS auf high, bevor alle 16 Werte übertragen wurden. Dann gerät die Übertragung aus dem Rhytmus.
- Fehler.gif (53.49 KiB) Viewed 9692 times
-
- Es ist zu erkennen, dass CS meistens (die beiden rechten Bildteile) längst auf low ist, ehe /DRDY auf low geht und die Übertragung zulässt (und kontrolliert). Nur manchmal (links im Bild) ist /DRDY bereits auf low, ehe CS auf low geht. In allen diesen Fällen werden 16 16-Bit-Integer sauber übertragen.
- alles.OK.gif (31.56 KiB) Viewed 9692 times
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: /DRDY Timeout?
/DRDY hat keinen Timeout, damit kann man den IOW56 praktisch beliebig blockieren.
Nicht ganz klar ist bei den Bildern welches Signal jetzt welches ist?
Nicht ganz klar ist bei den Bildern welches Signal jetzt welches ist?
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: /DRDY Timeout?
Rot ist das SPI-Taktsignal
Blau ist CS bzw. /SS
Gelb ist /DRDY
Blau ist CS bzw. /SS
Gelb ist /DRDY
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: /DRDY Timeout?
Und welches Bild ist jetzt das bei dem der Fehler auftritt und wie sehen die Befehle zum IO-Warrior aus?
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: /DRDY Timeout?
Beim oberen Bild springt CS (bzw. /SS) auf high noch bevor alle 16 Werte übertragen wurden.
Hier die Hauptsub des Programms:
Private Sub current_measurement()
Dim lret As Integer = 0
Dim lvaluesperSPITransfer As Int16 = 24
Dim lcd As Integer = 0
Dim lshift As Integer = 256
w56init(0) = &H8 'initialisation of SPI by sending a report with ID8
w56init(1) = &H1 'enable SPI
w56init(2) = &H4 'mode MSB first, /CPOL, CPHA=1, CKPH=0; for communication with MSP430F2013
w56init(3) = 23 '24 MHz/(1+23)=1MHz
w56init(4) = 128 'Pullups enabled = 0; Pullups disabled = 128 --> to connect with 3.6-V-logic (MSP430)
lret = IowKitWrite(IOhandle, 1, w56init(0), 64)
Do
w56SPIdata(0) = &H9 'indicator for sending via SPI
w56SPIdata(1) = CByte(lvaluesperSPITransfer * 2) 'number of Byte to send/write (24 16-Bit-Words results to 32 Byte)
w56SPIdata(2) = &H80 'Flags: do use handshake (/DRDY)
'#catch SPI-Data from MSP430F2013
lret = IowKitWrite(IOhandle, 1, w56SPIdata(0), 64)
lret = IowKitRead(IOhandle, 1, w56SPIdata(0), 64)
'##############################################################
'#### Getting the data and saveing into the array ####
'##############################################################
For lcd = 0 To lvaluesperSPITransfer - 1
datenarray2(cnt) = ((w56SPIdata(2 * lcd + 2) * lshift + w56SPIdata(2 * lcd + 3)) - offset)
If endflag = True Then
Exit For
End If
''FFT-Berechnung ###########################################################
fftcnt = fftcnt + 1 'Alle "4 * samplerate" Sekunden erfolgt Aufruf
If fftcnt > (samplerate * 876) Then
Timer2.Enabled = True 'Im Timer wird die FFT berechnet
End If
'Zeitsignal (Sekunde)######################################################
zeige()
cnt = cnt + 1 'Pointer für Datenarray
Next lcd
'##############################################################
'#### Innere Schleife Ende ####
'##############################################################
Application.DoEvents()
'Speichern: Wenn aktueller Sekundenstand = eingestelltem Sekundenstand, dann:
If se = endse Then
speichern()
endflag = True
End If
Loop While endflag = False
'##############################################################
'#### Äußere Schleife Ende ####
'##############################################################
Label5.BackColor = Color.DarkRed 'Rotes Recording-Licht ausschalten
End Sub
Hier die Hauptsub des Programms:
Private Sub current_measurement()
Dim lret As Integer = 0
Dim lvaluesperSPITransfer As Int16 = 24
Dim lcd As Integer = 0
Dim lshift As Integer = 256
w56init(0) = &H8 'initialisation of SPI by sending a report with ID8
w56init(1) = &H1 'enable SPI
w56init(2) = &H4 'mode MSB first, /CPOL, CPHA=1, CKPH=0; for communication with MSP430F2013
w56init(3) = 23 '24 MHz/(1+23)=1MHz
w56init(4) = 128 'Pullups enabled = 0; Pullups disabled = 128 --> to connect with 3.6-V-logic (MSP430)
lret = IowKitWrite(IOhandle, 1, w56init(0), 64)
Do
w56SPIdata(0) = &H9 'indicator for sending via SPI
w56SPIdata(1) = CByte(lvaluesperSPITransfer * 2) 'number of Byte to send/write (24 16-Bit-Words results to 32 Byte)
w56SPIdata(2) = &H80 'Flags: do use handshake (/DRDY)
'#catch SPI-Data from MSP430F2013
lret = IowKitWrite(IOhandle, 1, w56SPIdata(0), 64)
lret = IowKitRead(IOhandle, 1, w56SPIdata(0), 64)
'##############################################################
'#### Getting the data and saveing into the array ####
'##############################################################
For lcd = 0 To lvaluesperSPITransfer - 1
datenarray2(cnt) = ((w56SPIdata(2 * lcd + 2) * lshift + w56SPIdata(2 * lcd + 3)) - offset)
If endflag = True Then
Exit For
End If
''FFT-Berechnung ###########################################################
fftcnt = fftcnt + 1 'Alle "4 * samplerate" Sekunden erfolgt Aufruf
If fftcnt > (samplerate * 876) Then
Timer2.Enabled = True 'Im Timer wird die FFT berechnet
End If
'Zeitsignal (Sekunde)######################################################
zeige()
cnt = cnt + 1 'Pointer für Datenarray
Next lcd
'##############################################################
'#### Innere Schleife Ende ####
'##############################################################
Application.DoEvents()
'Speichern: Wenn aktueller Sekundenstand = eingestelltem Sekundenstand, dann:
If se = endse Then
speichern()
endflag = True
End If
Loop While endflag = False
'##############################################################
'#### Äußere Schleife Ende ####
'##############################################################
Label5.BackColor = Color.DarkRed 'Rotes Recording-Licht ausschalten
End Sub
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: /DRDY Timeout?
Wie sieht die Antwort des IOW56 aus, wenn dieser Fehler auftritt? Meldet der die volle Anzahl an Bytes zurück und wenn ja, was steht in den fehlerhaften drin?
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: /DRDY Timeout?
Ja, es werden immer 64 Byte gemdeldet, die übertragen wurden. Die Inhalte prüfe ich noch.
Es scheint so zu sein, dass, wenn Windows stark beschäftigt ist bzw. ich in der Schleife mit dem SPI-Lesebefehl noch andere Berechnungen einbaue, das Problem schlimmer wird.
Aber es gibt doch Lösungen, bei denen viel größere Datenmengen übertragen werden. Wie macht man das dann?
Es scheint so zu sein, dass, wenn Windows stark beschäftigt ist bzw. ich in der Schleife mit dem SPI-Lesebefehl noch andere Berechnungen einbaue, das Problem schlimmer wird.
Aber es gibt doch Lösungen, bei denen viel größere Datenmengen übertragen werden. Wie macht man das dann?
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: /DRDY Timeout?
Wie sieht denn der Aufbau des Ganzen aus?
Weil Berechnungen oder Windows beim Auslesen keine auswirkungen haben sollte. Jedenfalls nicht solche, dass störungen auf Leitungen eintreten.
Weil Berechnungen oder Windows beim Auslesen keine auswirkungen haben sollte. Jedenfalls nicht solche, dass störungen auf Leitungen eintreten.
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: /DRDY Timeout?
Ein Mikrocontroller (MSP430F2013) arbeitet als 16-Bit-ADU und sammelt 16 16-Bit-Werte. Der IO-Warrior56 hat erst mal nur die Aufgabe die Werte abzuholen. Er wird jedoch über /DRDY vom Mikrocontroller festgehalten. Sobald der Mikrocontroller 16 Werte bereit hat gibt er /DRDY für zwei Byte frei und hälte den Warrior dann wieder fest. Dann lädt der µC den nächsten der 16 Werte in den SPI-Register und gibt /DRDY wieder für zwei Byte frei. Sind alle 16 Werte durch, hält der µC über /DRDY den Warrior wieder fest bis die nächsten 16 Werte zur Verfügung stehen.
Anbei das Schaltbild.
Anbei das Schaltbild.
- Attachments
-
- TargettTIFF.gif (423.84 KiB) Viewed 9542 times
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: /DRDY Timeout?
Wenn ich das richtig sehe ist da kein Pull-Up an /DRDY, obwohl die Pullups abgeschaltet werden?
Was ist das für ein Jumper in der Stromversorgung?
Was ist das für ein Jumper in der Stromversorgung?
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: /DRDY Timeout?
Das /DRDY-Signal wird vom Mikrocontroller vorgegeben (0 bzw. 3,6V).
Der Jumper K1 erlaubt die Stromversorgung über USB oder über einen externen Akku.
Der Jumper K2 ist nur für den Mikrocontroller interessant. Wenn er programmiert wird, dann kann er durch Umstecken des Jumpers K2 vom Programmieradapter versorgt werden.
Der Jumper K1 erlaubt die Stromversorgung über USB oder über einen externen Akku.
Der Jumper K2 ist nur für den Mikrocontroller interessant. Wenn er programmiert wird, dann kann er durch Umstecken des Jumpers K2 vom Programmieradapter versorgt werden.
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: /DRDY Timeout?
Haben Sie von dem Aufbau ein Bild mit etwas Details?
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: /DRDY Timeout?
Welche Details genau meinen Sie? Das Schaltbild habe ich ins Forum gestellt; auch einige Diagramme.
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: /DRDY Timeout?
Ich meine den eigentlichen Aufbau. Haben Sie dazu einen Platine gemacht? Gibt es davon ein Foto?
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: /DRDY Timeout?
Anbei ein Foto.
- Attachments
-
- Der linke Teil (links von den blauen Drahtbrücken) ist rein analog und hat mit dem Zusammenspiel IO-Warrior - ADU nichts zu tun. Der ADU (Mikrocontroller) befindet sich oben links neben dem IO-Warrior.
- Platinenfoto.jpg (196.33 KiB) Viewed 9379 times