Lab modules

AXL-009 — GPIO expander lab PMOD module (MCP23017)

Catalog #9 in the AruviX lab line, level L3. The I2C register-map lesson with instantly visible results — and pin multiplication for big projects (16 IO for 2 PMOD data pins).

Level L3 ERC clean No layout No fab package 38 components

Circuit review & bench-test guide →

Components#

Every placed component, with the reason it is on the board. Extracted directly from the schematic, so this cannot drift from the design.

RefValueWhat it does on this boardPart numberFootprint
C1 100nF 16V X7R U1 decoupling GRM188R71C104KA01D
Murata
C_0603_1608Metric
C2 10uF 10V X5R Module bulk (8 LEDs switching) GRM21BR61A106KE19L
Murata
C_0805_2012Metric
D1 GREEN GPA0 indicator LED APT1608SGC
Kingbright
Datasheet ↗
LED_0603_1608Metric
D2 GREEN GPA1 indicator LED APT1608SGC
Kingbright
Datasheet ↗
LED_0603_1608Metric
D3 GREEN GPA2 indicator LED APT1608SGC
Kingbright
Datasheet ↗
LED_0603_1608Metric
D4 GREEN GPA3 indicator LED APT1608SGC
Kingbright
Datasheet ↗
LED_0603_1608Metric
D5 GREEN GPA4 indicator LED APT1608SGC
Kingbright
Datasheet ↗
LED_0603_1608Metric
D6 GREEN GPA5 indicator LED APT1608SGC
Kingbright
Datasheet ↗
LED_0603_1608Metric
D7 GREEN GPA6 indicator LED APT1608SGC
Kingbright
Datasheet ↗
LED_0603_1608Metric
D8 GREEN GPA7 indicator LED APT1608SGC
Kingbright
Datasheet ↗
LED_0603_1608Metric
J1 PMOD PLUG 2x6 PMOD peripheral plug (Digilent spec 1.2) not selected
generic
PinHeader_2x06_P2.54mm_Horizontal
JP1 SDA PULL-UP Cut to remove the SDA pull-up when chaining modules SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm
JP2 SCL PULL-UP Cut to remove the SCL pull-up when chaining modules SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm
JP3 ADDR 0x20/0x21 I2C address: 1-2 A0 low 0x20 (default), 2-3 A0 high 0x21 (A1/A2 fixed low) SolderJumper-3_P1.3mm_Bridged12_RoundedPad1.0x1.5mm
R1 330R Ballast for the GPA0 LED (~5 mA at 3.3 V) RC0603FR-07330RL
Yageo
Datasheet ↗
R_0603_1608Metric
R2 330R Ballast for the GPA1 LED (~5 mA at 3.3 V) RC0603FR-07330RL
Yageo
Datasheet ↗
R_0603_1608Metric
R3 330R Ballast for the GPA2 LED (~5 mA at 3.3 V) RC0603FR-07330RL
Yageo
Datasheet ↗
R_0603_1608Metric
R4 330R Ballast for the GPA3 LED (~5 mA at 3.3 V) RC0603FR-07330RL
Yageo
Datasheet ↗
R_0603_1608Metric
R5 330R Ballast for the GPA4 LED (~5 mA at 3.3 V) RC0603FR-07330RL
Yageo
Datasheet ↗
R_0603_1608Metric
R6 330R Ballast for the GPA5 LED (~5 mA at 3.3 V) RC0603FR-07330RL
Yageo
Datasheet ↗
R_0603_1608Metric
R7 330R Ballast for the GPA6 LED (~5 mA at 3.3 V) RC0603FR-07330RL
Yageo
Datasheet ↗
R_0603_1608Metric
R8 330R Ballast for the GPA7 LED (~5 mA at 3.3 V) RC0603FR-07330RL
Yageo
Datasheet ↗
R_0603_1608Metric
R9 4.7k I2C SDA pull-up RC0603FR-074K7L
Yageo
Datasheet ↗
R_0603_1608Metric
R10 4.7k I2C SCL pull-up RC0603FR-074K7L
Yageo
Datasheet ↗
R_0603_1608Metric
R11 10k INTA pull-up (configure IOCON open-drain; line rule for open-drain outputs) RC0603FR-0710KL
Yageo
Datasheet ↗
R_0603_1608Metric
R12 100R Series protection on the module-driven INTA line RC0603FR-07100RL
Yageo
Datasheet ↗
R_0603_1608Metric
R13 10k INTB pull-up RC0603FR-0710KL
Yageo
Datasheet ↗
R_0603_1608Metric
R14 100R Series protection on the module-driven INTB line RC0603FR-07100RL
Yageo
Datasheet ↗
R_0603_1608Metric
R15 10k ~RESET pull-up: expander always out of reset (no host reset line) RC0603FR-0710KL
Yageo
Datasheet ↗
R_0603_1608Metric
SW1 SKQG 5.2mm GPB0 tactile button (active low, internal pull-up) SKQGABE010
Alps Alpine
Datasheet ↗
SW_SPST_SKQG_WithoutStem
SW2 SKQG 5.2mm GPB1 tactile button (active low, internal pull-up) SKQGABE010
Alps Alpine
Datasheet ↗
SW_SPST_SKQG_WithoutStem
SW3 SKQG 5.2mm GPB2 tactile button (active low, internal pull-up) SKQGABE010
Alps Alpine
Datasheet ↗
SW_SPST_SKQG_WithoutStem
SW4 SKQG 5.2mm GPB3 tactile button (active low, internal pull-up) SKQGABE010
Alps Alpine
Datasheet ↗
SW_SPST_SKQG_WithoutStem
SW5 SKQG 5.2mm GPB4 tactile button (active low, internal pull-up) SKQGABE010
Alps Alpine
Datasheet ↗
SW_SPST_SKQG_WithoutStem
SW6 SKQG 5.2mm GPB5 tactile button (active low, internal pull-up) SKQGABE010
Alps Alpine
Datasheet ↗
SW_SPST_SKQG_WithoutStem
SW7 SKQG 5.2mm GPB6 tactile button (active low, internal pull-up) SKQGABE010
Alps Alpine
Datasheet ↗
SW_SPST_SKQG_WithoutStem
SW8 SKQG 5.2mm GPB7 tactile button (active low, internal pull-up) SKQGABE010
Alps Alpine
Datasheet ↗
SW_SPST_SKQG_WithoutStem
U1 MCP23017-E/SS 16-bit I2C GPIO expander with interrupts, SSOP-28 MCP23017-E/SS
Microchip
Datasheet ↗
SSOP-28_5.3x10.2mm_P0.65mm

Signals#

Net labels used in the schematic, which are also the names the HDL top level should use.

3V3 ADDR0 EXP_INTA EXP_INTB GND GPA0 GPA1 GPA2 GPA3 GPA4 GPA5 GPA6 GPA7 GPB0 GPB1 GPB2 GPB3 GPB4 GPB5 GPB6 GPB7 INTA INTB LED0_A LED1_A LED2_A LED3_A LED4_A LED5_A LED6_A LED7_A RESET_N SCL SCL_PU SDA SDA_PU

Production status#

Schematic ERC0 violations
PCB layoutnot started
DRCnot run
Fab packagenot exported
Fabricatedno — design stage only

Source: boards/lab-modules/axl-009-gpio-expander


Catalog #9 in the AruviX lab line (../README.md), level L3. The I2C register-map lesson with instantly visible results — and pin multiplication for big projects (16 IO for 2 PMOD data pins).

Status: schematic generated, ERC clean (0/0), netlist reviewed. PCB layout not started. Not released.

What it teaches#

The canonical register-map pattern: IODIR (direction), GPPU (internal ~100 kΩ pull-ups), GPIO (read), OLAT (write) — twice, once per port. Write IODIRA=0x00, walk OLATA, watch the LED bar; write GPPUB=0xFF, read GPIOB, see buttons active-low with no external resistors (the internal-pull-up lesson). Then IOCON/INTCON/GPINTEN for interrupt-on-change out of INTA/INTB.

Design#

PMOD pin123456789101112
NetINTAINTBSCLSDAGND3V3NCNCSCLSDAGND3V3

Regenerate#

python3 generate_design.py

Remaining for release#