STEP 1411 — Tang Nano 9K BME280 Phase 2 code-only prep

2026-08-26 · STEP 1410 Phase 1 の 続編 · BME280 hardware 到着前 に code-complete + Gowin build verify · SRAM Program は FTDI cable driver state で defer

目的

藤本さん directive 「(P2-prep) 推奨」 選択で 実行。 STEP 1410 Phase 1 の I2C master stub を 完全実装 + BME280 read sequence + PC 側 Bosch datasheet 補正演算 を **BME280 hardware 未購入 の 状態** で code-complete で 用意。 BME280 到着後 は 別 STEP で 30 秒 で 実測 差替 が 可能な 状態。

実装

Files (7、 hardware/phase-c/09-tang-nano-9k-bme280-phase2-prep/)

FileLinesPurpose
i2c_master.v~330単一 master I2C 状態機 (START/WRITE/READ/STOP/RESTART/ACK/NACK/timeout)
bme280_reader.v~330BME280 read シーケンス state machine (chip_id → ctrl_hum/meas → wait 50ms → calib TP 26B → calib H 7B → raw 8B)
bme280_top.v~300Top: I2C + reader + UART packet emitter 統合、 open-drain 疑似 wiring、 double-buffer snapshot
uart_tx.v~75Phase 1 STEP 1410 copy (差分なし)
tang_nano_9k.cst~30Pins: clk 52, LED1-4 10/11/13/14, uart_tx 17, i2c_scl 33, i2c_sda 34
build.tcl~25Gowin V1.9.12.02_SP2 TCL build
pc_bme280_reader.py~230pyserial recv + Bosch 補正演算 (T/H/P 全 datasheet 式) + human-readable print

UART packet format

# BME280 検出時 (~109 chars/sec):
BME:C=60,E=0000,TP=<52 hex>,H=<14 hex>,R=<16 hex>\r\n

# BME280 未検出時 (~24 chars/sec):
BME:C=00,E=<4 hex>,NO_ACK\r\n

# 意味:
# C   = chip_id (0x60 期待、 0x00 なら chip_id read 失敗)
# E   = error_count (16-bit NACK/timeout 累計)
# TP  = 26 バイト calib_tp (0x88-0xA1、 温度 + 圧力 補正係数)
# H   = 7 バイト calib_h (0xE1-0xE7、 湿度 補正係数)
# R   = 8 バイト raw (0xF7-0xFE、 生 ADC 値 T+P+H)

Verify 結果 (2026-08-26 実測)

Build (Gowin V1.9.12.02_SP2) PASS
SRAM Program (Tang Nano 9K 書込) — 藤本さん USB 抜き挿し 後 PASS
PC recv (BME280 未 wired NO_ACK verify) PASS
NO_ACK 状態 の err_count が 0x0000 の 理由 (honest 観察)

BME280 wiring (Phase 2 実行時)

Tang Nano 9K       BME280 module (Akizuki 109421)
─────────────      ─────────────────────────────
pin 33 (SCL) ────► SCL (with 10 kΩ pull-up to 3.3V)
pin 34 (SDA) ◄──► SDA (with 10 kΩ pull-up to 3.3V)
3.3V         ────► VDD
GND          ────► GND
                   SDO → GND  (I2C address = 0x76)
                   CSB → 3.3V (I2C mode enable)

LED 表示

LEDPin意味 (active-LOW = 0 で 点灯)
LED110~1.6 Hz heartbeat (board 生きている 証拠)
LED211UART TX busy (1 秒毎 短パルス)
LED313BME280 chip_ok (点灯 = 検出済、 消灯 = 未検出)
LED414error_count[0] トグル (NACK 増加毎 に 反転)

Honest scope (8 条)

本 STEP 1411 の 限界

次段候補 (defer、 藤本さん judgment 待ち)

  1. SRAM Program 再試行 = USB re-plug 後 programmer_cli.exe --operation_index 2 実行、 NO_ACK packet 出力 確認 (BME280 なし 想定 verify)
  2. BME280 発注 = 秋月 通販コード 109421 (¥1,180) + jumper 4 本 + 10 kΩ 抵抗 2 本 (~¥2,000 目安)
  3. Phase 2 実測差替 = BME280 到着 → 物理配線 → SRAM Program → pc_bme280_reader.py で 実測 T/H/P 表示、 STEP 1407 mock 値 と 比較 (別 STEP 1412+)
  4. Phase 3 = benchtop-mcp v0.9-alpha に real hardware 統合 (serialbridge subprocess で pc_bme280_reader.py invoke、 bme280-env-a1 mock → real 差替、 hardware_available:True flag)

関連