Drücken Sie ESC, um zu schließen

ASIC Miner selbst reparieren: Chip-Diagnose & Board-Tausch

Wenn der S19 Pro seine 110 TH/s nicht mehr liefert und im Web-Interface statt 76 Chips nur noch 0 oder eine unterbrochene Chain angezeigt werden — ab auf den Teststand mit dem Hashboard. In 90 % der Fälle haben wir es mit einem abgerauchten Die durch Überhitzung, einem defekten LDO-Regler oder einem Haarriss in der Platine zu tun.

Hashboard-Architektur des S19 Pro: Spannungsdomänen und Signalwege

Auf dem Hashboard des Antminer S19 Pro arbeiten 76 BM1398-Chips, aufgeteilt in 19 in Reihe geschaltete Spannungsdomänen (4 Chips pro Domäne). Die Gesamtspannung der Busbar (ca. 12,5–15 V je nach Firmware) teilt sich entsprechend auf. Pro Domäne fallen etwa 0,7–0,8 V ab, während der ASIC selbst mit einer VCORE von etwa 0,32–0,42 V versorgt wird.

Die Signale werden sequenziell von Chip 1 (nahe am Steuerplatinen-Stecker) bis Chip 76 durchgeschleift:

  • CLK (25 MHz): Der Taktgeber. Bricht das Signal bei Chip 30 ab, ist dahinter die komplette Chain tot.
  • CO (Command Output): Die eingehende Befehlsleitung vom Control Board.
  • RI (Return Input): Die Rückleitung zum Control Board. Läuft rückwärts — von Chip 76 zu Chip 1.
  • RST (Reset): Reset-Leitung. Ein Low-Pegel hier schickt den Chip in den Hard-Reset.
  • BO (Busy Output): Signal für die Leitungsbelegung.

Schritt-für-Schritt-Diagnose: Vom Miner-Log zum Durchmessen

Erstmal das Kernel Log über das Web-Interface oder die custom Firmware (VNish, HiveOS) ziehen und prüfen, an welcher Stelle die Kette abreißt.

Worauf im Log zu achten ist:

  • Chain 1: found 0 asics — Kein Antwortsignal auf der RI-Leitung. Direkt Chip 1, dessen LDO-Versorgung und den Flachbandstecker prüfen.
  • Chain 2: only 42 asics found — Das Signal „hängt“ bei Chip 42 oder 43. Fokus sofort auf diesen Bereich legen.
  • Read temp sensor failed — Ein TMP75-Temperatursensor hat sich verabschiedet. Beim S19 Pro sitzen diese verteilt auf mehreren Domänen. Mit defektem Sensor verweigert das Board aus Schutzgründen den Start.

Messen an den Test Points (Messpunkten)

Das Board über ein Labornetzteil oder einen Tester mit Spannung versorgen (ohne Hochstrom auf der Busbar!) und das Multimeter in die Diodenprüfung schalten (rote Messspitze an Masse/GND).

[Chip 42] ---> (CO / CLK / RST) ---> [Chip 43]
[Chip 42] <--- (RI / BO)        <--- [Chip 43]

Der Widerstand der Signalleitungen gegen Masse sollte an den Messpunkten über das gesamte Board hinweg weitgehend identisch sein:

  • CLK, CO, RI, RST: im Bereich von 450–600 Ohm.

Wenn bei Chip 43 der CLK-Punkt gegen 0 Ohm piept (Kurzschluss) oder unendlichen Widerstand zeigt — Chip tauschen.

LDO-Spannungsversorgung

Jede Domäne benötigt Hilfsspannungen für die interne Logik der ASICs. Diese werden von kleinen LDO-Reglern bereitgestellt:

  • VDD 1.8V: versorgt die Signalverarbeitung/I/O-Domain.
  • VDD 0.8V: versorgt den internen Logikkern.

Liegen am Chip zwar 1,8 V an, aber die 0,8 V fehlen — kann der ASIC das CLK-Signal nicht weiterschleifen, und die Chain bricht genau dort ab.

Wann das Oszilloskop ran muss und wie man misst

Das Multimeter misst nur geglättete Gleichspannung (DC). Es hilft nicht weiter, wenn die Pegel zwar stimmen, das Signal aber voller Rauschen ist oder die Amplitude eingebrochen ist. Während das DMM hier schlicht lügt, zeigt das Oszi sofort Tacheles.

Benötigt wird ein Oszilloskop mit mindestens 100 MHz Bandbreite und ein Tastkopf mit 10X-Teiler.

CLK-Prüfung (25 MHz Takt):

Tastkopf an den Test Point CLK halten. Zu sehen sein sollte ein sauberer Sinus oder Rechteckimpuls mit ca. 1,8 Vpp. Zeigt sich statt eines sauberen Signals nur ein plattgedrückter Sägezahn mit 0,4 V Amplitude, ist der Treiberbaustein im Chip angestochen und schafft die Dämpfung der Leitung nicht mehr.

CO/RI-Signalpakete prüfen:

Beim Booten feuert das Board kurze Burst-Pakete. Auf dem Oszi sieht man diese als schnelle Impulse. Kommt am Eingang von Chip 43 ein Paket an, aber am Ausgang kommt nichts raus, ist der Chip entweder hinüber oder RST steht auf Low.

Rippel auf der Versorgungsspannung (Ripple):

Oszi-Eingang auf AC-Kopplung schalten und die Stützkondensatoren direkt unter dem Chip abgreifen. Welligkeiten von mehr als 30–40 mV AC deuten darauf hin, dass die Keramikkondensatoren (MLCCs) um den Chip durch die Dauerhitze degradiert sind.

Messwert-Referenz (Antminer S19 Pro / BM1398)

SignalleitungSoll-Spannung V (DC)Oszilloskop-SignalWiderstand gegen GNDFehlersymptom bei Unterbrechung
CLK0,8–0,9 V25-MHz-Sinus, 1,8 Vpp500–600 OhmChain bricht am defekten Chip ab
CO0–0,2 V1,8-V-Bursts bei Abfrage500–600 OhmChip-Enumeration stoppt
RI1,7–1,8 VSignalpakete bei Rückmeldung500–600 OhmLog zeigt 0 ASICs oder beschneidet Board-Ende
RST1,8 VLogisch HIGH500–650 OhmChips kommen nicht aus dem Reset
VDD 1.8V1,8 VSaubere Gleichspannung (AC-Rippel < 20 mV)1–3 kOhmI/O-Puffer fallen aus
VDD 0.8V0,8 VSaubere Gleichspannung (AC-Rippel < 15 mV)100–300 OhmChip-Core ohne Funktion

Lötpraxis: BM1398 fachgerecht abziehen und auflöten

Die Aluminium-Substratboards des S19 Pro wirken wie ein riesiger Kühlkörper. Zu versuchen, den Chip einfach von oben mit der Heißluftstation runterzublasen, frittiert garantiert das Substrat und reißt die Pads ab.

Das wird an Werkzeug benötigt:

  • Heizplatte / Preheater (Temperaturprofil 160–180 °C).
  • Heißluftstation (Passende Düse für BGA-Chipgröße).
  • No-Clean BGA-Flussmittel (NC-559, Martin oder RMA-223).
  • Bleihaltige Lötkugeln (0,35 mm) oder Bleilot-Paste Sn63/Pb37 (Schmelzpunkt 183 °C — macht das Leben im Vergleich zum werksseitigen Bleifreilot extrem viel leichter).

Vorgehensweise:

  1. Hashboard auf den Preheater legen und langsam auf 150–160 °C vorwärmen. Zu schnelles Aufheizen verzieht das Board durch unterschiedliche Ausdehnung von FR4 und Aluminium wie eine Banane.
  2. Etwas Flussmittel unter den Chip geben.
  3. Mit der Heißluft von oben nachhelfen (Lufttemperatur ca. 340–360 °C, mittlerer Flow) und in kreisenden Bewegungen erhitzen.
  4. Mit der Pinzette antippen: Sobald der Chip auf den flüssigen Balls „schwimmt“, vorsichtig senkrecht nach oben abheben.
  5. Pads auf der Platine mit Entlötlitze und Kolophonium säubern, anschließend mit Isopropanol (IPA) gründlich reinigen.
  6. Neuen Chip mit Stencil und Bleilot-Paste bzw. BGA-Balls reballen.
  7. Chip anhand der Markierung (Pin 1 / Markierung auf Platinen-Bestückungsdruck) exakt ausrichten.
  8. Unter Preheater-Einsatz mit Heißluft zügig auflöten. Der Chip zieht sich durch die Oberflächenspannung des flüssigen Lots von selbst in Position.

Log-Parser in Python für die Schnell-Diagnose

Damit man sich das manuelle Durchforsten der Logs spart, hier ein fertiges Script. Einfach das Miner-Log reinwerfen – das Tool isoliert die defekte Chain und zeigt direkt, an welchem Chip das Multimeter angesetzt werden muss.

#!/usr/bin/env python3
import re
import sys

EXPECTED_ASICS = 76

def parse_asic_log(filepath):
    chain_pattern = re.compile(
        r"Chain\[(\d+)\]:\s*found\s*(\d+)\s*asics",
        re.IGNORECASE
    )
    sensor_pattern = re.compile(
        r"sensor[\[\s]*(\d+)[\]\s]*.*temp.*error",
        re.IGNORECASE
    )

    issues_found = False
    problem_chains = []
    reported_sensors = set()

    print(f"[*] Analysiere Logdatei: {filepath}\n")

    try:
        with open(filepath, "r", errors="ignore") as f:
            for num, line in enumerate(f, 1):
                # Anzahlerfassung der ASIC-Chips in der Chain
                c_match = chain_pattern.search(line)
                if c_match:
                    chain_id = int(c_match.group(1))
                    found = int(c_match.group(2))
                    if found < EXPECTED_ASICS:
                        issues_found = True
                        problem_chains.append(
                            (chain_id, found, EXPECTED_ASICS)
                        )
                        print(
                            f"[!] Chain {chain_id}: "
                            f"{found} von {EXPECTED_ASICS} Chips gefunden."
                        )
                        if found == 0:
                            print(
                                "    -> Erster Chip der Chain nicht erkannt."
                            )
                            print(
                                "    -> Stromversorgung, RI, RST, BOOT "
                                "und Taktung prüfen."
                            )
                        else:
                            print(
                                f"    -> Signal-Ausgang (CLK/CO) von "
                                f"Chip #{found} prüfen."
                            )
                            print(
                                f"    -> Signal-Eingang (RI) und "
                                f"LDO-Spannung von Chip #{found + 1} prüfen."
                            )
                        print()

                # Fehlerprüfung der Temperatursensoren
                s_match = sensor_pattern.search(line)
                if s_match:
                    sensor_id = int(s_match.group(1))
                    if sensor_id not in reported_sensors:
                        issues_found = True
                        reported_sensors.add(sensor_id)
                        print(
                            f"[!] Temperatursensor #{sensor_id} "
                            f"Fehler (Zeile {num})."
                        )
                        print(
                            "    -> TMP75, Sensor-Stromversorgung und "
                            "I2C-Bus prüfen."
                        )
                        print()

        # Zusammenfassung
        print("=" * 60)
        print("ZUSAMMENFASSUNG")
        print("=" * 60)
        if not issues_found:
            print("[+] Keine bekannten Fehler in der Logdatei gefunden.")
            return False

        if problem_chains:
            print("\nFehlerhafte Chains:")
            for chain_id, found, expected in problem_chains:
                print(
                    f"  - Chain {chain_id}: "
                    f"{found}/{expected} ASICs"
                )

        if reported_sensors:
            print("\nDefekte Temperatursensoren:")
            for sensor_id in sorted(reported_sensors):
                print(f"  - Sensor {sensor_id}")
        print()
        return True

    except FileNotFoundError:
        print(f"[-] Datei nicht gefunden: {filepath}")
        return True
    except Exception as e:
        print(f"[-] Fehler beim Verarbeiten der Datei: {e}")
        return True

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(
            f"Nutzung: {sys.argv[0]} <Pfad_zur_Logdatei.txt> "
            f"[erwartete_asics]"
        )
        sys.exit(1)

    if len(sys.argv) >= 3:
        try:
            EXPECTED_ASICS = int(sys.argv[2])
        except ValueError:
            print("[-] erwartete_asics muss eine Ganzzahl sein.")
            sys.exit(1)

    has_issues = parse_asic_log(sys.argv[1])
    sys.exit(1 if has_issues else 0)

Beispiele für den Aufruf:

python diag.py kernel.log

Für Boards mit abweichender Chip-Anzahl:

  • python diag.py kernel.log 63
  • python diag.py kernel.log 72
  • python diag.py kernel.log 80

Pre-Flight-Checklist vor dem Einbau ins Gehäuse

  • VCORE-Widerstand messen: Der Widerstand gegen Masse darf keinesfalls niederohmig/Null sein (Kurzschlussprüfung).
  • LDO-Prüfung ohne Last: Board am Labornetzteil versorgen und prüfen, ob die 1,8 V und 0,8 V am getauschten Chip sauber anliegen.
  • Signaldurchgang testen: Mit dem Oszi verifizieren, ob der 25-MHz-Takt den aufgelöteten Chip passiert und weitergeleitet wird.
  • Stresstest unter Volllast: Miner wieder komplett montieren, originale Lüfter anschließen und das Board auf Stock-Firmware 2–3 Stunden unter Vollwert-Load fahren. Dabei das Log gezielt auf HW-Errors dieser Chain beobachten.
Diesen Blogbeitrag zusammenfassen mit:

FAQ

Schalten Sie das Multimeter in den Diodentestmodus und messen Sie den Widerstand der Testpunkte CLK, CO, RI und RST gegen Masse (GND), wobei die Normalwerte zwischen 450 und 600 Ohm liegen. Prüfen Sie das Kernel-Log auf den zuletzt erkannten ASIC-Index — der Defekt liegt am Ausgang dieses Chips oder am Eingang des nachfolgenden Chips, der das RI-Signal blockiert.

Jeder Chip benötigt eine VDD 1,8V-Schiene für die Signal-Eingangs-/Ausgangspuffer sowie eine VDD 0,8V-Schiene für die Stromversorgung des internen Logikkerns. Bricht eine dieser LDO-Spannungen ab, geht der Chip in den inaktiven Zustand über, unterbricht die CLK-Signalübertragung und veranlasst das Steuergerät zum Abschalten der gesamten Hashboard-Kette.

Schließen Sie ein Oszilloskop mit mindestens 100 MHz Bandbreite und einem 10X-Tastkopf an den Testpunkt CLK an, um eine stabile 25-MHz-Sinuswelle mit einer Amplitude von etwa 1,8Vpp zu überprüfen. Wechseln Sie in den AC-Kopplungsmodus, um Spannungs-Ripple an den VCORE-Kondensatoren zu messen, die den Grenzwert von 30 bis 40 mV nicht überschreiten dürfen.
Sying Yu

I am a blockchain developer specializing in building secure, scalable, and innovative decentralized solutions. My expertise covers smart contracts, payment systems, and integrating crypto with fiat to optimize financial workflows. I thrive on creating modern, efficient tools for the evolving digital economy....

Diskussion beitreten

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *