13.3inch e-Paper HAT

From Waveshare Wiki
Jump to: navigation, search
13.3inch e-Paper HAT
13.3inch e-Paper HAT

13.3inch e-Paper e-Ink Raw Display, 1600 × 1200, Black / White, 16 Grey Scales




Primary Attribute
Category: OLEDs / LCDs, LCD, e-Paper
{{{userDefinedInfo}}}: {{{userdefinedvalue}}}
Brand: Waveshare
International: Website
Chinese: 官方中文站点
Onboard Interfaces
Related Products


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


13.3inch E-Ink display HAT for Raspberry Pi, 1600 × 1200 resolution, 16 grayscales, USB/SPI/I80/I2C interface



  • No backlight, keeps displaying last content for a long time even when power down
  • Low power consumption, basically power is only required for refreshing
  • Compatible with Raspberry Pi Zero/Zero W/Zero WH/2B/3B/3B+
  • USB/SPI/I80/I2C interface, for connecting with host boards like Raspberry Pi/Nucleo, etc.
  • Comes with development resources and manual (examples for Raspberry Pi/STM32)


  • Operating voltage: 5V
  • Interface: USB/SPI/I80
  • Outline dimension: 285.80mm × 213.65mm × 0.78mm
  • Display size:270.40 × 202.80mm
  • Dot pitch: 0.169 × 0.169mm
  • Resolution: 1600 × 1200 pixels
  • Display color: black, white
  • Gray scale: 2-16 (1-4 bit)
  • Full refresh time: <1s
  • Total refresh power: 1.2W(typ.)
  • Total standby power: 0.1W(typ.)
  • Viewing angle: >170°

Working principle

This product is an E-paper device adopting the image display technology of Microencapsulated Electrophoretic Display, MED. The initial approach is to create tiny spheres, in which the charged color pigments are suspending in the transparent oil and would move depending on the electronic charge. The E-paper screen display patterns by reflecting the ambient light, so it has no background light requirement. Under ambient light, the E-paper screen still has high visibility with a wide viewing angle of 180 degrees. It is the ideal choice for E-reading. (Note that the e-Paper cannot support updating directly under sunlight)

How to use

Working with Windows PC

  • Connect display to IT8951 driver board as below

10.3inch e-Paper 3.jpg

  • Connect USB interface of IT8951 driver board to PC, then connect PWR ONLY interface of IT8951 to 5V power adapter.
The refresh consumption of e-Paper is high, therefore, external power supply is required. You must first connect data cable then the power, otherwise, e-Paper cannot be recognized properly.


  • Check option "AutoSet", then click "Open File" to open one picture for display. Browse diagram will be opened, and you should click "OK"


  • Click "display" to refresh the picture


Working with Raspberry Pi

  • Step1: Hardware connection
Insert IT8951 driver board to GPIO of Raspberry Pi, Connect e-Paper to driver board
10.3inch e-Paper 4.jpg
You can also connecting by wires
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 stats pin (Low when busy)
  • Step2: Make sure you have switched the sail switch to SPI mode
  • Step3: Download and install BCM2835 libraries to your Raspberry Pi
You can also download the newest bcm2835 library from its official website http://www.airspayce.com/mikem/bcm2835/
Copy the library you download to Raspberry Pi and install it withe commands below. You can also following the instruction on its website above
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
  • Step4: Enable SPI Interface of Pi
Open a terminal and type the following command:
sudo raspi-config
Choose Interface Option->SPI->Yes
  • Step5: Download Demo codes of 10.3inch e-Paper HAT and test

Method 1: Download from our official website(recommended)

sudo apt-get install p7zip-full
sudo wget  https://www.waveshare.net/w/upload/8/80/IT8951_20200319_Release.7z
7z x IT8951_20200319_Release.7z -O./IT8951
cd IT8951/
sudo make clean
sudo make

Method2: Download from github

git clone https://github.com/waveshare/IT8951-ePaper.git
cd IT8951-ePaper/Raspberry
sudo make clean
sudo make -j4

Check the VCOM value on the FPC


Add the VCOM value as paramter and test the e-Paper, and this model is mode 0.

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

1) First, the r-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

Because IT8951 will cost big size of RAM, some of STM32 cannot support without external SDRAM device. So we here use Open429I as test board, Open429I integrates IS42S16400J (64-MBIT) SDRAM,has full memory to drive the 9.7inch e-paper.

Working with STM32, you can use SPI, I80 or I2C interface. SPI is simple and only a few of GPIOs are used, its speed can also meet the requirement of most applications. I80 is also simple and fast, however, it need to use lots of GPIO. I2C is every slow, which we don't recommend.


1) Hardware connection

Connect to STM32F429IGT6 (SPI)
IT8951 STM32 Description
5V 5V 5V Power input
GND GND Ground
MISO PE13 Data output
MOSI PE14 Data input
SCK PE12 Clock input
CS PE11 Chip select (Low active)
RST PC5 Reset (Low for reset)
HRDY PA7 BUSY state output (Low for busy)

2) Set the DIP switch to SPI mode


3) Download demo code and test

You can download the Demo code

Open the project with keil: Open429I-C-6-IT8951-Demo\Project\6-IT8951\MDK-ARM\Project.uvproj

Compile it, then open IT8951.h, check if SPI mode is enabled. Compile it again and download to your board.


After downloading, the information will be printed as below (115200, 8N1)



1) Hardware connection

Connect to STM32F429IGT6 (I80)
IT8951 STM32 Description
Vcc 5V 5V Power input
GND GND Ground
DBUS0~DBUS15 PB0~PB15 Data pins
HWE PC1 Write enable (Low active)
D/C PC7 Data/Command (Low for command)
CSEL PC6 Chip select (Low active)
HRD PC3 Read enable (Low for active)
RST PC0 Reset (Low for reset)
BUSY PA7 Busy state output (Low for busy)

2) Set the DIP switch to I80 mode


3) Display with demo code

You can download the Demo code

Open the project with keil: Open429I-C-6-IT8951-Demo\Project\6-IT8951\MDK-ARM\Project.uvproj

Compile it, then open IT8951.h, check if I80 mode is enabled. Compile it again and download to your board.


Information are printed to serial port as below (115200, 8N1)


Display pictures

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

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

1) Prepare a BMP image, resize the picture to 800*600

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


3) Click Image -> Convert to ->Gray256(8 BPP)


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

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


6) Add the C file to 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_800_600                                           *
* Dimensions:  800 * 600                                             *
* NumColors:   256                                                   *
*                                                                    *
#include <stdlib.h>
#include "GUI.h"
  #define GUI_CONST_STORAGE const
extern GUI_CONST_STORAGE GUI_BITMAP bmzoo_800_600;
*       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_800_600[] = {
  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,
static GUI_CONST_STORAGE GUI_LOGPALETTE _Palzoo_800_600 = {
  256,  // Number of entries
  0,    // No transparency
  800, // xSize
  600, // ySize
  800, // BytesPerLine
  8, // BitsPerPixel
  _aczoo_800_600,  // Pointer to picture data (indices)
  &_Palzoo_800_600   // Pointer to palette

7) Modify the codes

static GUI_CONST_STORAGE unsigned char _aczoo_800_600[] = {

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

const unsigned char zoo_800_600[] = {

8) Modify related codes in IT8951.C as below

extern const unsigned char zoo_800_600[];
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_800_600[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);

【Note】Guides provided here are all about how to use the 13.3inch e-Paper HAT (D). If you have any question about how to modify and develop you own codes, please refer to resources of IT8951 #Resources


Hardware connection

For different e-paper screen models, due to the product upgrades and improvements, there may be some differences in hardware connection compared with the picture. So please directly refer to the FPC line pin number:

  • Check example 1:


  • Check example 2:


DIP switch

  • We currently don't recommend to use I2C interface to driver, it is recommended to use USB, I80, or SPI interface driver
  • Whether you are using USB interface driver, I80 interface driver, or SPI interface driver, you need to turn the DIP switch(marked in the red frame in the picture below) to the ON position on the right, as shown in the picture below:


  • If you use USB to connect the driver board to the PC, when the E-LINK-TCON-DEMO cannot recognize IT8951, please check whether the two DIP switches marked in the red frame are connected. Only the two DIP switches marked are both connected, the driver board can be recognized by the PC.

SPI or I80 driver

  • If you use a USB driver, you don’t need to pay attention to the DIP switch in the green frame as shown in the picture below.
  • If you want to use the SPI driver or the I80 driver, you need to pay attention to the dial switch in the green frame as shown in the picture below. If it is dialed to the I80 side, it means using the I80 driver, if it is dialed to the SPI side, it means using SPI driver:


Codes Description

New Features

  • 1.Update 16 grayscale image in 4bpp mode to reduce the data size while transmitting via SPI.
  • 2.Speedup the SPI transmitting. Note that this feature can only valid in Raspberry Pi, it is invalid in Pi 4 because of the improving of CPU.
  • 3.Reduce the update time to 1/4. The last version of Demo codes cost 10s to update a picture on 10.3inch e-Paper (D) in GC16 Mode, with the new version, it is reduce to 3s.
  • 4.Fix the bug that memory leaks problem which is occurs after open a bmp file.
  • 5.Add 1bpp, 2bpp, 3bpp, 4bpp modes support.
  • 6.Add A2 Mode (only work for 1bpp mode)
  • 7.Add GUI functions (Draw point, line, circle, rectange and string display). Supports changing gray.
  • 8.Add GIF file displaying, you can storage pictures to buffer of IT8951, and then transmit them to e-Paper for displaying. The update rate is up t o 7fps by delecting the transmittng process between RPi and IT8951.
  • 10.Add fps testing, it can be used to test the fps when update with different windows size in different modes.
  • 11.Enhande the driver, to fix the buf of blurred display in partial area.
  • 12.Support bytes alignment for 6inch ePaper HAT and 6inch HD ePaper HAT in 1bpp mode.
  • 13.Add VCOM setting and clear ePaper function (running Demo codes directly) to protect ePaper from damaging.
  • 14.Improving the structure of driver codes for higher code readablity.

Examples Description

1 Display 16 bars in grayscale order

  • Function:DisplayColorPaletteExample
  • This function is sued to display 16 bars in different grayscale. It uses 4bpp in GC16 mode.

2 Drawing

  • Function: DisplayCharacterPatternExample
  • This function is sued to draw point, line, circle, rectange as well as display string. It suppots 1bpp, 2bpp, 4bpp and 8bpp mode. If you use 1bpp, it can also supports the A2 update mode.

3 Display BMP image

  • Function:DisplayBMPExample
  • This function is used to display a BMP image. It suppots 1bpp, 2bpp, 4bpp and 8bpp mode. If you use 1bpp, it can also supports the A2 update mode.

4 Update ePaper in A2 mode

  • Function:DynamicRefreshExample
  • This function is used to update ePaper in A2 Mode.

5 Display GIF image

  • Function:DynamicGIFExample
  • This function is used to display GIF image. We divide a GIF file to seven BMP images, and save them to buffer of IT8951 with continuous address. This demo features the fastest fps of the ePaper (about 7fps).

6 FPS Testing

  • Function:CheckFrameRateExample
  • This function is sued to test fps in different modes. The demo will auot-caculate the update time of 10 frames and the fps.。

Related Description

1 Mode

The firmware in IT8951 Driver board are different among differnt types of e-Paper. And the update mode maybe different among these e-Paper. For more information abou the update modes, you can refer to IT8951 Mode Description. There are three modes: INIT, GC16 and A2.

Mode Description 6inch/6inch HD 7.8inch/9.7inch/10.3inch
INIT This mode is used for clearing the display. If you use A2 mode for updating, we recommend you use the INIT mode to clear display after updating several times. Mode0 Mode0
GC16 This mode is used for updating ePaper with 16 grayscale. GC16 mode can provide best dispaly effect. Mode2 Mode2
A2 A2 mode can only support 2 grayscale, however, the update 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 decide 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;

2 bpp Description

bpp(Bits Per Pixel), it stands of the bits costed by every pixel. The current versions of ePaper supports 1bpp, 2bpp, 4bpp and 8bpp modes.

  • 1bpp
  • 1bit cost by every pixel
  • It support 2 grayscale displaying. supports A2 mode
  • Evey byte carries 8 pixels
  • The pixel is saved in byte in Big-endian format:


  • The data saved in IT8951 with Little-endian format, you need to convert data before saving.

  • 2bpp
  • 2bits cost by evey pixel
  • Supports 4 (2^2=4) grayscale
  • Evey byte carries 4 pixels
  • The pixel is saved in byte in Big-endian format:


  • The data saved in IT8951 with Little-endian format, you need to convert data before saving.
  • 4bpp
  • 4bits cost by evey pixel.
  • Supports 16(2^4=16) grayscale
  • Every byte carries 2 pixels
  • The pixel is saved in byte in Big-endian format:


  • The data saved in IT8951 with Little-endian format, you need to convert data before saving.
  • 4bpp mode is recommended for display 16 grayscale image. It reduce a half of data by comparing to 8bpp.

  • 8bpp
  • 8bits cost by evey pixel
  • Supports 256 (2^8=256) grayscale. However, IT8951 only use the first four bits for 16 grayscale displaying.
  • Every byte carries one pixel
  • The pixel is saved in byte in Big-endian format:


  • The data saved in IT8951 with Little-endian format, you need to convert data before saving.
  • When you convert a original image for gray image, the data of evey pixel cost one byte (8 bits). You can compressed the data according to actual data format. For example: if you want to convert data for 2bpp mode, you can just use the first 2bits from on byte (original gray image). The exmaples below also convert the data format 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);

3 4-byte alignment description

In the actual test, we found that for those 3 products: 6inch e-Paper HAT, 6inch HD e-Paper HAT, and 6inch HD touch e-Paper HAT, when refreshing in 1bpp mode, we need to make the starting point of the refresh area X and the refresh width W to perform 4-byte (32bit) alignment, otherwise, the image in the refresh area will display abnormally. The specific operation is shown in the following program:

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;

4 SPI transmission speed description

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

  • Raspberry Pi 3 can still transmit normally when the frequency is divided by 16, but the frequency by 16 is the fastest speed for Pi3.
  • When the frequency of the Raspberry Pi 4B uses a divide by 16, the SPI rate is too high and transmission errors will occur. Therefore, the SPI of the Raspberry Pi 4B can only use a divide by 32 at the fastest.
  • In the BCM2835 library manual, for different Raspberry Pi versions and different clock divisions, the corresponding frequency description is shown in the following figure:


  • If you need to obtain the most suitable SPI transmission speed, you need to select a different SPI clock divider according to your Raspberry Pi version, as shown in the following program and its notes:
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:*/

5 Enhance driving capability

In some cases, due to the long FPC cable and other reasons, the ink screen display will be partially blurred. In this case, you can try to increase the driving capability to effectively solve the problem of the screen display blur.

You can check the demo as below:

    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 you use the E-LINK-TCON-DEMO software on a PC (Windows) to refresh the ink screen through the USB interface, you can modify the register value in the following ways to enhance the drive capability:

  • Step1: Read the data of register address 0x18000038.

13.3inch epaper 01.png

If the read data of register address 0x18000038 is 0x02, it means that the drive capability has not been enhanced yet.

  • Step2: Modify the data of register address 0x18000038

13.3inch epaper 02.png

Modify the data of register address 0x18000038 to 602 to enhance the driving capability.

  • Step3: Check the data of register address 0x18000038.

13.3inch epaper 03.png

Check whether the data of the register address 0x18000038 is modified successfully. If the data of this address is 0x602, it means that the drive capacity has been enhanced.

6 Use the correct VCOM value

The VCOM value of each model of the e-paper is marked on the FPC cable. Make sure that you have used the correct VCOM value when you running the demo. Otherwise, the e-paper will deteriorate by working for a long time under the wrong VCOM value.


If you require technical support, please go to the Support page and open a tickets.