Nach der elektronischen Anbindung der Drehgebersignale an den SoC stand nun die Firmware an. In diesem Fall wurde kein FPGA verwendet, die Verbindung zwischen ACURO Bus und SoC wurde in Software via SPI Schnittstelle aufgelöst. Die folgende Grafik zeigt dazu das Timing auf dem physischen Layer:
Wichtig zum Verständnis: hier werden die Signale MA für Master und SL für Slave verwendet, diese entsprechen auf SPI SCLK (englisch Serial Clock) und MISO (englisch Master Input, Slave Output).
Zur Vereinfachung hier noch einmal das Timing in 5 Gruppen T1 bis T5:
Wie zu sehen ist, besitzt MA (SCLK) als Ruhepotential high. Während der gesamten Zeit T1 bleibt MA high. T2 ist low, T3 wieder high. T4 enthält die eigentlichen Daten, während T5 low ist. Diese Sequenz wird folgend stückweise im Detail betrachtet.
Zunächst wird die Sequenz auf den SPI Modus übertragen. Dazu eine Grafik zu den SPI Modi aus Wikipedia, SCK ist nur eine andere Bezeichnung für Clock (SCLK, also MA):
Wie zu sehen ist, wird CPOL = 1 (Ruhepotential high) genutzt. Die Datenleitung schaltet bei steigender Flanke auf SCLK und ist stabil bei fallender Flanke auf SCLK, also CPHA = 0. CPOL = 1 und CPHA = 0 entsprechen SPI Mode 2 (siehe https://de.wikipedia.org/wiki/Serial_Peripheral_Interface#Protokollablauf_und_Einstellm%C3%B6glichkeiten).
Jetzt wird etwas weiter ins Detail gegangen. Ein Paket startet mit dem Takt des SoCs (T1):
T1 enthält, wie zu sehen, zwei fallende Flanken, während SL high ist, also 0b11.
T2 enthält, wie zu sehen, mindestens eine fallende Flanke. Dazu kommt die Zeit \(busy\). Tatsächlich war dies wieder ein Fall, wo eine Angabe im Datenblatt fehlte. Auf Nachfrage erhielt ich die Auskunft, \(busy\) beträgt bei BiSS-B-Gebern maximal 5,2µs. In solchen Fällen empfehle ich die Kontrolle der Werte real am Sensor, z.B. mittels Oszilloskop, oft unterlaufen Zulieferern bei Nachfragen dieser Art intern Fehler.
Damit ergibt sich für T2 eine Anzahl von Bits zwischen 1 und \(SPI_{Frequenz} \cdot busy + 1\). Das entspricht z.B. bei 100kHz einem Bit, bei 400kHz drei Bits, bei 1MHz 6 Bits und bei 8MHz 42 Bits.
T3 besteht trivialerweise nur aus einem Bit mit Wert 1.
T4 besteht aus mehreren Blöcken. Diese sind:
- Der Datenblock
- Füllbits
- Ein Bit zur Signalisierung von Fehlern
- Ein Bit zur Signalisierung von Warnungen
- 6 Bits für den Prüfwert der zyklischen Redundanzprüfung
Der Datenblock besteht aus den Bits für Multi- und Singleturn, also der Anzahl der Vollumdrehungen und des Winkels der Teilumdrehung. In Abhängigkeit deren Auflösung ergibt sich die Anzahl der Füllbits:
Die Anzahl der Datenbits liegt zwischen 9 und 45 Bits, plus Bits für Warnung und Fehler, plus die 6 Bits des Prüfwertes. Somit kommen bis maximal 53 Bits zustande. Eingesetzt wird ein Multiturn-Drehgeber mit 12+22 Bits Auflösung, also 42 Bits Summe.
T5 ist direkt abhängig von \(timeout_{SENS}\). Diese liegt als default zwischen 9,9 und 14,9µs. Bei 1MHz sind das zwischen 10 und 15 Bits.