コラボレーション
アート
美容とウェルネス
工芸
文化と歴史
エンターテインメント
環境
食品と飲料
リバースエンジニアリング
科学
スポーツ
テクノロジー
ウェアラブル
ブリングアップ:自分のチップの最初の1時間、ESP32によるテスト
English
Youblob (drawn from the sketch's pin map) · CC0
Ed

作成者

Ed

29. 9月 2026FI
43
0
0
0
0

ブリングアップ:自分のチップの最初の1時間、ESP32によるテスト

ブリングアップとは、エンジニアが新しいシリコンに初めて電源を入れる作業を指し、その手順は個々のテストのどれよりも重要です。電源を入れる前に確認し、クロックを入れる前に電源を入れ、何よりもまず電流を制限してください。電流制限があれば1秒で防げた短絡によって、唯一のチップが破壊されることがあるからです。 この段階では、前の段階のPWM調光器のブリングアップ計画を、2段階目のブレイクアウトボード上で行います。ESP32が実験室の作業を代行します。チップのクロックを生成し、リセットを保持し、8つのパッドのデューティを設定し、戻ってくるPWMのタイミングを計測した後、各デューティごとにPASSまたはFAILを出力します。ノートは、失敗を配線が誤っているパッドの名前に変換します。 正直に述べると、まだチップはありません。スケッチはこの設計図向けにコンパイルされており、期待される数値は前の段階のシミュレーションから得られたものです。最初の実機での実行はあなた自身が行うことになります。
上級者
チップが届いた後の午後

手順

1

期待される数値と、失敗の読み方

Jupyter ノートブックを読み込み中…
2

起動しようとしているチップ

組み込みのブループリントはすべての入力にプルダウンを設けるため、接続されていないチップは無効な状態で待機します。このプランがテストするのはその中核部分です。
3

電源投入前

何も接続していない状態で、ルーペを使ってブレイクアウト上に実装されたチップオンボードを確認します。正方形に正しく載っているか、はんだブリッジがないか、部品が浮いていないかを見てください。次に、テスターでブレイクアウトのVDD IOパッドとGND IOパッドの間の抵抗を、両方の極性で測定し、両方の値を書き留めてください。ゼロに近い値であればショートしているので、その時点で作業を止めてください。run-1のパッド表には、どのブレイクアウトパッドがVDD IOとGND IOであるかが記載されています。wafer.spaceはピン配置が実行ごとに変わることがあると述べているので、必ずご自身の実行時の表を使用してください。 同じ方法で、データパッドが隣接するパッドやグラウンドとショートしていないことを確認してください。

このステップの材料:

カスタム ASIC ダイカスタム ASIC ダイ1 個
プリント基板プリント基板1 個

必要な工具:

マルチメーターマルチメーター
4

電流制限を低く設定した状態での電源

ベンチ電源は、接続する前にチップの電源電圧に設定してください。その電圧は、チップの作成時に使用したライブラリによって異なります。テンプレートのデフォルトライブラリは5Vですが、3.3Vライブラリでビルドすることもできます。正確な値は実行時のドキュメントから確認してください。run-1のパッドテーブルには電源パッドの名前は記載されていますが、その電圧は記載されていません。 電源が電流を供給できる最小の設定に電流制限を設定し、VDD IOとGND IOを接続します。ESP32はまだ切断した状態で電源を入れてください。クロックがなく、すべての入力がプルダウンされている状態で、チップは静止しているはずです。電流値を書き留めてください。電源がすぐに電流制限に入る場合は、電源を切ってください。何かがショートしています。 その後、リセット中でクロックが動作している状態と、パターンを再生している状態で、さらに2回電流を記録してください。この3つの数値がチップ固有のシグネチャです。後になって、今日よりも大幅に多くの電流を消費する基板があれば、故障があることになります。

必要な工具:

直流安定化電源直流安定化電源
マルチメーターマルチメーター
5

ESP32 を配線する

配線は12本です。図面とスケッチのヘッダーにあるとおりです:GPIO 27 をクロックパッドへ、26 を rst_n へ、32 を入力 0(enable)へ、13、14、18、19、21、22、23、25 を双方向パッド 0 から 7 へ、そして双方向パッド 8 を GPIO 34 に戻し、さらに共通のグランドを接続します。GPIO 34 は ESP32 の入力専用ピンなので、チップの出力と衝突することはありません。 ESP32 は 3.3 V の部品で、その入力は 5 V 耐圧ではありません。チップの I/O が 3.3 V でない場合は、12 本すべての信号線にレベルコンバーターを入れてください。4 チャンネルの基板を 3 枚使います。一般的なものは両側にプルアップ抵抗があり、ESP32 がピンを駆動するまで、チップの弱いプルダウンを上書きする可能性があります。スケッチは起動直後から、クロックが動く前にリセットとイネーブルを Low に保持します。

このステップの材料:

ロジックレベル変換器ロジックレベル変換器3 個
ジャンパワイヤジャンパワイヤ1 個

必要な工具:

ブレッドボードブレッドボード
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() {}

必要な工具:

ESP32 開発ボードESP32 開発ボード
デスクトップパソコンデスクトップパソコン
7

良いチップの出力内容

115200ボーでシリアルモニターを開きます。正常に動作しているチップは、1行ごとにデューティ、期待されるHigh時間とマイクロ秒単位で測定したHigh時間、そして結果を出力します: # チップクロック 100000 Hz、PWM 周期 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) その後、オシロスコープでパッド8も確認してください。このクロックでは1周期は2,560マイクロ秒で、エッジがきれいであるはずです。スケッチは時間を測定し、オシロスコープは波形の形状を示します。レベル変換器を通した遅いエッジやリンギングは、オシロスコープでのみ確認できます。

必要な工具:

デジタルオシロスコープデジタルオシロスコープ
8

立ち上がらないチップ

立ち上げ時のトラブルシューティング。

Flow

Loading...
9

出典と正直な限界

**出典**(2026年9月29日閲覧):wafer-space/chip-on-board-wire-bonded-pcbs、run-1/README.md(VDD IOパッドとGND IOパッドを挙げるパッド表、およびピン配置は実行ごとに変わるという注記);wafer-space/gf180mcu-project-template、README.mdおよびMakefile(5 Vの既定値と3.3 Vのライブラリオプション);期待されるハイ時間については前段階の回路のシミュレーション。 **正直な限界。** まだチップは存在しません。この計画とそのスケッチはシリコン上で動作確認されていません。電源電圧と電流はここには記載していません。執筆時点で入手可能な実行ドキュメントにそれらが記載されていないためです。レベル変換器がプルダウンに与える影響は、使用するボードによって異なります。

材料

4

必要な工具

6

CC0 パブリックドメイン

このブループリントはCC0で公開されています。許可を求めずに、自由にコピー、修正、配布、あらゆる目的で使用できます。

メイカーを応援するには、ブループリント経由で製品を購入してください。メイカーには メイカーコミッション がベンダーにより設定されています。または、このブループリントの新しいイテレーションを作成し、自分のブループリントにコネクションとして含めて収益を共有できます。

ディスカッション

(0)

ログイン してディスカッションに参加

コメントを読み込み中...