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)
| Signalleitung | Soll-Spannung V (DC) | Oszilloskop-Signal | Widerstand gegen GND | Fehlersymptom bei Unterbrechung |
|---|---|---|---|---|
| CLK | 0,8–0,9 V | 25-MHz-Sinus, 1,8 Vpp | 500–600 Ohm | Chain bricht am defekten Chip ab |
| CO | 0–0,2 V | 1,8-V-Bursts bei Abfrage | 500–600 Ohm | Chip-Enumeration stoppt |
| RI | 1,7–1,8 V | Signalpakete bei Rückmeldung | 500–600 Ohm | Log zeigt 0 ASICs oder beschneidet Board-Ende |
| RST | 1,8 V | Logisch HIGH | 500–650 Ohm | Chips kommen nicht aus dem Reset |
| VDD 1.8V | 1,8 V | Saubere Gleichspannung (AC-Rippel < 20 mV) | 1–3 kOhm | I/O-Puffer fallen aus |
| VDD 0.8V | 0,8 V | Saubere Gleichspannung (AC-Rippel < 15 mV) | 100–300 Ohm | Chip-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:
- 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.
- Etwas Flussmittel unter den Chip geben.
- Mit der Heißluft von oben nachhelfen (Lufttemperatur ca. 340–360 °C, mittlerer Flow) und in kreisenden Bewegungen erhitzen.
- Mit der Pinzette antippen: Sobald der Chip auf den flüssigen Balls „schwimmt“, vorsichtig senkrecht nach oben abheben.
- Pads auf der Platine mit Entlötlitze und Kolophonium säubern, anschließend mit Isopropanol (IPA) gründlich reinigen.
- Neuen Chip mit Stencil und Bleilot-Paste bzw. BGA-Balls reballen.
- Chip anhand der Markierung (Pin 1 / Markierung auf Platinen-Bestückungsdruck) exakt ausrichten.
- 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.