# Interne Schnittstellen des Messsystems

URL: https://irs.systems/docs/messy/measurement-system-internal-interfaces

## SPI-Schnittstelle

Die beiden Controller kommunizieren mit dem sbRIO über zwei getrennte SPI-Busse, die mit Taktraten von bis zu 18 MHz betrieben werden können. Die Mikrocontroller sind als Slaves konfiguriert. Sie können eine Interrupt-Leitung aktivieren, um das FPGA des sbRIO (das Master ist) zum Abholen der Mikrocontroller-Daten zu veranlassen. Die Datengröße beträgt immer 16 Bit (als ein Wort bezeichnet).

### Übertragungsprotokoll

Das folgende Kommunikationsprotokoll wird für die Kommunikation in beide Richtungen verwendet (FPGA zu Mikrocontroller, Mikrocontroller zu FPGA).

| Wort | Name | Bereich/Wert |
| --- | --- | --- |
| 0 | LEN (Anzahl der Datenwörter) **N** | 1…65.535 |
| 1 (High-Byte) | SIGNATURE | immer `0x4D` |
| 1 (Low-Byte) | CRC8 (aller folgenden Datenbytes) | `0x00`…`0xFF` |
| 2 (High-Byte) | COMMAND | `0x00`…`0xFF` |
| 2 (Low-Byte) | DATA (Byte 0) | `0x00`…`0xFF` |
| … | … | … |
| 2+**N**-1 (Low-Byte) | DATA (Byte **N**-1) | `0x00`…`0xFF` |

Beachten Sie, dass im Datenbereich nur das Low-Byte verwendet wird. Das High-Byte enthält bei Datennachrichten immer die Konstante `0x40` (außer bei Datenwort 0, das zusätzlich das Befehlsbyte enthält) und bei Statusnachrichten `0x80` (aus Kompatibilitätsgründen; das FPGA verwirft empfangene Datenwörter mit einem Wert kleiner oder gleich `0x00FF`). Ein Datenwort mit dem Wert `0x0000` wird vom Mikrocontroller automatisch angehängt, um seinen SPI-Puffer zu leeren.

### Statuscodes

Der Mikrocontroller beantwortet jeden vom sbRIO empfangenen Befehl. Dies geschieht entweder mit einer Datennachricht (die von RT/PC verarbeitete Anwendungsdaten enthält) oder mit einer Statusnachricht. Diese Funktion kann per Befehl deaktiviert werden.

Folgende Statuscodes sind definiert.

| Wert | Inhalt |
| --- | --- |
| `0x01` | ACK (Befehl erfolgreich verarbeitet, aber keine Datenbytes als Antwort zu senden) |
| `0x02` | PAR (mindestens ein Parameter liegt außerhalb des zulässigen Bereichs) |
| `0x04` | CMD (Befehl unbekannt) |
| `0x08` | IDX (Objektindex außerhalb des zulässigen Bereichs) |
| `0x10` | CRC (Prüfsummenprüfung fehlgeschlagen) |
| `0x20` | SIG (falsche Signatur gelesen) |
| `0x40` | TIM (SPI-Timeout erkannt) |
| `0x80` | LEN (Befehlslänge stimmt nicht überein) |

### Befehlsbeschreibung

Die aktuellen Beschreibungen finden Sie in der VI-Dokumentation.

## Nichtflüchtige Datenspeicherung

Der On-Board-Datenflash der beiden STM32 kann als EEPROM zur nichtflüchtigen Speicherung von Daten verwendet werden (zum Beispiel Baudraten, ID-Filtereinstellungen, Abschlusswiderstände …).

## Analogeingang

Die Schnittstelle der Analogeingangsplatine besteht aus

- 3 Adressbussen zum Multiplexen der Analogkanäle, für jede Analoggruppe getrennt
- Signalen für die serielle Kommunikation mit den ADCs.
- einer seriellen Schnittstelle zum EEPROM für die Kalibrierdaten.

### Multiplexer

Wie im Funktionsblockschaltbild dargestellt, werden die Kanäle auf ADCs mit je zwei Kanälen gemultiplext. 32 Single-Ended-Kanäle werden von einem 32:1-Multiplexer mit den Adressleitungen ADR1_0 bis ADR1_4 verarbeitet, die übrigen 16 Single-Ended-Kanäle von einem 16:1-Multiplexer mit den Adressleitungen ADR2_0 bis ADR2_3, und die differenziellen Kanäle werden über zwei 8:1-Multiplexer mit **gemeinsamen** Adressleitungen ADR3_0 bis ADR3_2 geschaltet.

Alle Adressleitungen sind mit High-Speed-CMOS-Puffern gepuffert, um die Last für die Ausgangstreiber des FPGA zu verringern und saubere Signale auf der Leiterplatte bereitzustellen.

Die Adressleitungen werden während der Haltephase der ADCs umgeschaltet, damit die Wandlungsergebnisse nicht beeinflusst werden.

Die Eingänge werden von der internen Sample-&-Hold-Stufe der ADCs zwischen der 32. steigenden Flanke von SCK und der steigenden Flanke von CONV abgetastet.

### ADCs

![Timingdiagramm des LTC1407A-1 mit SCK, CONV, internem S/H-Status und SDO sowie Tabelle der Timing-Parameter (Abtastfrequenz, Durchsatz, Taktperiode, Wandlungszeit, t1 bis t12)](/docs/assets/messy/images/messy-adc-timing.png)

Beide ADCs werden von denselben Signalen CONV und SCK getaktet.

Die ADC-Ausgänge sind mit High-Speed-CMOS-Puffern gepuffert, um die Kapazität des Flachbandkabels treiben zu können.

### EEPROM

Das EEPROM enthält eine ID, die die Leiterplatte als analoge Messkarte kennzeichnet, den Typ (Version mit 128 oder 64 Kanälen), einen Kalibrierzeitstempel und die Hardwareversion. Außerdem sind für jeden Kanal Offset- und Verstärkungs-Kalibrierdaten gespeichert sowie der Skalierungsfaktor der Eingangsspannung entsprechend den Spannungsteilern auf der Leiterplatte. Jedes Analog-Subsystem hat ein eigenes EEPROM. Die folgende Tabelle zeigt einen Auszug aus dem EEPROM-Inhalt. Eine detaillierte Speicherbelegung finden Sie in der separaten Datei „EEPROM Memory Map Analog_LDSA.xlsx“.

| Adresse | Inhalt | Werte | Kommentar |
| --- | --- | --- | --- |
| 0 | ID | `0xAA` | Kennzeichnet die Leiterplatte als analoge Messkarte |
| 1 | Hardwarerevision | z. B. `0x14` | **Hardwarerevision:** z. B. Version 1.3 => `0x13` |
| 2 | | | **Hardwarerevision:** z. B. Version 1.3 => `0x13` |
| 3 | Kalibrierzeitstempel oberes Byte | `0x02` | Datum der letzten Kalibrierung: z. B. 16.08.2010 => 160810 = `0x2742A` |
| 4 | Kalibrierzeitstempel mittleres Byte | `0x74` | Datum der letzten Kalibrierung: z. B. 16.08.2010 => 160810 = `0x2742A` |
| 5 | Kalibrierzeitstempel unteres Byte | `0x2A` | Datum der letzten Kalibrierung: z. B. 16.08.2010 => 160810 = `0x2742A` |
| 6 | | | |
| 7 | | | |
| 8 | | | |
| 9 | Offset Byte 1 Single-Ended-Kanal 1 | Bit31…24 | Offset in Schritten von µV |
| 10 | Offset Byte 2 Single-Ended-Kanal 1 | Bit23…16 | Offset in Schritten von µV |
| 11 | Offset Byte 3 Single-Ended-Kanal 1 | Bit15…8 | Offset in Schritten von µV |
| 12 | Offset Byte 4 Single-Ended-Kanal 1 | Bit7…0 | Offset in Schritten von µV |
| 13 | Verstärkung Byte 1 Single-Ended-Kanal 1 | Bit31…24 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 14 | Verstärkung Byte 2 Single-Ended-Kanal 1 | Bit23…16 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 15 | Verstärkung Byte 3 Single-Ended-Kanal 1 | Bit15…8 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 16 | Verstärkung Byte 4 Single-Ended-Kanal 1 | Bit7…0 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 17 | Offset Byte 1 Single-Ended-Kanal 2 | Bit31…24 | Offset in Schritten von µV |
| 18 | Offset Byte 2 Single-Ended-Kanal 2 | Bit23…16 | Offset in Schritten von µV |
| 19 | Offset Byte 3 Single-Ended-Kanal 2 | Bit15…8 | Offset in Schritten von µV |
| 20 | Offset Byte 4 Single-Ended-Kanal 2 | Bit7…0 | Offset in Schritten von µV |
| 21 | Verstärkung Byte 1 Single-Ended-Kanal 2 | Bit31…24 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 22 | Verstärkung Byte 2 Single-Ended-Kanal 2 | Bit23…16 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 23 | Verstärkung Byte 3 Single-Ended-Kanal 2 | Bit15…8 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 24 | Verstärkung Byte 4 Single-Ended-Kanal 2 | Bit7…0 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| : | : | : | |
| : | : | : | |
| 511 | Verstärkung Byte 3 differenzieller Kanal 15 | Bit15…8 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 512 | Verstärkung Byte 4 differenzieller Kanal 15 | Bit7…0 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 513 | Offset Byte 1 differenzieller Kanal 16 | Bit31…24 | Offset in Schritten von µV |
| 514 | Offset Byte 2 differenzieller Kanal 16 | Bit23…16 | Offset in Schritten von µV |
| 515 | Offset Byte 3 differenzieller Kanal 16 | Bit15…8 | Offset in Schritten von µV |
| 516 | Offset Byte 4 differenzieller Kanal 16 | Bit7…0 | Offset in Schritten von µV |
| 517 | Verstärkung Byte 1 differenzieller Kanal 16 | Bit31…24 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 518 | Verstärkung Byte 2 differenzieller Kanal 16 | Bit23…16 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 519 | Verstärkung Byte 3 differenzieller Kanal 16 | Bit15…8 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |
| 520 | Verstärkung Byte 4 differenzieller Kanal 16 | Bit7…0 | Verstärkung des Eingangsspannungsteilers multipliziert mit 10<sup>9</sup> |

## Digitalausgang

Wie im Blockschaltbild dargestellt, werden die Relais über zwei I²C-Portexpander angesprochen. Alle Pins sind nach dem Einschalten als Eingänge konfiguriert und müssen als Ausgänge umkonfiguriert werden, bevor die Relais geschaltet werden können.

Adressen für den Schreibzugriff:

- Portexpander 1 (Relais 01 bis 15): `0b11101000` = `0xE8`
- Portexpander 2 (Relais 16 bis 32): `0b11101100` = `0xEC`
- Portexpander 3 (Relais 33 bis 48): `0b11101110` = `0xEE`
- Portexpander 4 (Relais 49 bis 64): `0b11101010` = `0xEA`

Für den Schreibzugriff ist das LSB auf null gesetzt.

Schreiben in die Ausgangsports:

![I2C-Timing: Schreiben in die Ausgangsports mit Slave-Adresse, Befehlsbyte, Daten an Port 0 und Daten an Port 1](/docs/assets/messy/images/messy-i2c-write-output-ports.png)

Schreiben in die Konfigurationsregister:

![I2C-Timing: Schreiben in die Konfigurationsregister mit Slave-Adresse, Befehlsbyte und Daten an das Register](/docs/assets/messy/images/messy-i2c-write-config-registers.png)
