Collaborazione
ARTE
BELLEZZA E BENESSERE
MESTIERE
CULTURA E STORIA
DIVERTIMENTO
AMBIENTE
CIBO E BEVANDE
INGEGNERIA INVERSA
SCIENZE
SPORT
TECNOLOGIA
INDOSSABILI
Bring-Up: la prima ora con il tuo chip, testato da un ESP32
English
Youblob (drawn from the sketch's pin map) · CC0
Ed

Creato da

Ed

29. settembre 2026FI
43
0
0
0
0

Bring-Up: la prima ora con il tuo chip, testato da un ESP32

Il bring-up è ciò che gli ingegneri chiamano la prima accensione di un nuovo silicio, e l'ordine in cui si fa conta più di qualsiasi singolo test. Controlla prima di alimentare, alimenta prima di dare il clock, e limita la corrente prima di fare qualsiasi altra cosa, perché un corto circuito che un limite di corrente avrebbe bloccato in un secondo può distruggere gli unici chip che hai. Questo gradino è il piano di bring-up per il PWM dimmer dei gradini precedenti, sulla breakout board del gradino 2. Un ESP32 svolge il lavoro di un laboratorio: genera il clock del chip, mantiene il suo reset, imposta il duty su otto pad e misura il PWM che ritorna, poi stampa PASS o FAIL per ogni duty. Un taccuino trasforma un guasto nel nome del pad il cui collegamento è sbagliato. Detto onestamente: per ora non c'è alcun chip. Lo sketch è stato compilato per questo progetto e i valori attesi provengono dalle simulazioni dei gradini precedenti; la prima vera esecuzione spetta a te.
Avanzato
Un pomeriggio, una volta arrivato il chip

Istruzioni

1

I numeri da aspettarsi e come interpretare un errore

Caricamento del notebook Jupyter…
2

Il chip che stai avviando

Il blueprint integrato applica dei pull-down su ogni ingresso, quindi un chip non collegato resta disabilitato. È questo il nucleo che questo piano mette alla prova.
3

Prima di alimentare

Senza nulla collegato, osserva con la lente d'ingrandimento il chip-on-board montato sul breakout: posizionato in modo squadrato, senza ponti di saldatura, nulla di allentato. Poi misura con il multimetro la resistenza tra un pad IO VDD e un pad IO GND del breakout, in entrambe le polarità, e annota entrambi i valori. Una lettura vicina allo zero indica un cortocircuito: fermati lì. La tabella dei pad della run 1 indica quali pad del breakout sono IO VDD e IO GND; usa la tabella della tua run, perché wafer.space afferma che i pinout cambiano tra una run e l'altra. Verifica nello stesso modo che nessun pad dati sia in cortocircuito con il suo vicino o con la massa.

Materiali per questo passaggio:

Chip ASIC personalizzatoChip ASIC personalizzato1 pezzo
Circuito stampatoCircuito stampato1 pezzo

Strumenti necessari:

MultimetroMultimetro
4

Alimentazione, con il limite di corrente basso

Imposta l'alimentatore da laboratorio sulla tensione di alimentazione del tuo chip prima di collegarlo. Tale tensione dipende dalle librerie con cui il chip è stato realizzato: le librerie predefinite del template sono da 5 V e il template può anche essere compilato con librerie da 3,3 V. Ricava il valore esatto dalla documentazione della tua esecuzione; la tabella dei pad della run-1 indica i pad di alimentazione ma non la loro tensione. Imposta il limite di corrente sull'impostazione più bassa che permette all'alimentatore di regolare la tensione, collega VDD IO e GND IO, e accendi con ESP32 ancora scollegato. Senza clock e con tutti gli ingressi tirati verso il basso, il chip dovrebbe restare fermo. Annota la corrente. Se l'alimentatore entra subito in limitazione di corrente, spegni: c'è un cortocircuito.

Strumenti necessari:

Alimentatore da bancoAlimentatore da banco
MultimetroMultimetro
5

Collega il ESP32

Dodici fili, come nell'immagine e nell'intestazione dello schema: GPIO 27 al pad del clock, 26 a rst_n, 32 all'ingresso 0 (enable), 13, 14, 18, 19, 21, 22, 23 e 25 ai pad bidirezionali da 0 a 7, e il pad bidirezionale 8 torna a GPIO 34, più una massa comune. GPIO 34 è un pin solo in ingresso del ESP32, quindi non può mai entrare in conflitto con l'uscita del chip. Il ESP32 è un componente da 3,3 V e i suoi ingressi non sono tolleranti a 5 V. Se l'I/O del chip non è a 3,3 V, inserire convertitori di livello in tutte e dodici le linee: tre schede a quattro canali. Il tipo comune ha resistenze di pull-up su entrambi i lati, che possono sovrascrivere i deboli pull-down del chip finché il ESP32 non pilota i suoi pin; lo schema mantiene reset ed enable bassi non appena parte, prima che il clock sia attivo.

Materiali per questo passaggio:

Traslatore di livelli logiciTraslatore di livelli logici3 pezzi
Cavetti ponticelloCavetti ponticello1 pezzo

Strumenti necessari:

BreadboardBreadboard
6

The test sketch

bringup.ino. It starts the chip's clock with the ESP32's LED PWM peripheral at 100 kHz, with 1-bit resolution for a plain square wave; holds reset low for 1,000 chip clocks; checks that the output stays low while enable is off; then sets seven duty values and measures the high time with pulseIn, averaged over eight periods, against 10 microseconds per step, within 3 microseconds. It compiles for the ESP32 with the Arduino ESP32 core 3.3.12; it has not been run, because the chip does not exist yet.
bringup.inocpp
// SPDX-License-Identifier: Apache-2.0
// First-light test for the PWM dimmer chip (Youblob silicon rungs 3 and 6), run from an ESP32.
// The ESP32 is the whole lab: it makes the chip's clock, holds its reset, sets the duty on eight
// pads, and times the PWM that comes back, then prints PASS or FAIL for each duty value.
//
// Wiring, through a logic level converter if your chip's I/O is not 3.3 V (see the blueprint):
//   CLK      GPIO 27  -> clk pad         RST_N  GPIO 26 -> rst_n pad   (both clear of the boot strapping pins)
//   EN       GPIO 32  -> input[0]        D0..D7 GPIO 13,14,18,19,21,22,23,25 -> bidir[0..7]
//   PWM_IN   GPIO 34  <- bidir[8]        (GPIO 34 is input-only on the ESP32: it cannot fight the chip)
//   and a common ground.

const int PIN_CLK = 27, PIN_RST = 26, PIN_EN = 32, PIN_PWM = 34;
const int DATA_PINS[8] = {13, 14, 18, 19, 21, 22, 23, 25};

// 100 kHz: slow enough for a level converter's pull-up edges, and one chip clock is 10 us,
// so pulseIn's 1 us resolution sees a tenth of a clock.
const uint32_t CHIP_CLK_HZ = 100000;
const float US_PER_CLK = 1e6f / CHIP_CLK_HZ;
const float PERIOD_US = 256 * US_PER_CLK;          // one PWM period: 256 chip clocks = 2560 us
const float TOL_US = 3.0f;                         // allowed error, about a third of a clock

void setDuty(uint8_t d) {
  for (int b = 0; b < 8; b++) digitalWrite(DATA_PINS[b], (d >> b) & 1);
}

// Average high time over n periods; returns -1 if the pin never went high (pulseIn timed out).
float meanHighUs(int n) {
  float sum = 0;
  for (int i = 0; i < n; i++) {
    unsigned long t = pulseIn(PIN_PWM, HIGH, 3 * (unsigned long)PERIOD_US);
    if (t == 0) return -1;
    sum += t;
  }
  return sum / n;
}

bool alwaysLow(unsigned long ms) {
  unsigned long t0 = millis();
  while (millis() - t0 < ms)
    if (digitalRead(PIN_PWM)) return false;
  return true;
}

void setup() {
  Serial.begin(115200);
  delay(500);
  for (int b = 0; b < 8; b++) pinMode(DATA_PINS[b], OUTPUT);
  pinMode(PIN_RST, OUTPUT);
  pinMode(PIN_EN, OUTPUT);
  pinMode(PIN_PWM, INPUT);

  // Reset low BEFORE the clock starts, then give the chip some clocks in reset.
  digitalWrite(PIN_RST, LOW);
  digitalWrite(PIN_EN, LOW);
  setDuty(0);
  if (!ledcAttach(PIN_CLK, CHIP_CLK_HZ, 1)) {      // 1-bit resolution: a plain square wave
    Serial.println("FAIL: could not start the clock on GPIO 27");
    return;
  }
  ledcWrite(PIN_CLK, 1);                           // 1 of 2 steps high = 50 % duty
  delay(10);                                       // 1,000 chip clocks in reset
  digitalWrite(PIN_RST, HIGH);

  Serial.printf("# chip clock %lu Hz, PWM period %.0f us\n", (unsigned long)CHIP_CLK_HZ, PERIOD_US);
  Serial.println("duty,expected_us,measured_us,result");
  int fails = 0;

  // Disabled: the output must stay low whatever the duty.
  setDuty(200);
  bool low = alwaysLow(20);
  Serial.printf("disabled,0,%s,%s\n", low ? "0" : "high seen", low ? "PASS" : "FAIL");
  fails += !low;

  digitalWrite(PIN_EN, HIGH);
  const uint8_t duties[] = {0, 1, 16, 64, 128, 200, 254};
  for (uint8_t d : duties) {
    setDuty(d);
    delay(10);                                     // let a few periods pass with the new value
    float expected = d * US_PER_CLK;
    float got;
    bool ok;
    if (d == 0) {
      ok = alwaysLow(20);
      got = ok ? 0 : meanHighUs(8);                // a pad stuck high shows up here as a duty above 0
    } else {
      got = meanHighUs(8);
      ok = got >= 0 && fabsf(got - expected) <= TOL_US;
    }
    Serial.printf("%u,%.1f,%.1f,%s\n", d, expected, got, ok ? "PASS" : "FAIL");
    fails += !ok;
  }
  Serial.printf("# %d failure(s)\n", fails);
}

void loop() {}

Strumenti necessari:

Scheda di sviluppo ESP32Scheda di sviluppo ESP32
Computer da tavoloComputer da tavolo
7

Come stampa un chip funzionante

Apri il monitor seriale a 115200 baud. Un chip che funziona stampa, per ogni riga, il duty, il tempo di stato alto atteso e misurato in microsecondi, e il risultato: # clock del chip 100000 Hz, PWM periodo 2560 us duty,expected_us,measured_us,result disabled,0,0,PASS 0,0.0,0.0,PASS 1,10.0,10.0,PASS ... 254,2540.0,2540.0,PASS # 0 failure(s) Poi osserva anche il pad 8 con l'oscilloscopio: un periodo dovrebbe essere di 2.560 microsecondi a questo clock, con fronti puliti. Lo sketch misura il tempo; l'oscilloscopio mostra la forma, e un fronte lento o oscillante attraverso un convertitore di livello è visibile solo lì.

Strumenti necessari:

Oscilloscopio digitaleOscilloscopio digitale
8

Un chip che non si avvia

Risoluzione dei problemi di bring-up.

Flow

Loading...
9

Fonti e limiti onesti

**Fonti**, consultate il 29 settembre 2026: wafer-space/chip-on-board-wire-bonded-pcbs, run-1/README.md (la tabella dei pad che indica i pad IO VDD e IO GND, e la nota secondo cui i pinout cambiano tra una run e l'altra); wafer-space/gf180mcu-project-template, README.md e Makefile (le opzioni predefinite di 5 V e le librerie a 3,3 V); le simulazioni dei gradini precedenti per i tempi alti attesi. **Limiti onesti.** Non esiste ancora alcun chip: questo piano e il suo schizzo non sono stati eseguiti su silicio. La tensione e la corrente di alimentazione non sono indicate qui perché la documentazione della run disponibile al momento della stesura non le specifica. L'effetto del convertitore di livello sui pull-down dipende dalla scheda che si utilizza.

Materiali

4

Strumenti richiesti

6

CC0 Pubblico dominio

Questo progetto è rilasciato sotto CC0. Sei libero di copiare, modificare, distribuire e utilizzare quest'opera per qualsiasi scopo, senza chiedere permesso.

Supporta il Maker acquistando prodotti tramite il suo progetto dove guadagna una Commissione Maker stabilita dai venditori, oppure crea una nuova iterazione di questo progetto e includilo come collegamento nel tuo progetto per condividere i ricavi.

Commenti

(0)

Accedi per partecipare alla discussione

Caricamento commenti...