← AXS-013

Circuit review & bench-test guide

AXS-013 — APDS-9251 RGB+IR color-sensor PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axs-013-color prototype at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the generated schematic (generate_design.py, rev 0.1-schematic), the module README, and the APDS-9251-001 manufacturer datasheet.

The board is an unfabricated, schematic-only prototype: ERC is clean (0 errors / 0 warnings) and the netlist has been reviewed, but no PCB layout exists, no board has been built, and no bench measurement has ever been taken. Every numeric value in this guide is a verification target taken from the schematic or the datasheet — it is not a measured result and is not proof that an assembled board will work.

1. What the board does#

The board is a 12-pin PMOD (Type 6 extended, I2C) module carrying a Broadcom APDS-9251-001 four-channel digital color/ambient-light sensor. Four photodiode channels (red, green, blue, and IR) integrate simultaneously into up-to-20-bit results; the green channel doubles as the human-eye-response ALS channel. A programmable threshold/variance interrupt is brought out to PMOD pin 1 as COLOR_INT. The I2C address is fixed at 0x52 (there is no address pin on this part); two solder jumpers make the on-module 4.7 kΩ bus pull-ups removable for chained-module use. Color- balance and lux math are host firmware, not on-module functions.

Functional block diagram#

PMOD J1 (2x6, Type 6 ext.)
  6/12  3V3 ────────┬─────────┬──────────┬──────────┬──────────┐
                    │         │          │          │          │
               C1 100nF   C2 1uF     R1 4.7k    R2 4.7k    R3 10k
               (HF decouple + bulk)     │ SDA_PU    │ SCL_PU    │
  5/11  GND ────────┐                  JP1 ═╗      JP2 ═╗       │
                    │                  (cut to     (cut to      │
   3/9  SCL ────────┼──────────────────────┼───── unchain)      │
   4/10 SDA ────────┼──────────────────────┘          │         │
                    v                                 │         │
             ┌──────────────┐  SCL/SDA ───────────────┘         │
             │ APDS-9251-001│                     CLR_INT ──────┤
             │      U1      │  INT (open drain) ─────┤          │
             │ fixed 0x52   │                        │ R4 100R  │
             │ R+G+B+IR ADCs│                        └──> pin 1 │
             └──────────────┘                         COLOR_INT │

2. Safety and scope boundaries#

3. Power and control sequence#

  1. The PMOD host (or bench supply) applies 3.3 V to pins 6/12 and ground to pins 5/11. C1 (100 nF) provides high-frequency decoupling and C2 (1 µF) local bulk, matching the datasheet's 1 µF application circuit.
  2. At power-on the device runs an internal NVM read (I2C address and trim values), then enters Standby. Until the NVM address load completes, the device NACKs all I2C traffic — allow a short delay (internal settling is typically ~5 ms once activated) before the first probe.
  3. Standby is the default state: oscillator and ADCs off, I2C alive. Standby current is 1 µA typical / 2 µA maximum for U1 alone.
  4. R1/R2 (through JP1/JP2) hold SDA and SCL at 3.3 V; R3 holds the open-drain INT high.
  5. The host activates measurement by setting LS_EN (bit 1) in MAIN_CTRL (0x00): write 0x02 for ALS mode (IR + green channels) or 0x06 (CS_MODE + LS_EN) for RGB mode (all four channels). Active current is 130 µA typical (gain 3).
  6. Conversions repeat per LS_MEAS_RATE (0x04, default 0x22 = 18-bit resolution / 100 ms conversion, 100 ms repeat) at LS_GAIN (0x05, default 0x01 = gain 3). Fresh data is flagged by MAIN_STATUS (0x07) bit 3.
  7. Results sit in 3-byte, LSB-first registers 0x0A–0x15. Use block reads: during a block read in 0x07–0x18 the whole register range is locked so all bytes come from one conversion.
  8. If enabled via INT_CFG (0x19), the interrupt asserts (open drain, low) when the selected channel crosses the 0x21–0x26 thresholds or varies by the 0x27 setting; R3/R4 deliver it to PMOD pin 1.

4. Interfaces#

PMOD pin map (J1, Type 6 extended)#

PMOD pin123456789101112
NetCOLOR_INTNCSCLSDAGND3V3NCNCSCLSDAGND3V3

Pins 9/10 duplicate SCL/SDA for chaining a second I2C module.

Jumpers#

Ref.TypeFactory stateFunction
JP12-pad solder jumper, bridgedBridgedConnects R1 (4.7 kΩ) to SDA. Cut when another module in the chain provides the bus pull-ups.
JP22-pad solder jumper, bridgedBridgedConnects R2 (4.7 kΩ) to SCL. Cut together with JP1.

There is no address jumper: the APDS-9251-001 supports the single 7-bit address 0x52. Use bus chaining, not addressing, for multiple color modules on one host — which is exactly why JP1/JP2 exist.

Test points#

None are defined in the rev 0.1 schematic. Probe SCL/SDA/INT at the J1 pins and 3V3/GND at pins 6/5. Flag test points as a layout-review item.

5. Component-by-component review#

Every reference designator in the generated schematic is listed.

Ref.Part / valueFunction and why neededIf absent / openIf shorted, wrong, or misassembledKey datasheet parameters
J12x6 right-angle PMOD male header (Conn_02x06_Odd_Even)Host connection: power, ground, I2C, INT, chained-bus pinsNo power/communication; single open pin loses that functionReversed/offset insertion puts 3.3 V on signal pins; adjacent-pin bridges short SDA/SCL or powerPMOD Type 6 extended; 3.3 V rail defined by host
U1Broadcom APDS-9251-001, LGA-8 2×2 mmThe measurement device: R/G/B/IR photodiode matrix, per-channel ADCs, I2C, interruptBoard is inert; no ACK at 0x52Rotated part misconnects VDD/GND (pads 2/3) and can destroy it; solder or flux on the optical window skews all channels; LGA voids lift padsVDD 1.7–3.6 V (abs max 3.8 V); active 130 µA typ; standby 1 µA typ / 2 µA max; I2C 0x52, ≤400 kHz; 13–20-bit resolution; PART_ID reset value 0xB5
C1100 nF 16 V X7R 0603 (Murata GRM188R71C104KA01D)U1 VDD high-frequency decouplingSupply bounce during conversions; possible noisy counts or flaky I2CShorted C1 = 3V3–GND short, rail collapseLow-ESR ceramic close to the package per application note
C21 µF 10 V X7R 0603 (Murata GRM188R71A105KA61D)U1 VDD bulk decoupling; the datasheet application circuit's 1 µFLess local charge storage; marginal with long PMOD supply wiringShorted C2 = rail shortApplication circuit shows 1 µF at VDD
R14.7 kΩ 0603 (Yageo RC0603FR-074K7L)SDA bus pull-up (via JP1)With JP1 cut / R1 open and no external pull-up, SDA floats: no trafficShort 3V3→SDA jams the bus high; too-low value overloads driversSized for 400 kHz on a short bus; ~0.7 mA sink per line
R24.7 kΩ 0603 (Yageo RC0603FR-074K7L)SCL bus pull-up (via JP2)Clock floats; no transactionsAs R1As R1
R310 kΩ 0603 (Yageo RC0603FR-0710KL)Pull-up for U1's open-drain INT (net CLR_INT)INT floats; host sees noise/stuck levelShort to 3V3 masks interrupts permanentlyDatasheet suggests a typical 10 kΩ INT pull-up; VOL ≤ 0.4 V
R4100 Ω 0603 (Yageo RC0603FR-07100RL)Series protection between CLR_INT and PMOD pin 1Pin 1 disconnected: interrupt never reaches hostShorted = functional but unprotected; large wrong value only slows edgesLimits contention current if the host mis-drives pin 1
JP12-pad solder jumper, factory bridgedMakes the SDA pull-up removable for chained busesCut: relies on external pull-ups — correct only in a chainSloppy re-bridge can short SDA to adjacent copperSee section 4
JP22-pad solder jumper, factory bridgedMakes the SCL pull-up removableAs JP1, for SCLAs JP1See section 4
#FLG01PWR_FLAG on 3V3ERC-only artifact marking 3V3 as power-drivenNot a physical part; only ERC warningsNot applicable — never fitted, not in BOM/POS
#FLG02PWR_FLAG on GNDERC-only artifact for GNDAs #FLG01Not applicable

Note: APDS-9251-001 pads 1, 4, and 8 are no-connect substrate pads; the KiCad symbol hides them and nothing is wired to them by design.

6. Datasheet summary and design interpretation#

Primary reference: APDS-9251-001 datasheet (Broadcom APDS-9251-001-DS101, March 2019) — fetched directly from docs.broadcom.com; no mirror was needed. Passives: Yageo RC thick-film series, Murata GRM188 series via murata.com capacitor search.

Manufacturer fact (APDS-9251-001-DS101)Board-specific interpretation
VDD 1.7–3.6 V recommended, 3.8 V absolute maximum; VDD accuracy ±3%3.3 V is valid; verify the host rail ≤3.6 V including transients
Active 130 µA typ (gain 3); standby 1 µA typ / 2 µA maxBench sanity currents in section 7
Single fixed I2C address 0x52, standard + fast mode (≤400 kHz)No jumper variants exist; the ACK scan must show 0x52 only
Device NACKs everything until its NVM address load completes after PORRetry the first probe; don't fail a board on one early NACK
MAIN_CTRL (0x00): bit1 LS_EN, bit2 CS_MODE, bit4 SW Reset0x02 = ALS (IR+green); 0x06 = RGB (all four); 0x10 = software reset
LS_MEAS_RATE (0x04) default 0x22 = 18-bit / 100 ms; LS_GAIN (0x05) default 0x01 = gain 3First data available ~100 ms after enabling; full scale 262,143 counts at 18-bit
PART_ID (0x06) reset value 0xB5 (bits7:4 part ID = 0xB, bits3:0 revision)Accept 0xBx and record the revision nibble. Some third-party driver code checks for 0xB2; the datasheet revision fetched here documents 0xB5 — trust the upper nibble, log the lower
MAIN_STATUS (0x07) default 0x20: bit5 power-on flag (clears on read), bit3 new-data, bit4 interruptFirst status read after POR should show bit5 set — a useful implicit comms check
Data registers, 3 bytes LSB-first: IR 0x0A–0x0C, green 0x0D–0x0F, blue 0x10–0x12, red 0x13–0x15Block-read 12 bytes from 0x0A to get one coherent conversion of all four channels
Reads in 0x07–0x18 lock the register range until the read endsAlways use one block read, never per-byte reads split across conversions
Dark count ≤ 3; ADC count value ~1000 typ at 530 nm, 62 µW/cm², 50 ms, gain 3Covered-sensor and green-response targets in section 7
INT_CFG (0x19, default 0x10 = ALS/green channel selected), INT_PERSISTENCE (0x1A), thresholds 0x21–0x26, variance 0x27Threshold interrupt bring-up in section 9F

7. Expected values before bench testing#

All values are targets to verify, not measurements.

QuantityTarget / calculatedBasis
Bus idle level, SDA and SCL3.3 V through R1/R2Pull-ups via JP1/JP2
SDA→3V3 / SCL→3V3 resistance, unpowered, jumpers fitted≈ 4.7 kΩ eachR1 / R2
SDA/SCL→3V3 after cutting JP1/JP2Open (>1 MΩ) on the bus side; SDA_PU/SCL_PU pads still ≈4.7 kΩJumper cut isolates R1/R2
COLOR_INT (pin 1)→3V3 resistance≈ 10.1 kΩ (R4 + R3 in series)Pin1–R4–R3–3V3 path
Address-ACK scanACK at exactly 0x52; NACK everywhere else (no jumper variants exist on this part)Fixed-address device
Module supply current, standby≤ ~5 µA (U1 1 µA typ / 2 µA max)Standby spec
Module supply current, LS_EN active~130 µA typ, a few hundred µA worst caseActive-mode spec
PART_ID read (0x06)0xB5 per this datasheet revision; accept 0xBx, record revision nibblePART_ID definition
MAIN_STATUS (0x07), first read after PORBit5 (power-on) set, i.e. 0x20 pattern; bit clears on readMAIN_STATUS definition
First data latency after writing MAIN_CTRL~100 ms (default rate/resolution) before bit3 new-data setsLS_MEAS_RATE default 0x22
Covered sensor (opaque cap), all channels≤ 3 counts each; ratios meaningless at darkDark-count spec
White LED / daylight at default gain 3, 18-bitAll four channels well above dark and below 262,143; green typically the largest of R/G/B for white light (green is the ALS channel with peak 550 nm response)ALS characteristics, spectral response
Channel-ratio sanity, red LED illuminationRed channel ≫ blue channel; IR smallIrradiance response table (625 nm: red 80–120%, blue 0–3% of IR-channel-relative scale)
Channel-ratio sanity, IR source (remote control)IR channel rises sharply; R/G/B respond only weakly850 nm response: IR 80–120%, R/G/B 0–3%
Saturation checkA channel pegged at 262,143 (18-bit) means reduce gain (0x05) or resolution/integration (0x04)Full-scale count spec

8. Manual schematic and assembly review checklist#

9. Ordered bench-test procedure#

Assume a PMOD host (FPGA board) or a current-limited 3.3 V bench supply wired to J1 pins 6/12 (3V3) and 5/11 (GND), plus an I2C master on pins 3/4. Stop at the first abnormal result and record everything.

A. Unpowered inspection and resistance tests#

  1. Complete the section 8 checklist under magnification.
  2. Measure 3V3→GND resistance in both meter polarities; investigate anything under ~10 kΩ before power.
  3. Verify SDA→3V3 ≈ 4.7 kΩ, SCL→3V3 ≈ 4.7 kΩ, pin 1→3V3 ≈ 10.1 kΩ.

B. First power, no I2C traffic#

  1. Set the bench supply to 3.3 V with a ~50 mA current limit; power the module.
  2. Confirm supply current ≤ ~5 µA (standby) and SDA/SCL/pin 1 all idle at 3.3 V.

C. Address-ACK scan#

  1. Wait ≥10 ms after power-up (NVM load), then scan all 7-bit addresses.
  2. Expect an ACK only at 0x52. An early NACK at 0x52 immediately after power-up is retry-able (NVM load); a persistent NACK means U1 power, orientation, or bus wiring.

D. First-transaction bring-up (ID, status, enable)#

  1. Read PART_ID: START, 0x52+W, register 0x06, repeated START, 0x52+R, read one byte — expect 0xB5 (accept 0xBx; log the revision nibble).
  2. Read MAIN_STATUS (0x07) — expect the power-on bit (0x20) set on the first read and clear on the next.
  3. Enable RGB mode: write register 0x00 = 0x06 (CS_MODE | LS_EN). For ALS-only bring-up write 0x02 instead.
  4. Confirm supply current stepped up to the ~130 µA range.
  5. Poll MAIN_STATUS until bit 3 (new data) sets — expect within ~100–200 ms at defaults.

E. Channel reads and light-response checks#

  1. Block-read 12 bytes starting at register 0x0A: bytes assemble LSB-first into IR (0x0A–0x0C), green (0x0D–0x0F), blue (0x10–0x12), red (0x13–0x15); upper nibble of each third byte is zero at 18-bit.
  2. Under white light (room lighting or a white LED), expect all four channels well above the ≤3-count dark floor, with green typically the largest of R/G/B.
  3. Cover the sensor with an opaque cap: after the next conversion all channels should fall to ≤3 counts.
  4. Channel-ratio sanity: illuminate with a red source (red LED) — red channel dominates blue; then with an IR remote — IR channel spikes while R/G/B barely move. This catches channel-order bugs in firmware (the register order IR, green, blue, red is easy to get wrong).
  5. Optionally raise gain (0x05 = 0x04 for 18×) under dim light and confirm counts scale roughly ×6 from gain 3; watch for saturation at 262,143.

F. Threshold interrupt#

  1. With INT_CFG (0x19) default channel (ALS/green), write an upper threshold below the current green reading (registers 0x21–0x23, LSB-first) and enable: 0x19 = 0x14 (LS_INT_SEL=01, LS_INT_EN=1).
  2. Expect pin 1 (COLOR_INT) to fall below 0.4 V after the next conversion; MAIN_STATUS bit 4 sets and clears on read, releasing INT.
  3. Cover the sensor and set thresholds around dark values to verify the low-threshold direction too.

G. Pull-up chain configuration (JP1/JP2)#

  1. Power off. Cut JP1 and JP2; verify SDA→3V3 and SCL→3V3 now read open on this module alone.
  2. Operate the module behind a pull-up-fitted module (or external 4.7 kΩ pull-ups) and repeat steps C–E — behavior must be identical.
  3. Re-bridge with solder to restore standalone use; re-verify ≈4.7 kΩ.

10. Troubleshooting map#

SymptomFirst measurementsLikely areas
No ACK at 0x52 ever3V3 at U1, idle levels, JP1/JP2 continuityU1 unpowered/rotated, LGA joint opens, cut jumpers without external pull-ups
NACK only right after power-upRetry after 10 msNormal NVM-load behavior, not a fault
ACK at some other addressRe-scan, check masterAnother device on the chain; this part cannot move from 0x52
PART_ID reads 0x00 or 0xFFScope the transactionBus corruption, reading a reserved/locked address, U1 damaged
PART_ID reads 0xBx but not 0xB5Log itDifferent silicon revision — record, verify against the current datasheet revision, continue
All channels always 0MAIN_CTRL value, MAIN_STATUS bit3LS_EN never set, read before first conversion, aperture blocked
Channels frozen mid-read / mixed old-new dataRead methodPer-byte reads across conversions — switch to a single block read (0x07–0x18 locking)
Red/blue behavior swappedRatio tests in E4Firmware channel-order bug (order is IR, G, B, R — not R, G, B)
Counts pegged at 262,143Light level, gain, resolutionSaturation — reduce gain/integration
INT never assertsR3/R4 path, 0x19 value, thresholdsLS_INT_EN clear, thresholds not bracketing, R3 open
INT stuck lowRead MAIN_STATUS to clearStatus never read (clear-on-read), shorted R4/pin 1
Supply current in mA rangeThermal check U1/C1/C2Shorted capacitor, damaged U1

11. Bench record template#

FieldRecord
Board revision / serial
JP1/JP2 state audit
Host / supply and current-limit setting
DMM / scope / light-source equipment and calibration
Unpowered resistance results (A)
Idle levels and standby current (B)
Address-scan result (C)
PART_ID and MAIN_STATUS values (D)
Active current after enable (D4)
White-light channel values (E2)
Covered-sensor channel values (E3)
Red-source and IR-source ratio checks (E4)
Interrupt assert/clear result (F)
Chained-bus / jumper-cut result (G)
Deviations, photos, raw-file paths
Reviewer / date / disposition

12. Review conclusion#

The schematic matches the APDS-9251-001 application circuit: 100 nF + 1 µF decoupling, recommended-value pull-ups on both bus lines and the interrupt, and a series-protected interrupt route to the host. The fixed 0x52 address makes the design simpler than its siblings (no address jumper to mis-bridge) but makes JP1/JP2 chaining the only path to multiple color modules. The principal open risks are pre-fabrication: no PCB layout yet (optical aperture, LGA-8 assembly quality, decoupling placement, and test points all unverified), no board ever powered, and firmware channel ordering (IR/G/B/R, LSB-first, block-read-only) is a likely first-bug site. The PART_ID expectation should be pinned to the upper nibble (0xB) with the revision nibble logged, since driver folklore and datasheet revisions disagree on the exact byte.