USB Sensor Node PCB


Implemented the schematic for the USB-C powered Wi‑Fi/BLE temperature/humidity node. It uses a SiWG917 Wi‑Fi/BLE 5.4 module, SHT41 T/RH sensor, USB-C sink input, TPS25940 true reverse-blocking eFuse with OVP/UVLO/OCP/soft-start, MP28301 3.3 V buck regulator, ESD protection, reset/ISP/SWD debug, I2C pull-ups, and status LED.
Created project files:
Open items:
  • PCB layout/routing is not done yet, so airwire DRC errors are expected.
  • Generic passives still need final manufacturer MPNs before manufacturing export.
  • Layout must enforce the SiWG917 antenna keepout and thermal isolation around the SHT41.
Suggested next steps:
  1. Set board size/stackup and move into PCB placement.
  2. Place U1 at the board edge with antenna keepout and U4 away from heat sources.
  3. Route power, buck, I2C, SWD/UART, and USB-C protection paths.
  4. Assign final passive MPNs and run full DRC/manufacturing checks.
I can’t run analysis or auto-layout right now because the account has no available ACUs, so AI execution features are unavailable.
Current project state:
  • Schematic has been built for the USB-C WiFi/BLE temperature/humidity sensor node.
  • Key blocks are present: USB-C input, ESD protection, TPS25940 eFuse/protection, MP28301 3.3 V buck regulator, SiWG917 Wi‑Fi/BLE module, SHT41 sensor, debug/reset/ISP controls, and status LED.
  • Supporting project files were created: specification, firmware starter, bring-up plan, and regulatory/TCF notes.
What remains:
  • Inspect current PCB layout state to confirm whether placement, routing, or both are needed.
  • Run component placement with constraints: SiWG917 antenna at board edge, SHT41 away from heat sources, USB-C at edge, buck loop compact.
  • Route traces and resolve airwires.
  • Run DRC/ERC after layout and fix remaining issues.
  • Assign final MPNs to generic passives before manufacturing export.
Inspect layout state
Run ERC/DRC
Review BOM MPNs
Document constraints

D1
J1
U1
U2
Firmware Starter — SiWG917 USB-C WiFi/BLE T/RH Sensor
Platform & Toolchain
  • MCU module: U1 — SIWG917Y111MGABAR, Silicon Labs SiWG917 Wi-Fi 6 + BLE 5.4 module
  • Recommended SDK: Silicon Labs WiSeConnect SDK / Simplicity Studio for SiWx917
  • Programming/debug: J2 SWD plus UART ISP pins; SW2 pulls SWO_ISP low for ISP entry
  • Sensor: U4 — SHT41-AD1B-R2 at I2C address 0x44
Pin Mapping

Table


FunctionSchematic Pin / NetConnected ToDirectionNotes
I2C SDAU1:ULP_GPIO_0 / I2C_SDAU4 SDA, R9 10 kΩ pull-upBidirectionalSHT41 address 0x44
I2C SCLU1:ULP_GPIO_1 / I2C_SCLU4 SCL, R10 10 kΩ pull-upOutputShort on-board bus
Status LEDU1:ULP_GPIO_8 / STATUS_LEDR11 1 kΩ → LED1 → GNDOutputDrive high to turn on
eFuse faultU1:UULP_VBAT_GPIO_3 / EFUSE_FLT_NU2 FLT, R7 pull-upInputActive-low fault
Power-goodU1:UULP_VBAT_GPIO_2 / PWR_PGOODU3 PG1, R8 pull-upInputActive-high/open-drain good via pull-up
SWDIOU1:JTAG_TMS_SWDIO / SWDIOJ2 pin 2DebugSWD data
SWCLKU1:JTAG_TCK_SWCLK / SWCLKJ2 pin 4DebugSWD clock
UART RX MCUU1:GPIO_8 / UART_RX_MCUJ2 pin 7InputISP UART RX
UART TX MCUU1:GPIO_9 / UART_TX_MCUJ2 pin 8OutputISP UART TX
ResetU1:POC_IN, RESET_NSW1, J2 pin 10Input/resetPOC_IN reset button, RESET_N monitor/debug
Example Project Configuration
Use a SiWx917 WiSeConnect SDK example project as the base, then add the SHT41 driver below. In Simplicity Studio, create a SiWx917 SoC Wi-Fi station example, enable I2C/ULP I2C, and map the board pin macros to the schematic nets.

C


// app_pinmap.h — map these to the SDK GPIO/port macros for your selected SiWx917 board support package. #pragma once #define PIN_I2C_SDA_NET "ULP_GPIO_0" // schematic net I2C_SDA #define PIN_I2C_SCL_NET "ULP_GPIO_1" // schematic net I2C_SCL #define PIN_STATUS_LED_NET "ULP_GPIO_8" // schematic net STATUS_LED #define PIN_EFUSE_FLT_N_NET "UULP_VBAT_GPIO_3" #define PIN_PWR_PGOOD_NET "UULP_VBAT_GPIO_2" #define SHT41_I2C_ADDR 0x44u #define SENSOR_INTERVAL_MS 5000u
Complete Firmware Source

C


#include <stdint.h> #include <stdbool.h> #include <stdio.h> #include <string.h> #include "sl_status.h" #include "sl_sleeptimer.h" #include "sl_wifi.h" #include "sl_net.h" #include "app_pinmap.h" // Replace these three low-level functions with the SiWx917 SDK I2C/GPIO calls selected in the project configurator. extern sl_status_t board_i2c_write(uint8_t addr, const uint8_t *data, uint16_t len); extern sl_status_t board_i2c_read(uint8_t addr, uint8_t *data, uint16_t len); extern void board_gpio_write_status_led(bool on); extern bool board_gpio_read_efuse_fault_n(void); extern bool board_gpio_read_pwr_pgood(void); extern void board_platform_init(void); extern uint32_t board_millis(void); static uint8_t sht4x_crc8(const uint8_t *data, uint8_t len) { uint8_t crc = 0xFF; for (uint8_t i = 0; i < len; i++) { crc ^= data[i]; for (uint8_t bit = 0; bit < 8; bit++) { crc = (crc & 0x80) ? (uint8_t)((crc << 1) ^ 0x31) : (uint8_t)(crc << 1); } } return crc; } static sl_status_t sht41_read(float *temp_c, float *rh_pct) { const uint8_t cmd = 0xFD; // high precision T/RH measurement uint8_t rx[6] = {0}; sl_status_t st = board_i2c_write(SHT41_I2C_ADDR, &cmd, 1); if (st != SL_STATUS_OK) return st; sl_sleeptimer_delay_millisecond(10); st = board_i2c_read(SHT41_I2C_ADDR, rx, sizeof(rx)); if (st != SL_STATUS_OK) return st; if (sht4x_crc8(&rx[0], 2) != rx[2] || sht4x_crc8(&rx[3], 2) != rx[5]) { return SL_STATUS_FAIL; } uint16_t t_ticks = ((uint16_t)rx[0] << 8) | rx[1]; uint16_t rh_ticks = ((uint16_t)rx[3] << 8) | rx[4]; *temp_c = -45.0f + 175.0f * ((float)t_ticks / 65535.0f); *rh_pct = -6.0f + 125.0f * ((float)rh_ticks / 65535.0f); if (*rh_pct > 100.0f) *rh_pct = 100.0f; if (*rh_pct < 0.0f) *rh_pct = 0.0f; return SL_STATUS_OK; } static void wifi_start_station(void) { // Start from a Silicon Labs SiWx917 Wi-Fi station example and fill credentials in the SDK config. // Keep this call non-fatal: the sensor node should still report over UART/debug if Wi-Fi is unavailable. sl_wifi_init(NULL, NULL, NULL); } void app_init(void) { board_platform_init(); board_gpio_write_status_led(false); wifi_start_station(); printf("SiWG917 T/RH sensor node starting\n"); } void app_process_action(void) { static uint32_t last_ms = 0; uint32_t now = board_millis(); if ((now - last_ms) < SENSOR_INTERVAL_MS) return; last_ms = now; bool power_good = board_gpio_read_pwr_pgood(); bool efuse_ok = board_gpio_read_efuse_fault_n(); if (!power_good || !efuse_ok) { printf("Power warning: PGOOD=%u EFUSE_FLT_N=%u\n", power_good, efuse_ok); } float temp_c = 0.0f, rh = 0.0f; sl_status_t st = sht41_read(&temp_c, &rh); if (st == SL_STATUS_OK) { board_gpio_write_status_led(true); printf("T=%.2f C RH=%.2f %%\n", temp_c, rh); // TODO: publish over Wi-Fi HTTP/MQTT or expose over BLE GATT characteristic. board_gpio_write_status_led(false); } else { printf("SHT41 read failed: 0x%08lx\n", (unsigned long)st); } }
Build & Flash Instructions
  1. Create/import a Silicon Labs SiWx917 SoC Wi-Fi station example in Simplicity Studio.
  2. Add the source above as app.c and implement the board-specific I2C/GPIO wrappers using the SDK configurator.
  3. Build with Simplicity Studio or slc generate && make if using the command-line Silicon Labs flow.
  4. Flash using SWD on J2: pin 1 = 3V3, pin 2 = SWDIO, pin 3/5/9 = GND, pin 4 = SWCLK, pin 10 = RESET_N.
  5. To enter UART ISP mode, hold SW2 during reset and use J2 pin 7/8 for MCU UART RX/TX.
  • Platform & Toolchain

  • Pin Mapping

  • Example Project Configuration

  • Complete Firmware Source

  • Build & Flash Instructions