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.