SSI mittels SPI ansprechen

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

Moderator: Guido Körber

Antworten
svenhu
Beiträge: 3
Registriert: Di Mai 14, 2019 10:25 am

SSI mittels SPI ansprechen

Beitrag von svenhu » Di Mai 14, 2019 10:36 am

Guten Tag

Ich habe den IOWarrier56 Startboard gekauft, um damit einen SSI Sensor anzusprechen und eine eigene Windowsoberfläche zu schreiben.
Es funktioniert eigentlich wunderbar, nur habe ich nicht realisiert, dass die SSI Schnittstelle doch ein wenig anders als die SPI ist.

Das Einlesen der SSI Daten funktioniert nun nur so halb. Hier die Einstellungen, die ich verwende:
------------------------------------------------------------
Init SPI
------------------------------------------------------------
' Enable SPI and configure for use with SSI
Dim SSI_Clock As Integer = 200 ' Clock Speed in kHz
Dim IoWarrior_Clock As Integer = 24000 ' Clock Speed of IOWarrior in kHz

Report(0) = &H8S
Report(1) = &H1S 'Enable SPI
Report(2) = &H6S 'mode: MSB first, CPOL = 1 (high idle), CPHA = 1 (data is driven on the falling edges and sampled on the rising edges)
Report(3) = (IoWarrior_Clock / SSI_Clock) 'clock: 93.75 kHz (slowest rate) Divider of System Clock 24Mhz
Report(4) = &H0S 'flags: enable pull ups (SS must pull up to clear the clock, does not matter since SS is not connected to SSI

I = IowKitWrite(IOWarrior, IOW_PIPE_SPECIAL_MODE, Report(0), 64)

-------------------------------------------------------------
Read Position
------------------------------------------------------------
Dim Status As Integer
Dim Report(64) As Byte

' write SSI 3 bytes (= 24 bits) of dummy data to SPI to trigger read
Report(0) = &H9S ' Report ID for read
Report(1) = &H3S ' count: number of bytes to read
Report(2) = &H0S ' flags: useDRDY = 0, SSactive = 0, ignoreDRDY = 0
Status = IowKitWrite(IOWarrior, IOW_PIPE_SPECIAL_MODE, Report(0), 64)

' read SSI data
Status = IowKitRead(IOWarrior, IOW_PIPE_SPECIAL_MODE, Report(0), 64)

If Status = 0 Then
Debug.Print("attempting read error occured")
Else
'' receive 24 bit value
Dim RawByts(3) As Byte
RawByts(0) = Report(4) ' flip data arround
RawByts(1) = Report(3)
RawByts(2) = Report(2)

'Dim Position As Integer
Read_SSI_SPI = BitConverter.ToInt32(RawByts, 0) ' Convert byts array to integer
End If

------------------------------------------------------------

Das Problem ist nun, dass die SPI Schnittstelle nur 24 bits schickt, anstatt 25.
Also das heisst das Start-Bit, welches dem Sensor mitteilt, dass nun ein Readout startet fehlt.
So wird nach 24bit das Readout beendet obwohl noch ein Bit kommen sollte.
SSI_ok_zero_bit_at_LSB.JPG
SSI_ok_zero_bit_at_LSB.JPG (217.72 KiB) 213 mal betrachtet
Dieses Bild zeigt den "Gutfall", da das letzte Bit so oder so Null gewesen ist.
SSI_problem_writes_after_end.JPG
SSI_problem_writes_after_end.JPG (221.69 KiB) 213 mal betrachtet
Dieses Bild zeigt den "Schlechtfall", da das letzte Bit noch 1 gewesen wäre. Deshalb ist dann mein Positionswert falsch.
Das letzte Bit ist ganz rechts in der Aufzeichnung.

--------------------------------------------------------
Lösung:
- Wie kann ich der SPI Schnittstelle beibringen, dass ein zusätzlicher ClockCycle am Anfang gesendet werden soll?
- Der Sensor ist momentan nicht ganz korrekt verdrahtet, nämlich nur SCK auf Clock+ (von Sensor) und MISO auf Data+ (von Sensor).
- Wie kann ich den Clock- per Invertierung vom IoWarrior ausgeben?
- Wie kann ich gleichzeitig den Kanal Data- per digital-in am IoWarrior auslesen?
- Mit diesen Änderungen hätte ich eine vollwertige SSI Schnittstelle.


Vielen Dank für Ihre Hilfe.

Sven Hubacher
Zuletzt geändert von svenhu am Di Mai 14, 2019 4:17 pm, insgesamt 1-mal geändert.

Guido Körber
Site Admin
Beiträge: 2723
Registriert: Di Nov 25, 2003 10:25 pm
Wohnort: Germany/Berlin
Kontaktdaten:

Re: SSI mittels SPI ansprechen

Beitrag von Guido Körber » Di Mai 14, 2019 2:00 pm

SPI ist nicht dafür ausgelegt beliebige Zahlen von Clocks zu erzeugen, es werden immer Vielfache von 8 verwendet.

Wir haben mit SSI keine Erfahrung, aber nach der Beschreibung in Wikipedia ist das eine auf RS-422 basierende Verbindung. Sie brauchen also entsprechende Treiberbausteine für die Pegelumsetzung.

Was soll Data- an einem Analogeingang?

svenhu
Beiträge: 3
Registriert: Di Mai 14, 2019 10:25 am

Re: SSI mittels SPI ansprechen

Beitrag von svenhu » Di Mai 14, 2019 2:05 pm

Guten Tag

ok, kennen Sie einen solchen Treiberbaustein? Können Sie mir einen Hersteller empfehlen?

Data- ist, sofern ich alles richtig verstanden habe, das invertierte Signal von Data+, damit könnte man differentiell messen.

Guido Körber
Site Admin
Beiträge: 2723
Registriert: Di Nov 25, 2003 10:25 pm
Wohnort: Germany/Berlin
Kontaktdaten:

Re: SSI mittels SPI ansprechen

Beitrag von Guido Körber » Di Mai 14, 2019 2:22 pm

Das ist ein differenzielles, digitales Signal, da gibt es nichts analog dran zu messen.

Hier sind solche Treiber zu finden:
https://www.st.com/content/st_com/en/se ... cts-page=1

svenhu
Beiträge: 3
Registriert: Di Mai 14, 2019 10:25 am

Re: SSI mittels SPI ansprechen

Beitrag von svenhu » Di Mai 14, 2019 4:16 pm

Danke für denk Link.

Stimmt, das habe ich falsch geschrieben. Meinte natürlich einen digitalen Input. Sorry.

Antworten