Skip to content

Use GPIO expander

Driving an e-paper display through the EXT3 expansion board requires a minimum of 8 signals, and up to 18 signals with touch, SD-card and external memory.

Signal Minimal Touch Optional
Power +3.3V, Ground
SPI bus Clock, Data in Data out
Panel Select, Reset, Busy, Data/Command Second select
Flash Select, Second select
SD-card Select, Detect
I²C bus Clock, Data
Touch Reset, Interrupt
Total 8 4 6

Large screens require a Panel:Second select signal. The Flash:Select signal drives the external SPI Flash memory populated on the EXT3-1 extension board. The Flash:Second select signal drives the optional external SPI Flash or SRAM on the EXT3-1 extension board.

Seven signals are shared: Power, SPI and I²C buses.

If the MCU doesn’t offer enough GPIOs, up to eight signals can be relayed by an expander, driven through the existing SPI or I²C bus.

Signal Direct Expander
Power +3.3V, Ground
SPI bus Clock, Data in, Data out
Panel Busy Select, Reset, Data/Command, Second select
Flash Select, Second select
I²C bus Clock, Data
SD-card Detect Select
Touch Interrupt Reset
Total 10 8

Only three signals remain connected to the MCU as inputs: Panel:Busy, Touch:Interrupt and SD-card:Detect.


The option for using a GPIO expander is set on the configuration header file.

#define EXPANDER_MODE USE_I2C_PCF8574 ///< Selected option

By default, the EXPANDER_MODE parameter is set to USE_EXPANDER_NONE. It needs to be set to one of the supported expanders, for example USE_I2C_PCF8574 for the I² PCF8574 with 8 ports.

Depending on the option, the GPIO expander adds up to 8 GPIOs labelled EXPANDER_P0 to EXPANDER_P7.

Use them into the definition of the board as normal GPIOs for outputs. However, it is recommended to keep MCU GPIOs for inputs.

const pins_t boardLaunchPadExpander =
    .panelBusy = 6, // input
    .panelDC = EXPANDER_P0,
    .panelReset = EXPANDER_P1,
    .flashCS = EXPANDER_P2,
    .panelCS = EXPANDER_P3,
    .panelCSS = NOT_CONNECTED,
    .flashCSS = NOT_CONNECTED,
    .touchInt = 8, // input
    .touchReset = EXPANDER_P4,
    .cardCS = NOT_CONNECTED,
    .cardDetect = NOT_CONNECTED, // input


Screen_EPD_EXT3_Fast myScreen(eScreen_EPD_271_CS_09,

The declaration and initialisation of the screen use the new board definition boardLaunchPadExpander as parameter in the constructor according to the configuration procedure.