Circuit review & bench-test guide
AXS-013 — APDS-9251 RGB+IR color-sensor PMOD module
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#
- This is a 3.3 V logic-only module. Never apply 5 V anywhere; the APDS-9251-001 absolute maximum supply and pin voltage is 3.8 V, and its recommended VDD tops out at 3.6 V — a 3.3 V rail is in range but leaves only 0.3 V of headroom, so check the host rail is not high.
- Power from a PMOD host 3.3 V rail or a bench supply current-limited to about 50 mA. The whole module should draw well under 1 mA; more indicates a fault.
- The sensor is a 2×2 mm LGA-8 optical part. ESD precautions apply; never touch, flux-contaminate, or scratch the optical surface. Hand rework of this package is difficult — treat it as reflow-only.
- Do not hot-plug the PMOD connector during measurements.
- Decide pull-up ownership before chaining modules (section 4, JP1/JP2); stacked pull-ups may overload open-drain drivers.
- Color and lux outputs are uncalibrated raw counts. Channel ratios depend on the light source spectrum; do not treat pass/fail color numbers as colorimetry without a characterized source.
- Passing these bench tests demonstrates prototype function only, not EMC, safety, or environmental qualification.
3. Power and control sequence#
- 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.
- 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.
- Standby is the default state: oscillator and ADCs off, I2C alive. Standby current is 1 µA typical / 2 µA maximum for U1 alone.
- R1/R2 (through JP1/JP2) hold SDA and SCL at 3.3 V; R3 holds the open-drain INT high.
- 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).
- 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.
- 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.
- 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 pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | COLOR_INT | NC | SCL | SDA | GND | 3V3 | NC | NC | SCL | SDA | GND | 3V3 |
Pins 9/10 duplicate SCL/SDA for chaining a second I2C module.
Jumpers#
| Ref. | Type | Factory state | Function |
|---|---|---|---|
| JP1 | 2-pad solder jumper, bridged | Bridged | Connects R1 (4.7 kΩ) to SDA. Cut when another module in the chain provides the bus pull-ups. |
| JP2 | 2-pad solder jumper, bridged | Bridged | Connects 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 / value | Function and why needed | If absent / open | If shorted, wrong, or misassembled | Key datasheet parameters |
|---|---|---|---|---|---|
| J1 | 2x6 right-angle PMOD male header (Conn_02x06_Odd_Even) | Host connection: power, ground, I2C, INT, chained-bus pins | No power/communication; single open pin loses that function | Reversed/offset insertion puts 3.3 V on signal pins; adjacent-pin bridges short SDA/SCL or power | PMOD Type 6 extended; 3.3 V rail defined by host |
| U1 | Broadcom APDS-9251-001, LGA-8 2×2 mm | The measurement device: R/G/B/IR photodiode matrix, per-channel ADCs, I2C, interrupt | Board is inert; no ACK at 0x52 | Rotated part misconnects VDD/GND (pads 2/3) and can destroy it; solder or flux on the optical window skews all channels; LGA voids lift pads | VDD 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 |
| C1 | 100 nF 16 V X7R 0603 (Murata GRM188R71C104KA01D) | U1 VDD high-frequency decoupling | Supply bounce during conversions; possible noisy counts or flaky I2C | Shorted C1 = 3V3–GND short, rail collapse | Low-ESR ceramic close to the package per application note |
| C2 | 1 µF 10 V X7R 0603 (Murata GRM188R71A105KA61D) | U1 VDD bulk decoupling; the datasheet application circuit's 1 µF | Less local charge storage; marginal with long PMOD supply wiring | Shorted C2 = rail short | Application circuit shows 1 µF at VDD |
| R1 | 4.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 traffic | Short 3V3→SDA jams the bus high; too-low value overloads drivers | Sized for 400 kHz on a short bus; ~0.7 mA sink per line |
| R2 | 4.7 kΩ 0603 (Yageo RC0603FR-074K7L) | SCL bus pull-up (via JP2) | Clock floats; no transactions | As R1 | As R1 |
| R3 | 10 kΩ 0603 (Yageo RC0603FR-0710KL) | Pull-up for U1's open-drain INT (net CLR_INT) | INT floats; host sees noise/stuck level | Short to 3V3 masks interrupts permanently | Datasheet suggests a typical 10 kΩ INT pull-up; VOL ≤ 0.4 V |
| R4 | 100 Ω 0603 (Yageo RC0603FR-07100RL) | Series protection between CLR_INT and PMOD pin 1 | Pin 1 disconnected: interrupt never reaches host | Shorted = functional but unprotected; large wrong value only slows edges | Limits contention current if the host mis-drives pin 1 |
| JP1 | 2-pad solder jumper, factory bridged | Makes the SDA pull-up removable for chained buses | Cut: relies on external pull-ups — correct only in a chain | Sloppy re-bridge can short SDA to adjacent copper | See section 4 |
| JP2 | 2-pad solder jumper, factory bridged | Makes the SCL pull-up removable | As JP1, for SCL | As JP1 | See section 4 |
| #FLG01 | PWR_FLAG on 3V3 | ERC-only artifact marking 3V3 as power-driven | Not a physical part; only ERC warnings | Not applicable — never fitted, not in BOM/POS | — |
| #FLG02 | PWR_FLAG on GND | ERC-only artifact for GND | As #FLG01 | Not 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 max | Bench 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 POR | Retry the first probe; don't fail a board on one early NACK |
| MAIN_CTRL (0x00): bit1 LS_EN, bit2 CS_MODE, bit4 SW Reset | 0x02 = 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 3 | First 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 interrupt | First 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–0x15 | Block-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 ends | Always 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 3 | Covered-sensor and green-response targets in section 7 |
| INT_CFG (0x19, default 0x10 = ALS/green channel selected), INT_PERSISTENCE (0x1A), thresholds 0x21–0x26, variance 0x27 | Threshold interrupt bring-up in section 9F |
7. Expected values before bench testing#
All values are targets to verify, not measurements.
| Quantity | Target / calculated | Basis |
|---|---|---|
| Bus idle level, SDA and SCL | 3.3 V through R1/R2 | Pull-ups via JP1/JP2 |
| SDA→3V3 / SCL→3V3 resistance, unpowered, jumpers fitted | ≈ 4.7 kΩ each | R1 / R2 |
| SDA/SCL→3V3 after cutting JP1/JP2 | Open (>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 scan | ACK 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 case | Active-mode spec |
| PART_ID read (0x06) | 0xB5 per this datasheet revision; accept 0xBx, record revision nibble | PART_ID definition |
| MAIN_STATUS (0x07), first read after POR | Bit5 (power-on) set, i.e. 0x20 pattern; bit clears on read | MAIN_STATUS definition |
| First data latency after writing MAIN_CTRL | ~100 ms (default rate/resolution) before bit3 new-data sets | LS_MEAS_RATE default 0x22 |
| Covered sensor (opaque cap), all channels | ≤ 3 counts each; ratios meaningless at dark | Dark-count spec |
| White LED / daylight at default gain 3, 18-bit | All 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 illumination | Red channel ≫ blue channel; IR small | Irradiance 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 weakly | 850 nm response: IR 80–120%, R/G/B 0–3% |
| Saturation check | A 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#
- Confirm U1 orientation against the LGA-8 pin-1 marker (pad 2 = VDD, pad 3 = GND, pad 5 = SCL, pad 6 = SDA, pad 7 = INT; pads 1/4/8 NC). X-ray or careful optical inspection of the LGA joints where available.
- Verify JP1 and JP2 are bridged for standalone use; record intended state for chained builds.
- Measure R1, R2 (4.7 kΩ), R3 (10 kΩ), R4 (100 Ω) before power.
- Confirm C1 and C2 are present, correct values, and not cracked; either one shorted is a rail short.
- At layout time (still open): keep C1/C2 adjacent to U1 VDD (pad 2); keep the optical aperture over U1 free of silkscreen, mask art, and tall neighboring parts that could shade the matrix; consider test points on SDA/SCL/INT/3V3/GND.
- Confirm no solder bridges on J1, especially pins 3-4 (SCL-SDA) and 5-6 (GND-3V3).
- Confirm #FLG01/#FLG02 are schematic-only (not in BOM or placement).
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#
- Complete the section 8 checklist under magnification.
- Measure 3V3→GND resistance in both meter polarities; investigate anything under ~10 kΩ before power.
- Verify SDA→3V3 ≈ 4.7 kΩ, SCL→3V3 ≈ 4.7 kΩ, pin 1→3V3 ≈ 10.1 kΩ.
B. First power, no I2C traffic#
- Set the bench supply to 3.3 V with a ~50 mA current limit; power the module.
- Confirm supply current ≤ ~5 µA (standby) and SDA/SCL/pin 1 all idle at 3.3 V.
C. Address-ACK scan#
- Wait ≥10 ms after power-up (NVM load), then scan all 7-bit addresses.
- 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)#
- Read PART_ID: START, 0x52+W, register 0x06, repeated START, 0x52+R, read one byte — expect 0xB5 (accept 0xBx; log the revision nibble).
- Read MAIN_STATUS (0x07) — expect the power-on bit (0x20) set on the first read and clear on the next.
- Enable RGB mode: write register 0x00 = 0x06 (CS_MODE | LS_EN). For ALS-only bring-up write 0x02 instead.
- Confirm supply current stepped up to the ~130 µA range.
- Poll MAIN_STATUS until bit 3 (new data) sets — expect within ~100–200 ms at defaults.
E. Channel reads and light-response checks#
- 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.
- 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.
- Cover the sensor with an opaque cap: after the next conversion all channels should fall to ≤3 counts.
- 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).
- 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#
- 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).
- 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.
- Cover the sensor and set thresholds around dark values to verify the low-threshold direction too.
G. Pull-up chain configuration (JP1/JP2)#
- Power off. Cut JP1 and JP2; verify SDA→3V3 and SCL→3V3 now read open on this module alone.
- 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.
- Re-bridge with solder to restore standalone use; re-verify ≈4.7 kΩ.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| No ACK at 0x52 ever | 3V3 at U1, idle levels, JP1/JP2 continuity | U1 unpowered/rotated, LGA joint opens, cut jumpers without external pull-ups |
| NACK only right after power-up | Retry after 10 ms | Normal NVM-load behavior, not a fault |
| ACK at some other address | Re-scan, check master | Another device on the chain; this part cannot move from 0x52 |
| PART_ID reads 0x00 or 0xFF | Scope the transaction | Bus corruption, reading a reserved/locked address, U1 damaged |
| PART_ID reads 0xBx but not 0xB5 | Log it | Different silicon revision — record, verify against the current datasheet revision, continue |
| All channels always 0 | MAIN_CTRL value, MAIN_STATUS bit3 | LS_EN never set, read before first conversion, aperture blocked |
| Channels frozen mid-read / mixed old-new data | Read method | Per-byte reads across conversions — switch to a single block read (0x07–0x18 locking) |
| Red/blue behavior swapped | Ratio tests in E4 | Firmware channel-order bug (order is IR, G, B, R — not R, G, B) |
| Counts pegged at 262,143 | Light level, gain, resolution | Saturation — reduce gain/integration |
| INT never asserts | R3/R4 path, 0x19 value, thresholds | LS_INT_EN clear, thresholds not bracketing, R3 open |
| INT stuck low | Read MAIN_STATUS to clear | Status never read (clear-on-read), shorted R4/pin 1 |
| Supply current in mA range | Thermal check U1/C1/C2 | Shorted capacitor, damaged U1 |
11. Bench record template#
| Field | Record |
|---|---|
| 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.