SPI-Synchronisation

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

SPI-Synchronisation

Post by Franz Peter Zantis »

Ich versuche eine schnelle Datenverbindung zwischen einem Mikrocontroller und dem IO-Warrior56 aufzubauen.
Der µC sammelt permanent 16 IN16-Werte und stellt diese in einem Array zur Verfügung. Ich hatte mir nun gedacht, ich starte die SPI-Übertragung vom IO-Warrior in einer Loop, wobei immer nach 16 INT16-Werten gefragt wird (also müssen 32 Byte übertragen werden). Vom µC wird /DRDY immer auf high gehalten. Wenn nun ein Datenpaket fertig ist, setzt der µC /DRDY auf low und der Warrior56 kann die Daten abholen. Anschließend wird /DRDY sofort wieder auf high gesetzt. Der Warrior56 läuft einmal in der Loop, hält dann wieder vor der Übertragung an und wartet darauf, dass /DRDY wieder auf low springt.
Leider funktioniert dies nicht. Der Warrior scheint immer erst ein, zwei, drei Bytes zu lesen und reagiert erst dann auf /DRDY, so dass keine Synchronisation möglich ist.
Es wundert mich, dass der Warrior überhaupt ein Byte überträgt, obwohl doch von vorn herein /DRDY auf high liegt?
Vermutlich ist eine derartige Datenübertragung schon oft gelöst worden. Über jeden Tipp würde ich mich freuen.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: SPI-Synchronisation

Post by Guido Körber »

Wie sieht denn der Code dazu aus?
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: SPI-Synchronisation

Post by Franz Peter Zantis »

Hier die Schleife mit der ich dachte den Datentranfer bewerkstelligen zu können. Der Warrior sollte so lange pausieren bis der Mikrocontroller das /DRDY-Signal auf Null zieht und dann alle 32 Byte auf einen Schlag übernehmen.


Private Sub current_measurement()
Dim lret As Integer
Dim lvaluesperSPITransfer As Int16 = 16
Dim lcd As Integer = 0
Dim lresults(31) As Integer
Dim lshift As Integer = 256
Dim lline As String

'prepare SPI communication
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
w56init(3) = 49 '24 MHz/(1+49)=480kHz
w56init(4) = &H0 'Pullups enabled
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 (16 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)

For lcd = 0 To (lvaluesperSPITransfer - 1)
lresults(lcd) = (w56SPIdata(2 * lcd + 2) * lshift + w56SPIdata(2 * lcd + 3))
Next lcd
Me.TxtBxValues.Text = ""
For lcd = 0 To 15
lline = CStr(lcd) & " " & lresults(lcd)
Me.TxtBxValues.Text = Me.TxtBxValues.Text & vbCrLf & lline
Next lcd
Application.DoEvents()
Loop While (endflag = False)
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Re: SPI-Synchronisation

Post by Thoene »

Arbeite mit ADS1248 und benutze handshake SS nicht


Code: Select all

Do
w56SPIdata(0) = &H9 'indicator for sending via SPI
w56SPIdata(1) = CByte(lvaluesperSPITransfer * 2) 'number of Byte to send/write (16 16-Bit-Words results to 32 Byte)

w56SPIdata(2) = &H0 'Flags: do use handshake (/DRDY)    '                              Mal auf null setzen!!!!!!!!!!!!

'catch SPI-Data from MSP430F2013
lret = IowKitWrite(IOhandle, 1, w56SPIdata(0), 64)
lret = IowKitRead(IOhandle, 1, w56SPIdata(0), 64)
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: SPI-Synchronisation

Post by Franz Peter Zantis »

Hallo Thoene,

vielen Dank für den Tipp. Allerdings geht es ohne Handshaking nicht - dass ist das Problem. Der Warrior setzt /SS auf low und sendet unmittelbar. So schnell kann mein µC nicht reagieren. Die ersten Bytes gehen verloren.
Einen anderen ADU möchte ich nicht nehmen. Die Verwendung des ADU im Mikrocontroller bringt viele Vorteile und hilft mir die Bauteilmenge zu begrenzen.


Viele Grüße
Franz Peter Zantis
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: SPI-Synchronisation

Post by Guido Körber »

Also eigentlich wartet der IO-Warrior vor jedem Byte bis /DRDY auf low ist. Wenn /DRDY auf high bleibt sollte er endlos warten.
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: SPI-Synchronisation

Post by Franz Peter Zantis »

Ist es gleichgültig wann ich /DRDY auf high setze? Angenommen ich setze /DRDY auf high wenn /SS von low nach high springt. Das wäre unmittelbar nach einer Datenübertragung. Wird /SS dann auch angehalten und erst ausgeführt, wenn /DRDY wieder auf low liegt?
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: SPI-Synchronisation

Post by Guido Körber »

/DRDY muss am Anfang eines Bytes auf low sein, vor dem Senden von jedem Byte prüft der IOW ob /DRDY low ist und wartet wenn nicht. Die Übertragung des jeweiligen Bytes läuft durch wenn sie einmal begonnen wurde und /SS geht inaktiv wenn es das letzte Byte war, unabhängig davon was /DRDY macht.
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: SPI-Synchronisation

Post by Franz Peter Zantis »

Angenommen unmittelbar nach dem Sprung von /SS von high nach low setze ich /DRDY auf high. Wird dann das erste Byte trotzdem übertragen?
Was passiert, wenn /DRDY auf high liegt? Wird /SS trotzdem auf low gezogen und überträgt der Warrior trotzdem ein Byte?
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: SPI-Synchronisation

Post by Guido Körber »

/SS wird immer auf low gezogen, unabhängig vom Status von /DRDY. Das kann u.a. dazu verwendet werden um dem Slave zu signalisieren, dass was von ihm gewünscht wird.

Es gibt ein Flag mit dem das erste Byte den Status von /DRDY ignorieren kann, ist das nicht gesetzt, dann wird auch beim ersten Byte gewartet.
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: SPI-Synchronisation

Post by Franz Peter Zantis »

Vielen Dank. Mit diesen Infos habe ich zumindest eine langsame Datenübertragung hinbekommen (15 Hz Abtastrate). Das Problem ist, dass ich nur einen 16-Bit-Wert bekomme, da mein µC nur ein 16-Bit-SPI-Register hat.
Ich dachte, ich könnte alle zwei Byte das Register nachladen bevor das nächste Byte übertragen wird. Wenn ich das aber tue, dann ist der IO-Warrior bereits ein paar SPI-Takte weiter. Die Zeit die der Warrior zwischen den Bytes wartet ist zu kurz (die Taktrate habe ich schon auf den niedrigsten Wert eingestellt - 93,75 kHz).
Selbst wenn ich vor dem Laden des nächsten 16-Bit-Wertes /DRDY hochsetze geht es nicht. Das /DRDY-Signal kommt offensichtlich zu spät - auch dann ist der Warrior bereits ein paar SPI-Takte weiter und überträgt das nächste Byte (das MSB des nächsten 16-Bit-Wortes).
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: SPI-Synchronisation

Post by Guido Körber »

Das sollte sich doch mit einer Schleife oder einem Interrupt erledigen lassen, die >80µs pro Byte sind ja fast eine Ewigkeit.
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: SPI-Synchronisation

Post by Franz Peter Zantis »

Ich habe noch mal nachgemessen: wenn der letzte Takt des 16-Bit-Wortes (also des zweiten Bytes) durch ist, dann braucht mein µC 12µs um /DRDY auf high zu setzen. Das entspricht etwa der Zeit die der Warrior zwischen den Bytes auf low bleibt. Es ist offensichtlich knapp aber zu kurz. Jedenfalls kommt /DRDY zu spät und das dritte Byte läuft schon durch obwohl der µC noch nicht bereit dazu ist.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: SPI-Synchronisation

Post by Guido Körber »

Können Sie den Anfang der Übertragung eines Bytes detektieren? Dann sollte /DRDY dann jedes mal auf inaktiv gesetzt werden.

Die 12µs sind nach Ende des Bytes definitiv viel zu viel, der IOW sollte es innerhalb von ca. 4 µs schaffen das nächste Byte nachzuladen.
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: SPI-Synchronisation

Post by Franz Peter Zantis »

Also in diesem Fall wäre ich froh, wenn der IO-Warrior 20µs benötigen würde statt 12. Dann hätte ich eine Chance mit dem vorhanden µC rechtzeitig das /DRDY-Signal zu setzen :-)
Post Reply