Se o seu S19 Pro parou de entregar os 110 TH/s de praxe e na interface web aparece 0 em vez dos 76 chips — ou aquela corrente partida —, é hora de mandar essa hashboard pra bancada de diagnóstico. Em 90% dos casos, o B.O. é BGA com solda fria por superaquecimento, LDO curto-circuitado ou microtrinca no PCB.
Arquitetura da Hashboard do S19 Pro: Como funcionam os domínios e sinais
A placa do Antminer S19 Pro vem equipada com 76 chips BM1398, divididos em 19 domínios de alimentação em série (4 chips por domínio). A tensão total do barramento (algo em torno de 12.5 a 15V, dependendo da firmware) é distribuída entre eles. Cada domínio recebe, em média, de 0.7 a 0.8V, enquanto o chip em si roda com um VCORE entre 0.32 e 0.42V.
Os sinais trafegam em cascata, do chip 1 (perto do conector da control board) até o 76º:
- CLK (25 MHz): Sinal de clock. Se o clock morrer no 30º chip, todo mundo depois dele apaga.
- CO (Command Output): Linha de entrada dos comandos enviados pela placa de controle.
- RI (Return Input): Linha de resposta para a control board. Caminha no sentido inverso: do 76º chip de volta ao 1º.
- RST (Reset): Linha de reset. Nível lógico baixo aqui coloca o ASIC em reset forçado.
- BO (Busy Output): Sinal de indicação de barramento ocupado.
Diagnóstico Passo a Passo: Do log do minerador ao multímetro
Abra o Kernel Log pela interface web da máquina ou pela firmware custom (VNish, HiveOS). Vamos identificar exatamente onde a cadeia está caindo.
O que procurar nos logs:
- Chain 1: found 0 asics — Sem resposta na linha RI. Vá direto no 1º chip, na alimentação do LDO dele ou no cabo de sinal.
- Chain 2: only 42 asics found — Sinal travou no chip 42 ou 43. Pode ir em cima dessa região.
- Read temp sensor failed — Sensor TMP75 foi pro espaço. No S19 Pro, eles ficam espalhados por vários domínios. Se o sensor morrer, a placa não arma por proteção.
Aferição dos Test Points
Alimente a placa com uma fonte de bancada ou testador de hashboard (sem injetar alta corrente no barramento) e coloque o multímetro no modo de teste de diodo (ponta vermelha no GND).
[Chip 42] ---> (CO / CLK / RST) ---> [Chip 43]
[Chip 42] <--- (RI / BO) <--- [Chip 43]Em relação ao terra, a queda de tensão nas linhas de sinal nos test points deve ser consistente ao longo de toda a placa:
- CLK, CO, RI, RST: Na casa dos 450 a 600 mV (ou ohms, dependendo da escala).
Se no chip 43 o ponto CLK bipar em 0 ohms (curto) ou der escala infinita (aberto) — pode sacar o chip fora.
Alimentação dos LDOs
Cada domínio precisa de tensões auxiliares para a lógica interna dos chips. Quem gera essas tensões são os micro-reguladores LDO:
- VDD 1.8V: Alimenta os barramentos de I/O de sinal.
- VDD 0.8V: Alimenta o núcleo lógico (core).
Se o chip tem 1.8V mas falta os 0.8V — ele não vai repassar o CLK pra frente, e a placa corta a cadeia ali.
Por que usar o Osciloscópio e como medir
O multímetro só mostra a média em tensão contínua (DC). Ele é cego quando a tensão está presente, mas o sinal está atenuado, ruidoso ou com rampa deformada. O multímetro te engana bonito; o osciloscópio entrega a forma de onda na hora.
Você vai precisar de um equipamento de pelo menos 100 MHz e ponta de prova em 10X.
Medindo o CLK (Frequência de Clock de 25 MHz):
Injete a ponta no test point do CLK. A leitura correta é uma onda senoidal ou quadrada limpa com amplitude próxima de 1.8Vpp. Se em vez disso você vir um dente de serra esmagado de 0.4V, o buffer interno do chip queimou e não consegue empurrar o sinal pra frente.
Checando rajadas de dados (CO/RI):
No boot, a placa envia pacotes rápidos de dados. No osciloscópio, isso aparece como pequenos pulsos (Bursts). Se o pacote entra no chip 43 mas não sai do outro lado — o chip morreu ou está com o RST travado em zero.
Ripple no barramento de alimentação:
Mude a entrada do osciloscópio para modo AC (acoplamento AC) e meça nos capacitores embaixo do chip. Pulsações acima de 30–40 mV indicam que os capacitores cerâmicos ao redor deram fuga por estresse térmico.
Tabela de Referência de Test Points (Antminer S19 Pro / BM1398)
| Linha | Tensão DC Normal | Sinal no Osciloscópio | Queda de Tensão / Impede em GND | Sintoma de Falha |
|---|---|---|---|---|
| CLK | 0.8–0.9V | Onda senoidal 25 MHz, 1.8Vpp | 500–600 mV | Cadeia interrompida no chip defeituoso |
| CO | 0–0.2V | Pulsos de 1.8V durante a varredura | 500–600 mV | Comunicação com os chips trava |
| RI | 1.7–1.8V | Pulsos de resposta de 1.8V | 500–600 mV | Retorna 0 ASICs ou corta o final da placa |
| RST | 1.8V | Nível lógico alto constante | 500–650 mV | Chips não saem do estado de reset |
| VDD 1.8V | 1.8V | Linha limpa (ruído AC < 20 mV) | 1–3 kΩ | Buffers de I/O param de funcionar |
| VDD 0.8V | 0.8V | Linha limpa (ruído AC < 15 mV) | 100–300 Ω | Core do ASIC não inicializa |
Prática de Soldagem BGA: Sacando e reballando o BM1398
As placas em substrato de alumínio do S19 Pro dissipam calor absurdamente rápido. Tentar tirar o chip só no soprador de ar quente por cima é receita certa pra empenar o PCB, queimar a estrutura do componente e arrancar pad da placa.
Ferramental necessário:
- Pré-aquecedor / Mesa de pré-aquecimento (perfil térmico em 160–180°C).
- Estação de retrabalho a ar quente (bocal sob medida para o chip).
- Fluxo BGA no-clean de boa qualidade (NC-559, Martin ou RMA-223).
- Esferas de solda com chumbo (Sn63/Pb37) 0.35 mm ou pasta de solda leaded (o chumbo funde a 183°C, facilitando a vida em comparação com o lead-free original).
Passo a passo no procedimento:
- Posicione a placa no pré-aquecedor e suba a temperatura gradativamente até 150–160°C. Apressar essa etapa vai criar uma dilatação desigual entre o fenolite/composite e o substrato de alumínio, empenando a placa.
- Aplique uma pequena quantidade de fluxo sob o ASIC.
- Entre com o soprador por cima (ajustado em ~340–360°C, vazão de ar média), fazendo movimentos circulares e constantes.
- Toque de leve no chip com a pinça: assim que ele "flutuar" nas esferas de solda, remova-o com cuidado, levantando na vertical.
- Faça a limpeza dos pads no PCB utilizando malha dessoldadora de cobre com breu e limpe com álcool isopropílico.
- Faça o reballing do chip novo utilizando o stencil apropriado e a pasta/esferas com chumbo.
- Alinhe o chip no PCB observando o pino 1 (a marcação no corpo do chip deve bater perfeitamente com a serigrafia da placa).
- Aaqueça novamente na mesa com auxílio do ar quente por cima até a fusão. O próprio efeito de tensão superficial da solda líquida vai alinhar o chip no lugar.
Script em Python para Parsear Logs e Acelerar o Diagnóstico
Para não ter que caçar erro linha por linha na raça, montei este script. É só rodar o log do minerador nele que ele te entrega o ponto de falha e indica em qual chip meter o multímetro.
#!/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"[*] Analisando log: {filepath}\n")
try:
with open(filepath, "r", errors="ignore") as f:
for num, line in enumerate(f, 1):
# Checa a contagem de ASICs na cadeia
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"[!] Cadeia {chain_id}: encontrados "
f"{found} chips de {EXPECTED_ASICS}."
)
if found == 0:
print(
" -> Primeiro chip da cadeia nao foi detectado."
)
print(
" -> Checar alimentacao da placa, RI, "
"RST, BOOT e clock."
)
else:
print(
f" -> Testar saida (CLK/CO) "
f"do chip #{found}"
)
print(
f" -> Testar entrada (RI) e "
f"LDO do chip #{found + 1}"
)
print()
# Checa falhas nos sensores de temperatura
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"[!] Erro no sensor de temperatura "
f"#{sensor_id} (linha {num})."
)
print(
" -> Checar TMP75, alimentacao "
"do sensor e barramento I2C."
)
print()
# Resumo final
print("=" * 60)
print("RESUMO DO DIAGNOSTICO")
print("=" * 60)
if not issues_found:
print("[+] Nenhum problema detectado pelos padrões.")
return False
if problem_chains:
print("\nCadeias com falha:")
for chain_id, found, expected in problem_chains:
print(
f" - Chain {chain_id}: "
f"{found}/{expected} ASICs"
)
if reported_sensors:
print("\nErros de sensor de temperatura:")
for sensor_id in sorted(reported_sensors):
print(f" - Sensor {sensor_id}")
print()
return True
except FileNotFoundError:
print(f"[-] Arquivo nao encontrado: {filepath}")
return True
except Exception as e:
print(f"[-] Erro ao processar arquivo: {e}")
return True
if __name__ == "__main__":
if len(sys.argv) < 2:
print(
f"Uso: {sys.argv[0]} <caminho_do_log.txt> "
f"[expected_asics]"
)
sys.exit(1)
if len(sys.argv) >= 3:
try:
EXPECTED_ASICS = int(sys.argv[2])
except ValueError:
print("[-] expected_asics deve ser um numero inteiro.")
sys.exit(1)
has_issues = parse_asic_log(sys.argv[1])
sys.exit(1 if has_issues else 0)Exemplos de execução:
python diag.py kernel.log
Para placas com contagem diferente de chips:
- python diag.py kernel.log 63
- python diag.py kernel.log 72
- python diag.py kernel.log 80
Checklist Final antes de Fechar no Gabinete
- Resistência do barramento VCORE: A impedância em relação ao GND não pode estar zerada (curto-circuito).
- Validação dos LDOs sem carga total: Alimente com a fonte de bancada e confirme a presença dos 1.8V e 0.8V no chip substituído.
- Inspecionar o sinal: Verifique com o osciloscópio se o clock de 25 MHz passa redondo pelo chip soldado e segue a cadeia.
- Burn-in sob estresse: Monte a placa de volta no gabinete com os coolers originais e rode por 2 a 3 horas na firmware oficial acompanhando a taxa de HW erros na cadeia afetada.