Les bonnes décisions de DFT prises lors du routage du PCB réduisent directement le temps de test, le coût des fixations et les défauts échappés à l'ICT, au test fonctionnel et à la programmation in-situ. Une carte difficile à sonder est difficile à tester automatiquement. Ce guide couvre les décisions mécaniques et électriques qui rendent les tests automatisés avec OpenHTF et TofuPilot réalisables.
Ce que signifie la DFT pour les PCBA
La conception pour la testabilité (DFT) est l'ensemble des décisions de routage et de schéma qui rendent un PCBA observable et contrôlable pendant les tests de fabrication.
| Propriété | Définition | Impact sur le test |
|---|---|---|
| Observabilité | Pouvez-vous mesurer le signal ? | L'absence de points de test force des suppositions aveugles |
| Contrôlabilité | Pouvez-vous forcer le circuit dans un état connu ? | L'absence d'isolation rend les tests au niveau composant impossibles |
| Accessibilité | La sonde peut-elle physiquement atteindre le pad ? | Les vias recouverts et les pads sous-dimensionnés cassent les fixations |
Directives de placement des points de test
Les points de test sont l'interface entre votre carte et la fixation de test. Chaque net que vous souhaitez sonder en ICT ou test fonctionnel en nécessite un.
Exigences physiques
| Paramètre | Minimum | Préféré |
|---|---|---|
| Diamètre du point de test | 0,9 mm (35 mil) | 1,27 mm (50 mil) |
| Espacement pad à pad | 1,27 mm centre à centre | 2,54 mm (grille 100 mil) |
| Dégagement des composants | 0,5 mm | 1,0 mm |
| Dégagement du bord de carte | 3,0 mm | 5,0 mm |
| Course max de la sonde (contact à ressort) | 3,0 mm | 1,5 mm nominal |
Placez les points de test sur une grille de 100 mil dans la mesure du possible. Les fixations à lit de clous sont construites sur cette grille.
Quels nets nécessitent des points de test
Couvrez au minimum :
- Les rails d'alimentation (VCC, VBAT, VIO, toutes les sorties de régulateurs)
- La masse (une par domaine d'alimentation)
- Les E/S numériques des microcontrôleurs et FPGA
- Les chemins de signaux analogiques (entrée et sortie)
- Les broches de l'oscillateur à quartz
- Les lignes de reset
- Les bus de communication (UART TX/RX, SPI CS/CLK/MOSI/MISO, I2C SDA/SCL)
- Les interfaces de programmation et debug (SWDIO, SWDCLK, TDI, TDO, TMS, TCK)
Règles de placement
Placez les points de test côté primaire (côté composants) dans la mesure du possible. Les fixations double face sont coûteuses et ralentissent le temps de cycle. Si un net ne route que côté verso, ajoutez un via vers le dessus avec un point de test.
Ne recouvrez pas les vias des points de test avec du vernis épargne. Les vias recouverts de vernis sont courants pour la densité mais tuent l'accès ICT.
Erreurs DFT courantes et impact sur le coût des tests
| Erreur | Comment elle se manifeste | Impact sur le coût |
|---|---|---|
| Points de test uniquement côté verso | Nécessite une fixation double face | 2x le coût de fixation, temps de cycle plus lent |
| Points de test sous les connecteurs ou dissipateurs | Inaccessibles par contact à ressort | Le net est intestable sans reprise |
| Vias CMS avec vernis épargne | La sonde ne peut pas établir le contact | Faux échecs à l'ICT, défauts échappés |
| Pas de point de test sur le rail d'alimentation | Impossible de vérifier la tension de régulation | Les défauts d'alimentation passent inaperçus |
| Référence de masse manquante près du TP analogique | Mesure flottante | Bruit, fausses limites |
| Pas de point de test de reset | Impossible de forcer le DUT dans un état connu | Le test fonctionnel doit se fier uniquement au POR |
| Pads de points de test de 0,5 mm ou moins | Les contacts à ressort manquent ou glissent | Contact intermittent, faible rendement de fixation |
| Points de test à des coordonnées arbitraires | Broches hors grille, complexité de fixation | Coût de fabrication de fixation plus élevé |
Considérations sur le Boundary Scan (JTAG)
Le boundary scan JTAG (IEEE 1149.1) teste l'interconnexion et le fonctionnement de base des composants sans fixation à lit de clous.
Pour que le JTAG fonctionne en fabrication :
- Tous les composants compatibles JTAG doivent être dans la chaîne de scan (pas de broches TAP non connectées)
- Le TDO de chaque composant se connecte au TDI du suivant
- TMS et TCK sont partagés entre tous les composants
- TRST est tiré au niveau haut avec une résistance de 10k (actif bas)
- La chaîne doit être accessible via un connecteur ou des points de test
Incluez un connecteur ARM JTAG 10 broches ou JTAG 20 broches peuplé sur les cartes EVT. Dépeuplez le connecteur sur les versions de production mais conservez l'empreinte et les points de test.
Connecteurs de programmation et interfaces de debug
| Interface | Connecteur | Signaux nécessaires |
|---|---|---|
| ARM SWD | Cortex Debug 10 broches | SWDIO, SWDCLK, GND, VCC, nRESET |
| JTAG (ARM) | JTAG 20 broches | TDI, TDO, TMS, TCK, nRESET, VCC, GND |
| Bootloader UART | 4 broches 2,54 mm | TX, RX, GND, VCC |
| Flash SPI | 6 broches | CS, CLK, MOSI, MISO, GND, VCC |
| FPGA JTAG | 6 broches | TDI, TDO, TMS, TCK, GND, VCC |
De nombreux microcontrôleurs ont des broches BOOT0/BOOT1 qui sélectionnent le mode de programmation. Celles-ci doivent être contrôlables depuis la fixation de test. Ajoutez un point de test sur BOOT0.
Comment la DFT permet les tests automatisés avec OpenHTF et TofuPilot
Avec des points de test, un accès JTAG et une interface de programmation contrôlable, vous pouvez construire une fixation qui pilote le DUT à travers une séquence de test complète sans intervention humaine.
import time
import subprocess
import serial
import openhtf as htf
from tofupilot.openhtf import TofuPilot
def program_firmware(test):
"""Flasher le firmware via SWD avec pyocd."""
result = subprocess.run(
["pyocd", "flash", "--target", "stm32g431rb", "firmware.hex"],
capture_output=True,
text=True,
timeout=30,
)
test.logger.info(result.stdout)
if result.returncode != 0:
test.logger.error(result.stderr)
return htf.PhaseResult.STOP
@htf.measures(
htf.Measurement("vcc_3v3")
.in_range(minimum=3250, maximum=3350),
htf.Measurement("vbat")
.in_range(minimum=3500, maximum=4200),
)
def measure_power_rails(test):
"""Sonder les points de test VCC et VBAT avec un multimètre."""
test.measurements.vcc_3v3 = 3312 # Remplacer par la lecture réelle du DMM * 1000
test.measurements.vbat = 3850 # Remplacer par la lecture réelle du DMM * 1000
@htf.measures(
htf.Measurement("uart_echo_ok").equals(True),
htf.Measurement("uart_response_time")
.in_range(minimum=0, maximum=100),
)
def test_uart_comms(test):
"""Envoyer une commande via UART, vérifier l'écho et le temps de réponse."""
with serial.Serial("/dev/ttyUSB0", baudrate=115200, timeout=1) as port:
port.write(b"PING\r
")
t0 = time.monotonic()
response = port.readline().decode().strip()
elapsed_ms = (time.monotonic() - t0) * 1000
test.measurements.uart_echo_ok = response == "PONG"
test.measurements.uart_response_time = round(elapsed_ms, 1)
def main():
test = htf.Test(
program_firmware,
measure_power_rails,
test_uart_comms,
test_name="PCBA Functional Test",
)
with TofuPilot(test):
test.execute(test_start=lambda: input("Numéro de série : "))
if __name__ == "__main__":
main()Chaque phase correspond à un point de test ou une interface sur la carte. program_firmware utilise le SWD. measure_power_rails utilise les points de test sur VCC et VBAT. test_uart_comms utilise le connecteur UART.
Carte bien conçue vs carte mal conçue
| Étape | DUT bien conçu | DUT mal conçu |
|---|---|---|
| Contact de fixation | 100% de contact des ressorts sur grille 100 mil | 40% de contact à cause des vias hors grille et recouverts |
| Programmation firmware | Connecteur SWD, automatisé avec pyocd | Câble USB manuel, dépendant de l'opérateur |
| Vérification des rails d'alimentation | Point de test sur chaque rail, sonde DMM | Pas de points de test, déduit uniquement de l'UART |
| Test de communication UART | Connecteur avec TX/RX/GND, phase de 3 secondes | Nécessite une modification de carte ou le sondage d'un pad CMS |
| Temps de cycle | 45 secondes automatisé, zéro intervention opérateur | 4 minutes avec deux interventions opérateur |
| Taux d'échappement | Faible (couverture complète) | Élevé (couverture partielle, étapes manuelles) |
Checklist DFT
| Catégorie | Vérification | Critère de réussite |
|---|---|---|
| Points de test | Tous les rails d'alimentation ont des points de test | Un TP par rail, côté dessus |
| Points de test | Tous les domaines de masse ont un TP de référence de masse | À moins de 25 mm des points de mesure critiques |
| Points de test | Les E/S numériques clés sont testables | UART, SPI, I2C, GPIO ont des points de test |
| Points de test | Tous les TP font 0,9 mm minimum de diamètre | Vérifié dans le DRC |
| Points de test | Tous les TP sur grille 100 mil | Vérifier dans le routage avec l'accrochage à la grille |
| Points de test | Aucun TP sous les connecteurs, dissipateurs ou blindages | Vérification manuelle |
| Vias | Pas de vias recouverts de vernis épargne sur les nets critiques | Revue avec le rapport DFM du fabricant |
| JTAG | Chaîne de scan connectée de bout en bout | TDO_n vers TDI_(n+1) |
| JTAG | TRST tiré au niveau haut à la mise sous tension | Résistance de 10k vers VCC |
| JTAG | Empreinte du connecteur JTAG présente | Peuplé sur EVT |
| Programmation | Connecteur SWD ou JTAG accessible côté dessus | Vérifié avec le dégagement de la fixation |
| Programmation | Broches de mode BOOT accessibles comme points de test | BOOT0 ou équivalent exposé |
| Debug | UART ou SWO accessible via connecteur ou TP | Débit en bauds documenté |
| Mécanique | Dégagement du bord de carte >= 3 mm pour tous les TP | DRC propre |
| Mécanique | Dégagement des composants >= 0,5 mm autour des TP | Course du contact à ressort vérifiée |