Naciśnij ESC, aby zamknąć

Наprawа ASIC krok po kroku: diagnostyka chipów i płyty hash

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)

LiniaPrawidłowe V (DC)Obraz na oscyloskopieRezystancja do GNDObjaw przy uszkodzeniu
CLK0.8–0.9VSinusoida 25 MHz, 1.8Vpp500–600 OhmŁańcuch urywa się na walniętym chipie
CO0–0.2VSzpilki impulsów 1.8V przy odpytywaniu500–600 OhmOdpytywanie układów staje w miejscu
RI1.7–1.8VPaczki impulsów przy odpowiedzi500–600 OhmZgłasza 0 ASICs albo odcina ogon płyty
RST1.8VWysoki stan logiczny500–650 OhmChipy nie wychodzą ze stanu resetu
VDD 1.8V1.8VCzysta linia (szum AC < 20 mV)1–3 kOhmLeżą bufory wejścia-wyjścia (I/O)
VDD 0.8V0.8VCzysta linia (szum AC < 15 mV)100–300 OhmNie 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:

  1. 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.
  2. Zapodajemy odrobinę topnika pod chip.
  3. Dogrzewamy hot-airem z góry (temperatura na wylocie ok. 340–360°C, średni nadmuch). Zataczamy płynne okręgi.
  4. Trącamy delikatnie chip pęsetą: jak tylko „pływa” na kulkach, sprawnym ruchem zdejmujemy go idealnie w górę.
  5. Czyścimy pady na płycie plecionką miedzianą z kalafonią, zmywamy resztki zmywaczem PCB lub izopropanolem (IPA).
  6. Kulkujemy (reballujemy) nowy chip przez sitko za pomocą kulek lub pasty ołowiowej.
  7. Ustawiamy chip według klucza (znaczek na obudowie i sitodruk na PCB muszą się pokrywać), pozycjonujemy układ.
  8. 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 &lt; 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(
                                "    -&gt; Brak wykrycia pierwszego chipa."
                            )
                            print(
                                "    -&gt; Sprawdź zasilanie płyty, RI, "
                                "RST, BOOT oraz zegar (CLK)."
                            )
                        else:
                            print(
                                f"    -&gt; Sprawdź wyjście (CLK/CO) "
                                f"chipa #{found}"
                            )
                            print(
                                f"    -&gt; 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(
                            "    -&gt; 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) &lt; 2:
        print(
            f"Użycie: {sys.argv[0]} &lt;sciezka_do_loga.txt&gt; "
            f"[oczekiwana_liczba_asic]"
        )
        sys.exit(1)
    if len(sys.argv) &gt;= 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.
Podsumuj ten wpis na blogu za pomocą:

FAQ

Należy zmierzyć rezystancję punktów kontrolnych CLK, CO, RI i RST względem masy (GND) za pomocą miernika w trybie testu diody, szukając wartości w przedziale 450–600 omów. Анализ logu systemowego pozwala ustalić ostatni wykryty układ — usterka leży na wyjściu tego chipa lub na wejściu następnego w łańcuchu.

Kluczowe są napięcia VDD 1.8V zasilające bufory wejścia-wyjścia linii sygnałowych oraz VDD 0.8V zasilające rdzeń logiczny chipa. Zanik któregokolwiek z tych napięć na pojedynczym układzie powoduje blokadę transmisji sygnału CLK i przerwanie całego łańcucha płyty.

Należy użyć oscyloskopu o paśmie co najmniej 100 MHz z sondą 10X i przyłożyć ją do punktu testowego CLK na płycie. Prawidłowy sygnał to czysta sinusoida o częstotliwości 25 MHz i amplitudzie około 1.8Vpp — spadek amplitudy lub zniekształcenie fali oznacza uszkodzenie bufora wyjściowego chipa.
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....

Dodaj opinię

Twój adres e-mail nie zostanie opublikowany. Obowiązkowe pola są oznaczone*