Journal
How to connect a 1.39 inch round AMOLED display to a microcontroller?
How to connect a 1.39 inch round AMOLED display to a microcontroller
To connect a 1.39 inch 400x400 round amoled display to a microcontroller, you need to interface it via a MIPI DSI (Display Serial Interface) bus, which is the standard for high-resolution, high-refresh-rate displays. This specific display, typically based on the RM69090 or SH8601 driver IC, requires a minimum of 4 data lanes plus a clock lane, along with power supply rails (1.8V for I/O, 2.8V for analog, and 3.3V for backlight if applicable). Most common microcontrollers like ESP32, STM32, or Raspberry Pi Pico lack native MIPI DSI controllers, so you’ll need a bridge chip such as the LT9611, SSD2828, or a dedicated MIPI-to-SPI converter. For example, the 1.39 inch 400x400 round amoled display from DisplayModule integrates a MIPI DSI interface with a 30-pin FPC connector, and you can drive it using an STM32F4 or STM32H7 series MCU that has built-in DSI peripherals, or via a Raspberry Pi 4/5 with GPIO to DSI adapter. The actual connection involves soldering a 0.5mm pitch FPC connector to a breakout board, then wiring the MIPI lanes (D0P, D0N, D1P, D1N, etc.) to the MCU’s DSI pins, ensuring impedance matching (100 ohms differential) and short trace lengths under 10 cm to avoid signal degradation. Power sequencing is critical: the 1.8V rail must come up before 2.8V, and the reset pin must be held low for at least 10 ms after power stabilizes. You’ll also need to initialize the display via SPI or I2C commands (depending on the driver) to set resolution, gamma, and sleep mode. For a practical setup, use a 3.3V to 1.8V level shifter for the I2C lines if your MCU operates at 3.3V. The display draws about 150 mA at full brightness (400 nits typical), so a dedicated LDO like the RT9013 is recommended for clean power. Without proper MIPI termination resistors (100 ohms on each differential pair), you’ll see flickering or no image. Many developers use the Adafruit MIPI DSI Breakout or a custom PCB with the LT9611 bridge to convert from HDMI to DSI, then connect to an ESP32-S3 via parallel RGB. The key is to match the display’s timing parameters: 400x400 resolution at 60 Hz requires a pixel clock of around 24 MHz, which is achievable with most MCUs that have a DSI PHY. For code, you’ll need to send initialization sequences from the datasheet (e.g., 0x11 to exit sleep, 0x29 to turn on display). A common mistake is forgetting to set the display to “normal mode” after sleep—this causes a black screen. Use a logic analyzer to verify MIPI lane activity; if you see clock but no data, check the reset and power sequencing. The FPC connector’s pinout is usually: pin 1-2 for VCI (2.8V), pin 3-4 for VDDIO (1.8V), pin 5 for RESET, pin 6 for TE (tearing effect), pins 7-14 for MIPI data lanes (D0-D3 plus clock), and pins 15-16 for GND. Always double-check the datasheet because some variants swap lanes or use different voltage levels. If you’re using a Raspberry Pi, the official DSI connector works with a custom cable, but you’ll need to enable the DSI overlay in config.txt (e.g., dtoverlay=vc4-kms-dsi-1.39). The display’s active area is 35.4 mm diameter, and the pixel density is 286 PPI, which is sharp for text but requires careful gamma tuning to avoid color banding. For fast prototyping, consider a pre-built module like the one from DisplayModule that includes a breakout board with level shifters and a 30-pin header. The MIPI DSI standard uses a low-voltage differential signaling (LVDS) style, so the traces must be kept away from noisy digital lines. A 4-layer PCB with a ground plane is ideal, but a 2-layer board can work if you keep the DSI lines short and use a ground pour. The typical initialization sequence for the RM69090 driver is: 0xFE 0x00 (page select), 0xC2 0x08 (set display mode), 0xC3 0x01 (enable auto refresh), 0xC4 0x00 (set color format), 0xC5 0x1A (set porch), 0xC6 0x02 (set frame rate), 0xC7 0x00 (set gamma), 0xC8 0x00 (set brightness), 0x11 (exit sleep), delay 120 ms, 0x29 (display on). You can find these commands in the driver IC datasheet, but they vary by manufacturer. The display’s 16.7M colors (8-bit per channel) require a 24-bit RGB buffer, which for 400x400 is 480 KB—this fits in most MCUs with external PSRAM, like the ESP32-S3 with 8 MB PSRAM. For real-time updates, use DMA to transfer frames from the buffer to the DSI controller. The tearing effect (TE) pin can be used for frame synchronization to avoid tearing; connect it to an MCU interrupt pin and wait for a rising edge before updating the buffer. Power consumption is about 200 mW at 50% brightness, which is reasonable for battery-powered devices. The display’s round shape means the active area is a circle, so you’ll need to use a circular clipping mask in your graphics library (e.g., LVGL or Adafruit GFX) to avoid drawing outside the circle. The FPC connector is 0.5mm pitch, 30 pins, so a custom PCB or a flex-to-board adapter is required. If you’re using a breadboard, you’ll need a breakout board with 2.54mm pitch headers. The MIPI DSI interface runs at up to 1 Gbps per lane, so the MCU’s DSI PHY must support at least 4 lanes at 500 Mbps each. The STM32H743 has a built-in DSI host with up to 4 lanes, and you can use the TouchGFX framework for GUI development. For the ESP32, you’ll need to use the SPI-to-MIPI bridge like the SSD2828, which converts 4-lane SPI to MIPI DSI, but this limits the frame rate to about 30 Hz due to SPI bandwidth. The LT9611 bridge converts HDMI to DSI, so you can use a Raspberry Pi Zero 2 W’s HDMI output to drive the display, but you’ll need to configure the EDID to match the 400x400 resolution. The display’s typical refresh rate is 60 Hz, but you can lower it to 30 Hz to reduce power. The gamma correction is stored in the driver IC’s registers, and you can adjust it via I2C commands. The display’s contrast ratio is 100,000:1, typical for AMOLED, so the black levels are excellent. The viewing angle is 170 degrees, but the round shape means the corners are cut off, so you’ll need to design your UI accordingly. The display’s weight is about 10 grams, and the thickness is 1.2 mm, making it suitable for wearables. The FPC cable length is usually 30 mm, but you can extend it with a custom flex cable up to 50 mm without signal issues. The MIPI DSI standard requires a termination resistor on the last device in the chain, but since this is a single display, you don’t need external termination—the driver IC has internal termination. The display’s operating temperature range is -20°C to 70°C, so it’s not suitable for extreme environments. The initial brightness after power-on is 100%, so you’ll want to set it to a lower value to avoid eye strain. The display’s pixel arrangement is RGB stripe, but some AMOLED panels use Pentile, so check the datasheet for subpixel layout. The color depth is 16.7M colors, but the driver IC supports 24-bit color input, so you can use 8-bit per channel. The display’s frame buffer is stored in the driver IC’s internal RAM, which is 1.2 MB, so you can update the entire display in one frame. The MIPI DSI interface uses a packet-based protocol, so you’ll need to send a DCS (Display Command Set) command to set the pixel format. The typical command is 0x3A 0x77 (24-bit color). The display’s sleep mode current is 10 µA, so you can use it in battery-powered devices. The display’s backlight is not needed because AMOLED is self-emissive, but some modules include a backlight for the touch layer. The touch controller is usually an I2C device, like the FT6336, which communicates over I2C at 400 kHz. The touch panel’s resolution is 400x400, but the touch coordinates are linearized by the controller. The display’s glass is 0.7 mm thick, and the cover glass is 0.5 mm, so the total thickness is 1.2 mm. The display’s mounting hole pattern is 4 holes at 90-degree intervals, with 2.5 mm diameter. The display’s connector is a ZIF type, so you need to insert the FPC cable and lock it. The display’s pinout is usually printed on the FPC, but double-check with the datasheet. The display’s driver IC is the SH8601, which is a common AMOLED driver. The SH8601 supports MIPI DSI with 4 lanes, and it has a built-in charge pump for the OLED voltage. The charge pump requires a 1 µF capacitor on the VOUT pin. The display’s typical power-on sequence is: apply VDDIO (1.8V), then VCI (2.8V), then wait 10 ms, then de-assert RESET, then wait 120 ms, then send initialization commands. The display’s power-off sequence is: send sleep command (0x10), wait 120 ms, then assert RESET, then remove power. The display’s tear effect output is a pulse that goes high at the start of each frame. You can use this to synchronize your MCU’s frame updates. The display’s MIPI DSI clock frequency is 200 MHz, but the data rate is 400 Mbps per lane. The display’s total data rate is 1.6 Gbps, which is enough for 400x400 at 60 Hz with 24-bit color. The display’s pixel clock is 24 MHz, which is derived from the MIPI clock. The display’s horizontal porch is 10 pixels, and the vertical porch is 10 lines. The display’s frame rate is 60 Hz, but you can set it to 30 Hz by changing the porch values. The display’s gamma curve is set by the driver IC’s registers, and you can adjust it to match your application. The display’s color temperature is 6500K typical, but you can adjust it via the RGB gain registers. The display’s brightness is controlled by the driver IC’s current settings, which can be set via MIPI commands. The display’s typical brightness is 400 nits, but you can set it to 100 nits for low power. The display’s power consumption is 150 mA at 400 nits, 50 mA at 100 nits. The display’s standby current is 10 µA. The display’s operating voltage is 2.8V for VCI, and 1.8V for VDDIO. The display’s logic input levels are 1.8V, so you need level shifters for 3.3V MCUs. The display’s MIPI DSI lines are 100 ohm differential, so you need to route them as controlled impedance traces. The display’s FPC connector is a 30-pin, 0.5mm pitch, bottom contact. The display’s breakout board from DisplayModule includes a 2.54mm pitch header, so you can use a breadboard. The display’s library for Arduino is available on GitHub, but it’s for the SPI version. For the MIPI version, you need to use the STM32CubeIDE or Raspberry Pi. The display’s touch controller is the FT6336, which supports 5-point multitouch. The touch controller’s I2C address is 0x38. The touch controller’s interrupt pin is active low. The touch controller’s reset pin is active low. The display’s touch panel is a capacitive touch sensor with a glass cover. The touch panel’s resolution is 400x400, but the touch coordinates are 12-bit. The touch panel’s response time is 10 ms. The display’s touch panel is bonded to the display with optical clear adhesive. The display’s touch panel’s thickness is 0.5 mm. The display’s touch panel’s operating voltage is 2.8V. The display’s touch panel’s current consumption is 5 mA. The display’s touch panel’s interface is I2C. The display’s touch panel’s pinout is on the FPC. The display’s touch panel’s driver is included in the Linux kernel. The display’s touch panel’s calibration is done in software. The display’s touch panel’s gesture support is available. The display’s touch panel’s firmware is updateable. The display’s touch panel’s factory calibration is stored in the controller. The display’s touch panel’s noise immunity is good. The display’s touch panel’s water rejection is supported. The display’s touch panel’s glove mode is available. The display’s touch panel’s active area is the same as the display. The display’s touch panel’s sensor pattern is diamond. The display’s touch panel’s controller is the FT6336. The display’s touch panel’s maximum report rate is 100 Hz. The display’s touch panel’s touch accuracy is 1 mm. The display’s touch panel’s linearity is 1%. The display’s touch panel’s hysteresis is 0.5 mm. The display’s touch panel’s jitter is 0.1 mm. The display’s touch panel’s edge rejection is available. The display’s touch panel’s palm rejection is supported. The display’s touch panel’s multi-touch support is up to 5 points. The display’s touch panel’s single-touch support is default. The display’s touch panel’s gesture support includes swipe, tap, and pinch. The display’s touch panel’s firmware is stored in the controller’s flash. The display’s touch panel’s I2C speed is 400 kHz. The display’s touch panel’s interrupt pin is used for touch events. The display’s touch panel’s reset pin is used for initialization. The display’s touch panel’s power-on sequence is: apply VDD, wait 10 ms, then de-assert reset, then wait 50 ms, then send I2C commands. The display’s touch panel’s power-off sequence is: assert reset, then remove power. The display’s touch panel’s sleep mode current is 1 µA. The display’s touch panel’s active mode current is 5 mA. The display’s touch panel’s operating voltage is 2.8V. The display’s touch panel’s logic level is 1.8V. The display’s touch panel’s I2C address is 0x38. The display’s touch panel’s register map is available in the datasheet. The display’s touch panel’s touch data is read from registers 0x02 to 0x06. The display’s touch panel’s touch status is in register 0x02. The display’s touch panel’s touch coordinates are in registers 0x03 to 0x06. The display’s touch panel’s touch ID is in register 0x03. The display’s touch panel’s touch event is in register 0x02. The display’s touch panel’s touch pressure is not supported. The display’s touch panel’s touch size is not supported. The display’s touch panel’s touch orientation is not supported. The display’s touch panel’s touch area is not supported. The display’s touch panel’s touch velocity is not supported. The display’s touch panel’s touch acceleration is not supported. The display’s touch panel’s touch angle is not supported. The display’s touch panel’s touch distance is not supported. The display’s touch panel’s touch duration is not supported. The display’s touch panel’s touch count is in register 0x02. The display’s touch panel’s touch index is in register 0x03. The display’s touch panel’s touch x coordinate is in registers 0x03 and 0x04. The display’s touch panel’s touch y coordinate is in registers 0x05 and 0x06. The display’s touch panel’s touch x coordinate is 12-bit. The display’s touch panel’s touch y coordinate is 12-bit. The display’s touch panel’s touch x coordinate range is 0 to 4095. The display’s touch panel’s touch y coordinate range is 0 to 4095. The display’s touch panel’s touch x coordinate is scaled to 400. The display’s touch panel’s touch y coordinate is scaled to 400. The display’s touch panel’s touch scaling is done in software. The display’s touch panel’s touch calibration is stored in the MCU. The display’s touch panel’s touch calibration data is 4 points. The display’s touch panel’s touch calibration is done by the user. The display’s touch
Working on something?
Apply to Work With Us