Zum Inhalt

Dokumentation

MicroPython-Befehlsreferenz

Vollständige native LIN-API, Master, mehrere Slave-IDs, passiver Sniffer, Beispiele und Firmware-Update.

Vollständige MicroPython-Befehlsreferenz

Der STM32G0B0 verarbeitet LIN1 und LIN2 unabhängig; die zeitkritische Übertragung erfolgt in C. Die hier beschriebenen Funktionen sind Bestandteil von Firmware main.

Alle Befehle

Befehl Bedeutung
lin.init(ch, baud) 1/2; 1000–20000 baud
lin.send(ch, id, data, enhanced=True) 0–8 bytes; master publish
lin.request(ch, id, length, enhanced=True) 0–8 bytes; returns bytes, checks checksum
lin.request_raw(ch, id, length) 1–9 raw bytes including checksum, no validation
lin.slave_set(ch, id, data, enhanced=True) Up to 64 slave IDs per channel
lin.slave_clear(ch, id) Remove one configured slave ID
lin.slave_clear(ch) Remove all slave IDs
lin.sniffer_set(ch, id, length, enhanced=True) Monitor selected ID, fixed data length 0–8
lin.sniffer_clear(ch) Clear monitoring rules
lin.sniffer(ch, True/False) Enable/disable passive sniffer
lin.recv(ch) Pop oldest frame dict or None
lin.tic() Current 64-bit microsecond tick

ch ist LIN-Kanal 1 oder 2, id ist 0x00–0x3F. enhanced=True bedeutet Enhanced-Checksum; False wählt Classic-Checksum. Fehler lösen OSError oder ValueError aus. Sniffer und Master/Slave sind pro Kanal gegenseitig ausgeschlossen.

Beispiel: Zwei Slave-IDs und Master

import lin
lin.init(1, 19200)
lin.init(2, 19200)
lin.slave_clear(2)
lin.slave_set(2, 0x12, b'\x11\x22\x33\x44')
lin.slave_set(2, 0x23, b'\x55\x66')
print(lin.request(1, 0x12, 4))
print(lin.request(1, 0x23, 2))
print(lin.recv(1))
print(lin.recv(2))
lin.slave_clear(2, 0x23)

Beispiel: Selektives passives Monitoring

import lin
lin.init(1, 19200)
lin.init(2, 19200)
lin.slave_clear(2)
lin.sniffer_clear(2)
lin.sniffer_set(2, 0x12, 4)
lin.sniffer_set(2, 0x23, 2, False)
lin.sniffer(2, True)
lin.send(1, 0x12, b'\x11\x22\x33\x44')
lin.send(1, 0x35, b'\xAA\xBB')  # wird ignoriert
while True:
    frame = lin.recv(2)
    if frame is None:
        break
    print(frame)
lin.sniffer(2, False)

Der Sniffer sendet niemals selbst. Er zeichnet nur konfigurierte IDs mit hinterlegter Länge und Checksumme auf. Die beiden LIN-Leitungen müssen für den gezeigten Testbus korrekt verbunden und versorgt sein.

Beispiel: TIC und Frame-Dauer

import lin, time
a = lin.tic()
time.sleep_ms(150)
print('us:', lin.tic()-a)
f = lin.recv(1)
if f:
    print(f['tic_start'], f['tic_duration'], f['status'])

Ein Frame enthält id, len, data, tic_start (64 Bit, µs), tic_duration (32 Bit, µs) und status (0 gültig, 1 Checksum-Fehler im Sniffer). Pro Kanal stehen 15 nutzbare FIFO-Einträge zur Verfügung; bei Überlauf wird der älteste verworfen. TIC ist keine Uhrzeit: siehe eigene TIC-Dokumentation.

Beispiele auf dem Raspberry Pi ausführen

cd ~/be-iis-lin
./.venv/bin/beiis-lin --direct info
./.venv/bin/beiis-lin --direct exec "import lin; print(lin.tic())"

exec nutzt MicroPython Raw-REPL via I²C-Adresse 0x42. Der standardmäßige Ergebnis-Timeout beträgt fünf Sekunden. Lange Messprogramme benötigen einen höheren Timeout in host/beiis_lin/raw_repl.py; Konsolenausgabe sparsam halten.

Firmware bauen und flashen

cd ~/be-iis-lin
git switch main
git pull --ff-only
make host
make firmware-all
make test
make flash-i2c

Bei installiertem mboot startet flash-i2c den Bootloader über die laufende MicroPython-REPL, schreibt und verifiziert nur die Anwendung und startet sie neu. Ohne funktionierende REPL ist ein Update über diesen Weg nicht möglich. Erstprogrammierung und SWD-Recovery sind auf Firmware & Flashing dokumentiert. Nicht routinemäßig den Bootloader überschreiben.

LEDs und offene Grenzen

MASTER, TX und RX zeigen Aktivität mit mindestens 50 ms Leuchtdauer, SLAVE bleibt bei konfigurierten Slave-IDs an. Alle acht Active-Low-LEDs werden ausschließlich in C gesteuert; es gibt absichtlich keine MicroPython-LED-Funktion. Unbekannte Sniffer-IDs, unvollständige Frames, LIN-Diagnosetransport, Scheduler und Sleep/Wakeup werden noch nicht vollständig unterstützt.

Zur LIN-Übersicht · TIC · Quellcode