Jeśli S19 Pro przestał wyciągać swoje fabryczne 110 TH/s, a w panelu zamiast 76 układów świeci się 0 albo zerwana domena — czas wrzucić płytę na stanowisko diagnostyczne. W 90% przypadków mamy do czynienia z odklejonym rdzeniem od przegrzania, przebitym stabilizatorem LDO albo mikropęknięciem w laminacie.
Architektura płyty hashującej S19 Pro: jak wyglądają domeny i sygnały
Na płycie Antminera S19 Pro siedzi 76 chipów BM1398, podzielonych na 19 szeregowych domen zasilania (po 4 układy na domenę). Główne napięcie szyny (ok. 12.5–15V w zależności od softu) dzieli się między nie równomiernie. Na jedną domenę przypada średnio 0.7–0.8V, a sam chip zasilany jest napięciem VCORE rzędu 0.32–0.42V.
Sygnały idą szeregowo, po nitce do kłębka, od 1. układu (przy złączu kontrolera) aż do 76.:
- CLK (25 MHz): Sygnał zegarowy. Jeśli urwie się na 30. chipie, cała reszta za nim leży i kwiczy.
- CO (Command Output): Magistrala wejściowa komend z płyty sterującej.
- RI (Return Input): Linia zwrotna odpowiedzi do kontrolera. Leci w drugą stronę — od 76. chipa do 1.
- RST (Reset): Linia resetu. Niski stan ściąga chip do twardego resetu.
- BO (Busy Output): Sygnał zajętości magistrali.
Diagnostyka krok po kroku: od logów koparki do ciągłości ścieżek
Zaglądamy do Kernel Loga przez GUI koparki albo alternatywne oprogramowanie (VNish, HiveOS). Sprawdzamy, w którym miejscu dokładnie wysypuje się łańcuch.
Czego szukać w logach:
- Chain 1: found 0 asics — brak jakiejkolwiek odpowiedzi na linii RI. Od razu sprawdzamy 1. chip, jego zasilanie LDO albo taśmę sygnałową i jej złącze.
- Chain 2: only 42 asics found — sygnał utknął na 42. lub 43. chipie. Bierzemy na warsztat dokładnie ten odcinek.
- Read temp sensor failed — strzelił czujnik TMP75. W S19 Pro rozrzucone są po kilku domenach. Z martwym czujnikiem płyta nie ruszy ze względów bezpieczeństwa.
Pomiary punktów kontrolnych (Test Points)
Podepnij płytę pod zasilacz serwisowy lub tester (bez podawania wysokiego prądu na główną szynę) i przełącz miernik w tryb testu diody (czerwona sonda do masy GND).
[Chip 42] ---> (CO / CLK / RST) ---> [Chip 43]
[Chip 42] <--- (RI / BO) <--- [Chip 43]Względem masy rezystancja linii sygnałowych na punktach pomiarowych powinna być zbliżona na całej płycie:
- CLK, CO, RI, RST: w okolicach 450–600 Ohm.
Jeśli na 43. chipie punkt CLK piszczy na 0 Ohm (zwarcie) albo pokazuje przerwę (poza zakresem) — układ kwalifikuje się do wymiany.
Zasilanie LDO
Każda domena potrzebuje pomocniczych napięć do zasilenia wewnętrznej logiki układów. Biorą się one z małych stabilizatorów LDO:
- VDD 1.8V: zasila bufory sygnałowe.
- VDD 0.8V: zasila same rdzenie logiki.
Jeśli na chipie obecne jest 1.8V, ale brakuje 0.8V — układ nie przekaże sygnału CLK dalej i płyta obetnie łańcuch dokładnie w tym miejscu.
Po co komu oscyloskop i jak go właściwie użyć
Miernik zmierzy tylko uśrednione napięcie stałe (DC). Jest całkowicie bezużyteczny, gdy napięcie stoi prosto, ale sam sygnał jest zakłócony, ma zjedzoną amplitudę albo szum. Multimetr potrafi nieźle okłamać, za to oscyloskop od razu pokazuje pełny przebieg.
Potrzebujesz sprzętu z pasmem minimum 100 MHz i sondy z dzielnikiem 10X.
Weryfikacja CLK (Sygnał zegarowy 25 MHz):
Wpinamy się sondą w punkt pomiarowy CLK. Powinniśmy zobaczyć ładną sinusoidę lub prostokąt o amplitudzie ok. 1.8V. Jeśli zamiast tego dostaniemy spłaszczoną piłę o amplitudzie 0.4V — bufer w chipie oberwał i nie ma siły przepchnąć sygnału dalej.
Sprawdzanie paczek CO/RI:
Podczas startu płyta wystrzeliwuje krótkie paczki impulsów. Na ekranie oscyloskopu widać je jako szybkie szpilki (Burst). Jeśli na wejście 43. chipa paczka wchodzi, a z wyjścia nie wylatuje absolutnie nic — układ jest trupem albo linia RST wisi w stanie niskim.
Tętnienia na szynie zasilania (Ripple):
Przełączamy wejście oscyloskopu w tryb AC (sprzężenie zmiennoprądowe) i mierzymy kondensatory bezpośrednio na brzuchu chipa. Tętnienia powyżej 30–40 mV to jasny sygnał, że ceramika wokół układu oberwała od ciągłego przegrzewania.
Ściągawka z punktów pomiarowych (Antminer S19 Pro / BM1398)
| Linia | Prawidłowe V (DC) | Obraz na oscyloskopie | Rezystancja do GND | Objaw przy uszkodzeniu |
|---|---|---|---|---|
| CLK | 0.8–0.9V | Sinusoida 25 MHz, 1.8Vpp | 500–600 Ohm | Łańcuch urywa się na walniętym chipie |
| CO | 0–0.2V | Szpilki impulsów 1.8V przy odpytywaniu | 500–600 Ohm | Odpytywanie układów staje w miejscu |
| RI | 1.7–1.8V | Paczki impulsów przy odpowiedzi | 500–600 Ohm | Zgłasza 0 ASICs albo odcina ogon płyty |
| RST | 1.8V | Wysoki stan logiczny | 500–650 Ohm | Chipy nie wychodzą ze stanu resetu |
| VDD 1.8V | 1.8V | Czysta linia (szum AC < 20 mV) | 1–3 kOhm | Leżą bufory wejścia-wyjścia (I/O) |
| VDD 0.8V | 0.8V | Czysta linia (szum AC < 15 mV) | 100–300 Ohm | Nie działa rdzeń chipa |
Praktyka lutownicza: zdejmujemy i stawiamy BM1398
Aluminiowy rdzeń płyt S19 Pro działa jak potężny radiator. Próba zdmuchnięcia chipa samym gorącym powietrzem z góry to najprostsza droga do usmażenia laminatu i zerwania padów.
Co będzie potrzebne:
- Podgrzewacz kwarcowy / preheater (profil termiczny 160–180°C).
- Stacja Hot-Air (dysza dopasowana pod rozmiar chipa).
- Dobrej klasy topnik no-clean BGA (NC-559, Martin albo RMA-223).
- Kulki ołowiowe 0.35 mm albo pasta lutownicza ołowiowa Sn63/Pb37 (ołów topi się w 183°C, co drastycznie ułatwia życie w porównaniu do fabrycznego Bezkulkowego/Bezołowiowego spoiwa).
Kolejność kroków:
- Rzucamy płytę na preheater, powoli i równomiernie grzejemy do 150–160°C. Jak się pospieszysz — różnica rozszerzalności laminatu i aluminium wygnie płytę w banan.
- Zapodajemy odrobinę topnika pod chip.
- Dogrzewamy hot-airem z góry (temperatura na wylocie ok. 340–360°C, średni nadmuch). Zataczamy płynne okręgi.
- Trącamy delikatnie chip pęsetą: jak tylko „pływa” na kulkach, sprawnym ruchem zdejmujemy go idealnie w górę.
- Czyścimy pady na płycie plecionką miedzianą z kalafonią, zmywamy resztki zmywaczem PCB lub izopropanolem (IPA).
- Kulkujemy (reballujemy) nowy chip przez sitko za pomocą kulek lub pasty ołowiowej.
- Ustawiamy chip według klucza (znaczek na obudowie i sitodruk na PCB muszą się pokrywać), pozycjonujemy układ.
- Grzejemy od dołu wspomagając się hotem z góry, aż chip usiądzie. Dzięki napięciu powierzchniowemu płynnej cyny układ sam wskoczy na swoje miejsce.
Parser logów w Pythonie do szybkiej diagnostyki
Żeby nie grzebać w logach ręcznie, łapcie gotowy skrypt. Wrzucacie mu plik z logiem z koparki, a on sam wyciąga uszkodzoną domenę i wskazuje, na którym chipie stawiać sondę multimetru.
#!/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"[*] Parsowanie loga: {filepath}\n")
try:
with open(filepath, "r", errors="ignore") as f:
for num, line in enumerate(f, 1):
# Sprawdzanie liczby chipów w łańcuchu
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"[!] Łańcuch {chain_id}: znaleziono "
f"{found} z {EXPECTED_ASICS} chipów."
)
if found == 0:
print(
" -> Brak wykrycia pierwszego chipa."
)
print(
" -> Sprawdź zasilanie płyty, RI, "
"RST, BOOT oraz zegar (CLK)."
)
else:
print(
f" -> Sprawdź wyjście (CLK/CO) "
f"chipa #{found}"
)
print(
f" -> Sprawdź wejście (RI) oraz "
f"zasilanie LDO chipa #{found + 1}"
)
print()
# Sprawdzanie czujników temperatury
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"[!] Błąd czujnika temperatury "
f"#{sensor_id} (linia {num})."
)
print(
" -> Sprawdź TMP75, zasilanie "
"czujnika oraz magistralę I2C."
)
print()
# Podsumowanie
print("=" * 60)
print("PODSUMOWANIE DIAGNOSTYKI")
print("=" * 60)
if not issues_found:
print("[+] Nie wykryto znanych wzorców błędów.")
return False
if problem_chains:
print("\nUszkodzone łańcuchy:")
for chain_id, found, expected in problem_chains:
print(
f" - Chain {chain_id}: "
f"{found}/{expected} ASIC"
)
if reported_sensors:
print("\nBłędy czujników temperatury:")
for sensor_id in sorted(reported_sensors):
print(f" - Sensor {sensor_id}")
print()
return True
except FileNotFoundError:
print(f"[-] Nie znaleziono pliku: {filepath}")
return True
except Exception as e:
print(f"[-] Błąd podczas przetwarzania pliku: {e}")
return True
if __name__ == "__main__":
if len(sys.argv) < 2:
print(
f"Użycie: {sys.argv[0]} <sciezka_do_loga.txt> "
f"[oczekiwana_liczba_asic]"
)
sys.exit(1)
if len(sys.argv) >= 3:
try:
EXPECTED_ASICS = int(sys.argv[2])
except ValueError:
print("[-] oczekiwana_liczba_asic musi być liczbą.")
sys.exit(1)
has_issues = parse_asic_log(sys.argv[1])
sys.exit(1 if has_issues else 0)Przykłady użycia:
python diag.py kernel.log
Dla płyty z inną liczbą układów:
- python diag.py kernel.log 63
- python diag.py kernel.log 72
- python diag.py kernel.log 80
Checklista kontrolna przed wrzuceniem płyty z powrotem do budy
- Rezystancja szyny VCORE: Oporność względem masy nie może wynosić zero (szukamy zwarcia).
- Kontrola LDO bez pełnego obciążenia: Podajemy zasilanie z zasilacza laboratoryjnego i sprawdzamy obecność 1.8V oraz 0.8V na wymienionym układzie.
- Przepływ sygnału: Sprawdzamy oscyloskopem, czy sygnał 25 MHz przechodzi przez wlutowany chip dalej w łańcuch.
- Test pod obciążeniem: Składamy koparkę do kupy, podpinamy pod fabryczne wentylatory, wygrzewamy płytę na stockowym sofcie przez 2–3 godziny i monitorujemy błędne obliczenia (HW errors) na tej domenie.