9.7inch e-Paper HAT

From Waveshare Wiki
Jump to: navigation, search
9.7inch e-Paper raw Panel

1200 × 825, 9.7inch EPD panel without the driver board
9.7inch e-paper HAT

1200 × 825, 9.7inch EPD HAT for Raspberry Pi, USB/SPI/I80/I2C interface




Note: Due to the 9.7inch e-Paper screen being big, the glass panel and FPC is fragile, please be careful when use it for development. we recommend you reinforce the FPC with scotch tape when developing. Please connect all the cables before powering the device, the device cannot support hot-plug.


  • 9.7inch EPD (Electronic Paper Display) HAT for Raspberry Pi, 1200 × 825 resolution, with embedded controller IT8951, communicating via USB/SPI/I80/IPC interface.
  • It has the advantages of low power consumption, wide viewing angle, and clear display under direct sunlight. It is often used in display applications such as shelf labels and industrial instruments.


  • No backlight, keeps displaying last content for a long time even when powered down.
  • Low power consumption, basically power is only required for refreshing.
  • Standard Raspberry Pi 40PIN GPIO extension header, supports Raspberry Pi series boards.
  • USB/SPI/I80/I2C interface, for connecting with host boards like Raspberry Pi/Nucleo, etc.
  • Comes with online development resources and manual (examples for Raspberry Pi/STM32).


  • Operating voltage: 5V
  • Interface: USB/SPI/I80/I2C
  • Outline dimension: 218.8mm × 156.425mm × 1.15mm
  • Display size: 202.8mm × 139.425mm
  • Dot pitch: 0.169 × 0.169
  • Resolution: 1200 × 825
  • Display color: black, white
  • Grayscale: 2-16 (1-4 bit)


  • Full refresh time: <1s
  • Total refresh power: 0.6W (typ.)
  • Total standby power: 0.3W (typ.)
  • Viewing angle: >170°
  • Operating temperature: 0 ~ 50 ℃
  • Storage temperature: -25 ~ 70 ℃

Working principle

The electronic paper in this product uses the "microcapsule electrophoresis display" technology. The principle is that the charged nanoparticles suspended in the liquid are migrated by the electric field. The e-paper screen displays patterns by reflecting ambient light and does not require a backlight. Under ambient light, the e-paper display screen is clearly visible, with a viewing angle of almost 180°. Therefore, the e-paper display is perfect for reading. (Note that the e-Paper cannot support updating directly under sunlight).

How to use

Working with Windows PC(USB)

  • Connect 9.7inch e-paper to IT8951 driver board as below.
  • Connect driver board to PC by USB cable.
  • Download and open test software E-LINK-TCON-DEMO.
  • Click connect as below.
  • Check option "AutoSet", then click "Open File" to open one picture for display. The browse diagram will be opened, and you should click "OK".
  • Click "display" to refresh the picture.

Note: If you want to use the USB interface to develop the e-Paper on Windows, you need to contact the Waveshare team and sign the NDA before you can get the E-LINK-TCON-DEMO source code.
Note: Currently not available for individual users.

Working with Raspberry Pi (SPI)

  • Step 1: Hardware connection:

Connect the HAT to GPIO of Raspberry Pi, and communicate with Raspberry PI via the SPI interface.


You can also connect by wires, as shown in the following table:

Connect to Raspberry Pi via SPI
IT8951 Driver HAT Raspberry Pi (BCM) Description'
5V 5V 5V power input
GND GND Ground
SCK P11 SCK Pin of SPI
CS P8 Chip selection of SPI (Low active)
RST P17 Reset pin (Low active)
HRDY P24 Busy status pin (Low when busy)
  • Step 2: Make sure you have switched the dip switch to SPI mode.
  • Step 3: Install the C function library, open the Raspberry Pi terminal, and execute the following codes:

1. Install bcm2835 libraries (Recommended for Pi4 (faster)).

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gz
tar zxvf bcm2835-1.60.tar.gz
cd bcm2835-1.60
sudo make check
sudo make install
#For more details, you can refer to http://www.airspayce.com/mikem/bcm2835/

2. Install lg library (Recommended for Pi5, BCM library currently does not support Pi5).

#Open the Raspberry Pi terminal and run the following commands:
wget https://github.com/joan2937/lg/archive/master.zip
unzip master.zip
cd lg-master
sudo make install
# For more details, you can refer to: https://github.com/gpiozero/lg

3. Install gpiod library (optional).

#Open the Raspberry Pi terminal and run the following commands:
sudo apt-get update
sudo apt install gpiod libgpiod-dev
  • Step 4: Enable SPI interface.

The Raspberry PI uses SPI to drive the IT8951 and then the e-Paper, hence, you need to open the SPI first:
Open the terminal command line and input:

sudo raspi-config

Choose Interfacing Options -> P4 -> SPI -> Yes.
7.8inch e-Paper HAT RPI01.png
If you use lg or gpiod library, you need to execute the following commands:

# Input the commands:
sudo nano /boot/config.txt
# Command out dtparam=spi=on and add

E-Paper lg.jpg
Input " sudo reboot " to reboot the Raspberry Pi to activate the configuration.

  • Step 5: Download demo codes and compile them.

Method 1: Download from our website. (Recommended)

sudo apt-get install p7zip-full
sudo wget  https://files.waveshare.com/upload/8/80/IT8951_20200319_Release.7z
7z x IT8951_20200319_Release.7z -O./IT8951
cd IT8951/
sudo make clean
sudo make -j4
# The BCM library is used by default, if you want to use other libraries, please change them in the Makefile or use the following commands:
make -j4 LIB=LGPIO     # for using lg library
make -j4 LIB=GPIOD     # for using gpiod library

Method 2: Download from GitHub.

git clone https://github.com/waveshare/IT8951-ePaper.git
cd IT8951-ePaper/Raspberry
sudo make clean
sudo make -j4
# The BCM library is used by default, if you want to use other libraries, please change them in the Makefile or use the following commands:
make -j4 LIB=LGPIO     # for using lg library
make -j4 LIB=GPIOD     # for using gpiod library
  • Check the VCOM value on the FPC.

Add the VCOM value as a parameter and take the display mode as a input parameter, this model is mode 0.

sudo ./epd -1.50 0
  • Demo execution phenomenon:

1) First, the e-paper will refresh the 16 gray bars partially in sequence.

2) Then demonstrate the demo of drawing lines, circles, rectangles, characters, and numbers.

3) Then respectively demonstrate the demo of displaying BMP pictures in 1bp, 2bp, and 4bp modes.

4) Next, demonstrate the effect of fast refresh in A2 mode.

5) Then display a gif animation.

6) Then demonstrate a Demo that counts the frame rate.

7) Finally, the e-paper is whitened in Init mode for long-term storage.

Working with STM32 (SPI or I80)

Driver Interface Selection

  • Using the SPI to drive (recommended), the advantage is to occupy fewer pins, be easy to drive, and have a communication speed that can meet most of the scenarios.
  • Using the I80 to drive (adopt this way if the SPI interface communication speed is not ideal), the advantage is that the drive method is relatively simple, communication speed is very fast, but it occupies more pins.
  • Using I2C to drive (not recommended due to its slow speed).

Driver Board Selection

  • As the IT8951 occupies most of the RAM space, some of the STM32 cannot support external SDRAM devices. So we here use Open429I as a test board, Open429I integrates IS42S16400J (64-MBIT) SDRAM, has full memory to drive the 9.7inch e-Paper-HAT.


1) Follow the table below for hardware connection:

IT8951 Driver HAT STM32 Description
5V 5V 5V power input
GND GND Ground
CS PE11 Chip selection of SPI (Low active)
RST PC5 Reset pin (Low active)
HRDY PA7 Busy status pin (Low when busy)

2) Set the switch to SPI mode.


3) Download the demo code to refresh the picture.

You can download the demo code here.

Open the project with Keil, The path of the code is Open429I-C-IT8951-Demo\Project\9.7-IT8951\MDK-ARM\Project.uvproj

Click on "Compile", then open IT8951.h and make sure that IT8951_Interface_SPI is defined. Click on "Recompile" and download. After a few seconds, you should be able to see the e-paper start displaying images in a loop.


4) The information will be printed as below (115200, 8N1):



1) Follow the table below for hardware connection:

IT8951 Driver HAT STM32 Description
DBUS0~DBUS15 PB0~PB15 Data pins
HWE PC1 Write enable (Low active)
D/C PC7 Data/Command(Low for command)
CSEL PC6 Chip select enable (Low active)
HRD PC3 Read enable (Low active)
RST PC0 Reset pin (Low active)
BUSY PA7 Busy status pin (Low when busy)
GND GND Ground
VCC 5V 5V power input

2) Set the switch to I80 mode.


3) Use the DEMO program to refresh the picture.

You can download the demo code here.

After downloading, extract the files and open the project using Keil. The project directory address is Open429I-C-IT8951-Demo\Project\9.7-IT8951\MDK-ARM\Project.uvproj.

Click on "Compile", then open IT8951.h and make sure that IT8951_Interface_I80 is defined. Compile it again and download it to your board. After a few seconds, you should be able to see the e-paper start displaying images in a loop.


4) View the serial port print information, where the serial port print information is as follows (baud rate 115200):

Display pictures

For easy porting of our demo code, we display pictures with a data matrix instead of the file system.

We should first convert the BMP picture to a data matrix (arrays), and use it in demo code.

1) Prepare a BMP image, and resize the picture to 1200*825 (the resolution of this e-Paper).

2) Open BMP convert software, Click File -> Open..-> to open the picture as below:


3) Click Image -> Convert to -> Gray256(8 BPP), as shown below:


4) Click File -> Save As... -> Choose "C" bitmap file (*.c) -> input file name and click Save.

5) Choose 8 bits per pixel, and click OK. A C file will be saved to your PC.


6) Add the C file to the keil project, delect unusable information.

*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
*                           www.segger.com                           *
*                                                                    *
* C-file generated by                                                *
*                                                                    *
*        Bitmap Converter for emWin V5.22.                           *
*        Compiled Jul  4 2013, 12:18:24                              *
*        (c) 1998 - 2013 Segger Microcontroller GmbH && Co. KG       *
*                                                                    *
*                                                                    *
* Source file: zoo                                                   *
* Dimensions:  1200 * 825                                            *
* NumColors:   256                                                   *
*                                                                    *
#include <stdlib.h>
#include "GUI.h"
  #define GUI_CONST_STORAGE const
*       Palette
*  Description
*    The following are the entries of the palette table.
*    The entries are stored as a 32-bit values of which 24 bits are
*    actually used according to the following bit mask: 0xBBGGRR
*    The lower   8 bits represent the Red   component.
*    The middle  8 bits represent the Green component.
*    The highest 8 bits represent the Blue  component.
static GUI_CONST_STORAGE GUI_COLOR _Colorszoo[] = {
  0x000000, 0x010101, 0x020202, 0x030303,
  0x040404, 0x050505, 0x060606, 0x070707,
  0x080808, 0x090909, 0x0A0A0A, 0x0B0B0B,
  0x0C0C0C, 0x0D0D0D, 0x0E0E0E, 0x0F0F0F,
  0x101010, 0x111111, 0x121212, 0x131313,
  0x141414, 0x151515, 0x161616, 0x171717,
  0x181818, 0x191919, 0x1A1A1A, 0x1B1B1B,
  0x1C1C1C, 0x1D1D1D, 0x1E1E1E, 0x1F1F1F,
  0x202020, 0x212121, 0x222222, 0x232323,
  0x242424, 0x252525, 0x262626, 0x272727,
  0x282828, 0x292929, 0x2A2A2A, 0x2B2B2B,
  0x2C2C2C, 0x2D2D2D, 0x2E2E2E, 0x2F2F2F,
  0x303030, 0x313131, 0x323232, 0x333333,
  0x343434, 0x353535, 0x363636, 0x373737,
  0x383838, 0x393939, 0x3A3A3A, 0x3B3B3B,
  0x3C3C3C, 0x3D3D3D, 0x3E3E3E, 0x3F3F3F,
  0x404040, 0x414141, 0x424242, 0x434343,
  0x444444, 0x454545, 0x464646, 0x474747,
  0x484848, 0x494949, 0x4A4A4A, 0x4B4B4B,
  0x4C4C4C, 0x4D4D4D, 0x4E4E4E, 0x4F4F4F,
  0x505050, 0x515151, 0x525252, 0x535353,
  0x545454, 0x555555, 0x565656, 0x575757,
  0x585858, 0x595959, 0x5A5A5A, 0x5B5B5B,
  0x5C5C5C, 0x5D5D5D, 0x5E5E5E, 0x5F5F5F,
  0x606060, 0x616161, 0x626262, 0x636363,
  0x646464, 0x656565, 0x666666, 0x676767,
  0x686868, 0x696969, 0x6A6A6A, 0x6B6B6B,
  0x6C6C6C, 0x6D6D6D, 0x6E6E6E, 0x6F6F6F,
  0x707070, 0x717171, 0x727272, 0x737373,
  0x747474, 0x757575, 0x767676, 0x777777,
  0x787878, 0x797979, 0x7A7A7A, 0x7B7B7B,
  0x7C7C7C, 0x7D7D7D, 0x7E7E7E, 0x7F7F7F,
  0x808080, 0x818181, 0x828282, 0x838383,
  0x848484, 0x858585, 0x868686, 0x878787,
  0x888888, 0x898989, 0x8A8A8A, 0x8B8B8B,
  0x8C8C8C, 0x8D8D8D, 0x8E8E8E, 0x8F8F8F,
  0x909090, 0x919191, 0x929292, 0x939393,
  0x949494, 0x959595, 0x969696, 0x979797,
  0x989898, 0x999999, 0x9A9A9A, 0x9B9B9B,
  0x9C9C9C, 0x9D9D9D, 0x9E9E9E, 0x9F9F9F,
  0xA0A0A0, 0xA1A1A1, 0xA2A2A2, 0xA3A3A3,
  0xA4A4A4, 0xA5A5A5, 0xA6A6A6, 0xA7A7A7,
  0xA8A8A8, 0xA9A9A9, 0xAAAAAA, 0xABABAB,
  0xB0B0B0, 0xB1B1B1, 0xB2B2B2, 0xB3B3B3,
  0xB4B4B4, 0xB5B5B5, 0xB6B6B6, 0xB7B7B7,
  0xB8B8B8, 0xB9B9B9, 0xBABABA, 0xBBBBBB,
  0xC0C0C0, 0xC1C1C1, 0xC2C2C2, 0xC3C3C3,
  0xC4C4C4, 0xC5C5C5, 0xC6C6C6, 0xC7C7C7,
  0xC8C8C8, 0xC9C9C9, 0xCACACA, 0xCBCBCB,
  0xD0D0D0, 0xD1D1D1, 0xD2D2D2, 0xD3D3D3,
  0xD4D4D4, 0xD5D5D5, 0xD6D6D6, 0xD7D7D7,
  0xD8D8D8, 0xD9D9D9, 0xDADADA, 0xDBDBDB,
  0xE0E0E0, 0xE1E1E1, 0xE2E2E2, 0xE3E3E3,
  0xE4E4E4, 0xE5E5E5, 0xE6E6E6, 0xE7E7E7,
  0xE8E8E8, 0xE9E9E9, 0xEAEAEA, 0xEBEBEB,
  0xF0F0F0, 0xF1F1F1, 0xF2F2F2, 0xF3F3F3,
  0xF4F4F4, 0xF5F5F5, 0xF6F6F6, 0xF7F7F7,
  0xF8F8F8, 0xF9F9F9, 0xFAFAFA, 0xFBFBFB,
  256,  // Number of entries
  0,    // No transparency
  1200, // xSize
  825, // ySize
  1200, // BytesPerLine
  8, // BitsPerPixel
  _aczoo,  // Pointer to picture data (indices)
  &_Palzoo   // Pointer to palette

7) Modify the codes:

static GUI_CONST_STORAGE unsigned char _aczoo[] = {

to this one. (You can change the name of the array to the one you like)

const unsigned char zoo_1200_825[] = {

8) Modify related codes in IT8951.C as below:

extern const unsigned char zoo_1200_825[];
void IT8951DisplayExample3()
	IT8951LdImgInfo stLdImgInfo;
	IT8951AreaImgInfo stAreaImgInfo;
	TWord width = gstI80DevInfo.usPanelW;
	TWord high = gstI80DevInfo.usPanelH;
	TDWord i;
	for (i = 0;i < width*high;i++)
		gpFrameBuf[i] = zoo_1200_825[i];
	//Setting Load image information
	stLdImgInfo.ulStartFBAddr    = (TDWord)gpFrameBuf;
	stLdImgInfo.usEndianType     = IT8951_LDIMG_L_ENDIAN;
	stLdImgInfo.usPixelFormat    = IT8951_8BPP; 
	stLdImgInfo.usRotate         = IT8951_ROTATE_0;
	stLdImgInfo.ulImgBufBaseAddr = gulImgBufAddr;
	//Set Load Area
	stAreaImgInfo.usX      = 0;
	stAreaImgInfo.usY      = 0;
	stAreaImgInfo.usWidth  = width;
	stAreaImgInfo.usHeight = high;
	IT8951HostAreaPackedPixelWrite(&stLdImgInfo, &stAreaImgInfo);//Display function 2
	IT8951DisplayArea(0,0, gstI80DevInfo.usPanelW, gstI80DevInfo.usPanelH, 2);



Due to updating, the hardware connection of e-Paper may be different as the picture showed, the specific FPC cable and pin numbers shall prevail:

  • Check Example 1
  • Check Example 2

DIP Switch

  • At present, it is not recommended to drive via the I2C interface, it is recommended to use the USB, I80, or SPI interface to drive.
  • Whether to drive via the USB interface, I80 interface, or SPI interface, you need to turn the DIP switch circled in red in the figure below to the right ON position, as shown in the figure below:
  • If USB is used to connect the PC and the E-LINK-TCON-DEMO cannot recognize the IT8951 when connected to a PC by USB, please check whether both sides of the two dip switches marked by the red box are on, only when both dipswitches marked by the red box are on can the PC recognize it.

Choose SPI or I80 to Drive

  • If you use a USB driver, you do not need to pay attention to the dip switch in the green box shown below:
  • If you use the SPI driver or I80 driver, you need to pay attention to the dip switch in the green box shown below, if you dial to I80 side, it means to use the I80 driver, if you dial to SPI side, it means use SPI driver:

7.8inch e-Paper HAT HC04.png

Codes description

New Features

  • 1. Using 4bpp to refresh the 16-level grayscale image, the amount of SPI transmission data is reduced to half of the original one, avoiding the waste of RAM and transmission time caused by the previous version using 8bpp to refresh the 16-level grayscale image.
  • 2. The SPI transmission speed is doubled, which is valid in the 3rd generation of Raspberry Pi, but ineffective in the 4th generation of Raspberry Pi due to the increase in CPU frequency.
  • 3. The time interval for refreshing the picture is reduced to 1/4 of the original. It is measured that the previous version of the program uses GC16 mode to refresh a BMP picture with 16-level grayscale in full screen to 10.3inch e-Paper (D). It takes about 10S. And this routine only needs about 3S.
  • 4. Avoid the memory leak caused by the previous version opening the BMP file after allocating the cache but not releasing it.
  • 5. Add 1bpp, 2bpp, 4bpp, 8bpp mode support.
  • 6. Add the A2 mode refresh demo, you can feel the A2 mode refresh speed.
  • 7. Add support for drawing dots, lines, circles, rectangles, writing characters, etc., supports grayscale selection of characters and patterns, supports 1bpp, 2bpp, 4bpp, 8bpp, if you choose 1bpp, it also supports A2 mode refresh.
  • 8. Add 1bpp, 2bpp, 4bpp, and 8bpp refresh support for bmp pictures, if you choose 1bpp, it also supports A2 mode refresh.
  • 9. Add a demo for displaying GIF pictures, which can write multiple pictures into the IT8951 cache, and directly swipe the data of different addresses in the cache into the ink screen for display, eliminating the data transmission process between RPi and IT8951, refresh frame rate up to 7fps.
  • 10. Add a frame rate test demo, which is convenient for testing and refreshing areas of different sizes, 1bpp, 2bpp, 4bpp, 8bpp, and A2 mode, GC16 mode, and refreshed frame rate.
  • 11. Support to enhance the driving ability to avoid partial blurring of the screen display in some cases.
  • 12. Support 4-byte alignment for 6inch ePaper HAT and 6inch HD ePaper HAT, to avoid abnormal display during 1bp refresh.
  • 13. You need to input VCOM when the demo is running, and it will be completely white when the routine is running to protect the screen and prolong its life of the screen.
  • 14. Optimize the program structure, reduce the coupling of the program, standardize some functions, and name variables.


Locally refresh 16 grayscale bars from light to dark grayscale in turn

  • Function name: DisplayColorPaletteExample
  • This demo demonstrates how to refresh 16 grayscale bars from light to dark grayscale in turn with 4bpp and GC16.

Draw Dots, Lines, Circles, Rectangles, and characters

  • Function name: DisplayCharacterPatternExample
  • This demo demonstrates how to draw dots, lines, circles, rectangles and characters, and supports 1bpp, 2bpp, 4bpp, and 8bpp. If you use 1bpp, it also supports A2 mode to refresh.

Display BMP Picture

  • Function name: DisplayBMPExample
  • This demo demonstrates how to refresh a BMP picture, and supports 1bpp, 2bpp, 4bpp, and 8bpp. If you use 1bpp, it also supports A2 to refresh.

A2 Mode Refresh Example

  • Function name: DynamicRefreshExample
  • This demo demonstrates how to use A2 mode to refresh. In this demo, the refresh area will be refreshed several times, and the area of the refresh area will gradually become larger. After refreshing several times, an afterimage will appear. The afterimage will be cleared using INIT mode. Through this demo, you can intuitively feel the refresh speed of the A2 mode.

Display GIF Picture

  • Function name: DynamicGIFExample
  • This Demo demonstrates how to refresh a GIF image. In this demo, a GIF image is divided into 7 bmp images in advance, and the 7bmp images are written to the cache of a continuous address of IT8951 first. During display, the image data will be read from the cache of the corresponding address of IT8951 in turn and refreshed on the e-paper screen. Because there is no process of data transmission between RPi and IT8951, the refresh speed will be very fast. This Demo also demonstrates the limit speed of the IT8951 refreshing the ink screen is about 7fps.

Test Frame Rate

  • Function name: CheckFrameRateExample
  • This demo is for testing the refresh frame rate when refreshing areas of different sizes, 1bpp, 2bpp, 4bpp, 8bpp, as well as A2 mode, GC16 mode. In this demo, the time to refresh 10 frames of images will be automatically counted, and frames per second (fps) is automatically calculated.

Related Description

Mode Description

IT8951 has flashed different firmware for different resolution screens. Different firmware has different refresh modes. See the Mode Description for details. The modes used in the demo are INIT mode, GC16 mode, and A2 mode.
Below is a brief description of the relevant modes:

Mode Features 6inch/6inch HD 7.8inch/9.7inch/10.3inch
INIT is used to erase the display content and clear the screen. It is recommended to use INIT mode to clear the screen after multiple A2 mode refreshes. Mode0 Mode0
GC16 Use 16-level grayscale to refresh the screen display content, and the display effect is the best. Mode2 Mode2
A2 Can only refresh black and white 2-level grayscale, but the refresh speed is the fastest. Mode4 Mode6
//basic mode definition
UBYTE INIT_Mode = 0;
UBYTE GC16_Mode = 2;
//A2_Mode's value is not fixed, is decided by firmware's LUT 
UBYTE A2_Mode = 6;
if( strcmp(LUT_Version, "M641") == 0 ){
    //6inch e-Paper HAT(800,600), 6inch HD e-Paper HAT(1448,1072), 6inch HD touch e-Paper HAT(1448,1072)
    A2_Mode = 4;
    Four_Byte_Align = true;
}else if( strcmp(LUT_Version, "M841") == 0 ){
    //9.7inch e-Paper HAT(1200,825)
    A2_Mode = 6;
}else if( strcmp(LUT_Version, "M841_TFA2812") == 0 ){
    //7.8inch e-Paper HAT(1872,1404)
    A2_Mode = 6;
}else if( strcmp(LUT_Version, "M841_TFA5210") == 0 ){
    //10.3inch e-Paper HAT(1872,1404)
    A2_Mode = 6;
    //default set to 6 as A2 Mode
    A2_Mode = 6;

About bpp

bpp is Bits per pixel, it is the data that show the number of bits per pixel. Currently, all the gray e-Paper supports 1bpp, 2bpp, 4bpp, and 8bpp.

  • 1bpp
    • Evey pixel use 1 bit.
    • It supports 2 (2^1=2) gray, it is used for A2 mode.
    • Evey byte contains 8 pixels.
    • Save in RAM in big-endian format:


    • In IT8951, the little-endian format is used by default, and it is necessary to convert the big-endian format to the little-endian format.
  • 2bpp
    • Every pixel uses 2 bits.
    • Support 4(2^2=4) grays.
    • Every byte contains 4 pixels.
    • Save in RAM in big-endian format:


    • In IT8951, the little-endian format is used by default, and it is necessary to convert the big-endian format to the little-endian format.
  • 4bpp
    • Every pixel uses 4 bits.
    • Support 16(2^4=16) grays.
    • Every byte contains 2 pixels.
    • Save in RAM in big-endian format:


    • In IT8951, the little-endian format is used by default, and it is necessary to convert the big-endian format to the little-endian format.
    • It is recommended to use 4bpp for a refreshing, which can display 16 levels of grayscale, and compared to 8bpp, the amount of transmitted data is reduced by half, the transmission speed is twice as fast, and there is no difference in display effect.
  • 8bpp
    • Every pixel uses 8 bits.
    • Support 256(2^8=256) grays, however, IT8951 only uses the high four bits, only supports 16 grays.
    • Every byte contains 1 pixel.
    • Save in RAM in big-endian format:


    • In IT8951, the little-endian format is used by default, and it is necessary to convert the big-endian format to the little-endian format.
    • To get the corresponding grayscale image from the original image. The specific operation in the program is: whether drawing points, drawing lines, or getting the image, each pixel point obtained is 1 byte (8 bits), if you want to get the corresponding grayscale, you only need to get the corresponding high bit of the byte. For example, if you want to get 2bpp pixel points, you only need to get the high 2 bits from the pixels of 8bpp (8 bits). The specific operation is shown in the following program, in which each byte in RAM is also converted from big-endian to little-endian.
UDOUBLE Addr = X * (Paint.BitsPerPixel) / 8 + Y * Paint.WidthByte;
switch( Paint.BitsPerPixel ){
    case 8:{
        Paint.Image[Addr] = Color & 0xF0;
    case 4:{
        Paint.Image[Addr] &= ~( (0xF0) >> (7 - (X*4+3)%8 ) );
        Paint.Image[Addr] |= (Color & 0xF0) >> (7 - (X*4+3)%8 );
    case 2:{
        Paint.Image[Addr] &= ~( (0xC0) >> (7 - (X*2+1)%8 ) );
        Paint.Image[Addr] |= (Color & 0xC0) >> (7 - (X*2+1)%8 );
    case 1:{
        Paint.Image[Addr] &= ~( (0x80) >> (7 - X%8) );
        Paint.Image[Addr] |= (Color & 0x80) >> (7 - X%8);

4-byte Alignment Description

In the actual test, we found that for 6inch e-Paper HAT, 6inch HD e-Paper HAT, and 6inch HD touch e-Paper HAT, when using 1bpp mode refresh, the starting point X and refresh width W of the refresh area need to be aligned with 4 bytes (32bit), otherwise, the image of the refresh area will be displayed abnormally, as shown in the following procedure:

if( strcmp(LUT_Version, "M641") == 0 ){
    //6inch e-Paper HAT(800,600), 6inch HD e-Paper HAT(1448,1072), 6inch HD touch e-Paper HAT(1448,1072)
    A2_Mode = 4;
    Four_Byte_Align = true;
}else if( strcmp(LUT_Version, "M841") == 0 ){
if(Four_Byte_Align == true){
    In_4bp_Refresh_Area_Width = Panel_Width - (Panel_Width % 32);
    In_4bp_Refresh_Area_Width = Panel_Width;
X_Start = Min_X < 32 ? 0 : Min_X - (Min_X % 32);
X_End = ( Max_X + (32 - (Max_X % 32)) ) > Touch_Pannel_Area_Width ? ( Max_X - (Max_X % 32) )  : ( Max_X + (32 - (Max_X % 32)) );
Y_Start = Min_Y;
Y_End = Max_Y;
Width = X_End - X_Start;
    Width = 32;
Height = Y_End-Y_Start;
    Height = 32;

About the speed of SPI

Due to the difference in CPU main frequency of Raspberry Pi 3 and Raspberry Pi 4:

  • Raspberry Pi 3 can still transmit normally when it adopts 16 division frequency, and the fastest can only adopt 16 division frequency.
  • While Raspberry Pi 4B adopts 16 divisions, the SPI rate is too high, and there will be transmission errors, so the SPI of Raspberry Pi 4B can only use 32 divisions at the fastest.
  • In BCM2835 library manual, different Raspberry Pi version, different clock frequency, the corresponding frequency description is shown below:
  • If you need to obtain the most suitable SPI transfer speed, you need to select a different SPI clock division according to your Raspberry Pi version, as shown in the following program and its comments:
bcm2835_spi_begin();//Start spi interface, set spi pin for the reuse function
bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);//High first transmission
bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);//spi mode 0
//bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_16);//For RPi 3/3B/3B+
bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_32);//For RPi 4B
/* SPI clock reference link:*/

Enhance driving capability

Sometimes, the e-Paper displays abnormally because of the long FPC cable, in this case, you can try to enhance the driving capability:

    Debug("Attention! Enhanced driving ability, only used when the screen is blurred\r\n");
function :  Enhanced driving capability
parameter:  Enhanced driving capability for IT8951, in case the blurred display effect
void Enhance_Driving_Capability(void)
    UWORD RegValue = EPD_IT8951_ReadReg(0x0038);
    Debug("The reg value before writing is %x\r\n", RegValue);
    EPD_IT8951_WriteReg(0x0038, 0x0602);
    RegValue = EPD_IT8951_ReadReg(0x0038);
    Debug("The reg value after writing is %x\r\n", RegValue);

If the E-LINK-TCON-DEMO software is used on a PC (Windows) to refresh the E-paper via the USB interface, the drive can be enhanced by modifying the register values as follows:

  • Read the data of 0x18000038 register.

If the data of the read register address 0x18000038 is 0x02, it means that the driver is not yet enhanced.

  • Modify the data to 602.
  • Check the data.

Check whether the data of register address 0x18000038 is modified successfully. If the data of this address is 0x602, it means that the driving capability has been enhanced and the screen can be brushed in this state to avoid the blurred display in some cases, such as when the FPC line is too long and the production batch is different.

About VCOM

The VCOM voltages of every e-Paper panel are different and they are printed on FPC cable. Please make sure that you use the correct VCOM, otherwise, the display will become worse if the E-paper works under the wrong VCOM value for a long time.

Development Note

The above only illustrates how to use the 9.7inch e-Paper HAT. For details on how to modify and perform secondary development, you need to consult the relevant code by yourself.

Please refer to the IT8951-related information provided in the Resources section.



Demo code



Other documents

Related Resources

The projects listed are all made and shared by the project owners, Waveshare isn't responsible for the project or the update.

This is a post in Arduino Form about our SPI e-Paper thanks to ZinggJM, which maybe you want to refer to.
This is the Inkycal project for reference.


Questions About Software & Hardware


The most likely reason for not being able to print the picture is that the wires are not connected correctly. Please check the wiring. Due to the different batches of products, the wiring method may not be exactly the same as the picture. Please refer to the cable and 1 and 40 on the silk screen. Connect as shown in the red line mark in the figure below:




1. Replace the Micro USB cable with good quality. There are many USB cables on the market that have too much voltage drop, which will cause the USB interface to fail to enumerate normally.
2. Try changing the USB interface. It is recommended to use the USB interface on the back of the PC. Relatively speaking, the power supply current will be larger.
3. Turn the DIP switch to the end. During shipping, the DIP switches may be loosened, and the floating configuration pins cannot put the IT8951 into USB mode.




Click connect. The following information will be displayed normally (different models will display different information):
If you fail to refresh, check whether the hard link is normal, use the USB port on the back of the PC (most of the USB ports on the front of the PC have weak power supply capability), and replace the e-paper to test.
Note: Do not plug and unplug the e-paper with power on, otherwise the driver board and e-paper may be damaged.




Yes, but the CS, RST, and HRDY pins of the second screen need to be connected to different pins on the controller for individual control.


Questions About Screen

  • 【Operating condition】Temperature range: 0~50°C; Humidity range: 35%~65%RH
  • 【Storage condition】Temperature range: below 30°C; Humidity range: below 55%RH; Maximum storage time: 6 months
  • 【Transportation condition】Temperature range: -25~70°C; Maximum shipping time: 10 days
  • 【After unpacking】Temperature range: 20°C±5°C; Humidity range: 50±5%RH; Maximum storage time: Assembled within 72 hours


  • Refresh mode:
    • Full refresh: The e-paper screen will flicker several times during refreshing (the flicking times depend on the refresh time), and the flicker is to remove the ghosting to achieve the best display effect.
    • Partial refresh: The e-paper screen has no flickering effect during refreshing. Users who use partial flashing should pay attention to performing a full flashing operation to remove the ghosting after refreshing several times, otherwise, the ghosting problem will become more and more serious, or even damage the screen. (At present, only some black and white e-paper screens support partial refreshing, please refer to the product page for details).
  • Refresh frequency:
    • During use, it is recommended that customers set the refresh interval of the e-ink screen to at least 180 seconds. (Except for products that support the partial refreshing function)
    • During the standby process (that is, after the refresh operation), it is recommended that the customer set the e-paper screen to sleep mode, or power off (the power supply part of the e-paper screen can be disconnected with an analog switch) to reduce power consumption and prolong the life of the e-paper screen. (If some e-paper screens are powered on for a long time, the screen will be damaged beyond repair.)
    • During the use of the e-paper screen, it is recommended that customers update the display screen at least every 24 hours. (If the screen keeps the same picture for a long time, there will be a burn-in situation that is difficult to repair).
  • Application scenarios:
    • The e-paper screen is recommended for indoor use. If it is used outdoors, it is necessary to prevent the e-paper screen from being exposed to direct sunlight, and at the same time, it is necessary to take ultraviolet protection measures, because charged particles will dry out under strong light for a long time, resulting in loss of activity and failure to refresh. This situation is irreversible. When designing electronic ink screen products, customers should pay attention to determine whether the use environment meets the requirements of electronic ink screens.



Ideally, with normal use, it can be refreshed 1,000,000 times (1 million times).



Power on the development board for a long time, after each refresh operation, it is recommended to set the screen to sleep mode or directly power off, otherwise, the screen may burn out when the screen is in a high voltage state for a long time.



Yes, but you need to re-initialize the electronic paper with software.



Technical Support

If you need technical support or have any feedback/review, please click the Submit Now button to submit a ticket, Our support team will check and reply to you within 1 to 2 working days. Please be patient as we make every effort to help you to resolve the issue.
Working Time: 9 AM - 6 PM GMT+8 (Monday to Friday)