注意:由于9.7inch e-paper尺寸比较大,相对的,玻璃面板和FPC排线都非常脆弱,在研发是需要特别小心,以免造成不必要损坏。研发调试时,建议在FPC排线处贴透明胶加固。另外,不要带电插拔e-paper。
注:如果客户希望在Windows上使用USB接口对e-Paper进行开发,需要联系微雪团队,签NDA才可以拿到E-LINK-TCON-DEMO源码。
也可以通过杜邦线进行连接,具体如下表:
IT8951引脚 | Pi BCM引脚 | 描述 |
---|---|---|
5V | 5V | 电源正(5V电源输入) |
GND | GND | 电源地 |
MISO | P9 | SPI通信MISO引脚 |
MOSI | P10 | SPI通信MOSI引脚 |
SCK | P11 | SPI通信SCK引脚 |
CS | P8 | SPI片选引脚(低电平有效) |
RST | P17 | 外部复位引脚(低电平复位) |
HRDY | P24 | 忙状态输出引脚(低电平表示忙) |
- wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gz
- tar zxvf bcm2835-1.60.tar.gz
- cd bcm2835-1.60/
- sudo ./configure
- sudo make
- sudo make check
- sudo make install
- # 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
安装完成。
树莓派采用SPI驱动IT8951继而驱动墨水屏,首先需要开启SPI,开启方法如下:
打开终端命令行,输入命令:
- sudo raspi-config
然后依次执行:Interfacing Options->P4->SPI->Yes,如下图所示:
下载并编译Demo程序,执行如下命令进行下载并编译:
- git clone https://github.com/waveshare/IT8951-ePaper.git
- cd IT8951-ePaper
- make
从FPC线上查看VCOM数值,例如下图:
执行程序,并且注意VCOM值作为输入参数
- sudo ./epd -2.51
1) 首先依次局部刷新16条灰度条
2) 接着演示画线,画圆,画矩形,写字符,写数字的示例
3) 然后分别演示1bp,2bp,4bp的模式显示bmp图片的示例
4) 紧接着演示A2模式快速刷新的效果
5) 接着显示一张gif动画
6) 然后演示一个统计帧率的Demo
7) 最后将屏幕采用Init模式刷白,以便仓库长期存储
驱动接口选择
驱动板选择
由于IT8951需要占用比较大的RAM空间,一般STM32单片机都无法直接满足,需要外加SDRAM之类的芯片进行RAM扩展。这里测试,我们使用Open429I作为测试板,其板载的IS42S16400J (64-MBIT) SDRAM,已经完全可以满足驱动9.7inch e-paper HAT了。
1) 硬件连接
IT8951引脚 | STM32引脚 | 描述 |
---|---|---|
5V | 5V | 电源正(5V电源输入) |
GND | GND | 电源地 |
MISO | PE13 | SPI通信MISO引脚 |
MOSI | PE14 | SPI通信MOSI引脚 |
SCK | PE12 | SPI通信SCK引脚 |
CS | PE11 | SPI片选引脚(低电平有效) |
RST | PC5 | 外部复位引脚(低电平复位) |
HRDY | PA7 | 忙状态输出引脚(低电平表示忙) |
我们提供了测试的DEMO程序
下载后,解压,使用keil打开工程,目录地址:Open429I-C-IT8951-Demo\Project\9.7-IT8951\MDK-ARM\Project.uvproj。
点击编译,之后打开IT8951.h,确定定义了IT8951_Interface_SPI,点击重新编译,下载。几秒后正常可以看到e-paper开始循环显示图片。
IT8951引脚 | STM32引脚 | 描述 |
---|---|---|
DBUS0~DBUS15 | PB0~PB15 | 数据接口 |
HWE | PC1 | 写使能(低电平有效) |
D/C | PC7 | 数据/命令(低电平表示命令) |
CSEL | PC6 | 片选使能(低电平有效) |
HRD | PC3 | 读使能(低电平有效) |
RST | PC0 | 外部复位引脚(低电平复位) |
BUSY | PA7 | 忙状态输出引脚(低电平表示忙) |
GND | GND | 电源地 |
VCC | 5V | 电源正(5V电源输入) |
我们提供了9.7inch e-Paper HAT的测试DEMO程序
下载后,解压,使用keil打开工程,目录地址:Open429I-C-IT8951-Demo\Project\9.7-IT8951\MDK-ARM\Project.uvproj。
点击编译,之后打开IT8951.h,确定定义了IT8951_Interface_I80,点击重新编译,下载。几秒后正常可以看到e-paper开始循环显示图片。
为了使DEMO程序尽可能简单和方便移植,我们并没有在DEMO程序中加入文件系统,所以DEMO程序中是直接使用显示矩阵的方式进行显示图片的。
也就是我们需要添加新图片时需要先将图片转为数据矩阵(数组),在通过程序进行显示。以下简单的介绍如何将图片转化为数据矩阵并进行显示。
- /*********************************************************************
- * 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"
- #ifndef GUI_CONST_STORAGE
- #define GUI_CONST_STORAGE const
- #endif
- extern GUI_CONST_STORAGE GUI_BITMAP bmzoo;
- /*********************************************************************
- *
- * 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,
- 0xACACAC, 0xADADAD, 0xAEAEAE, 0xAFAFAF,
- 0xB0B0B0, 0xB1B1B1, 0xB2B2B2, 0xB3B3B3,
- 0xB4B4B4, 0xB5B5B5, 0xB6B6B6, 0xB7B7B7,
- 0xB8B8B8, 0xB9B9B9, 0xBABABA, 0xBBBBBB,
- 0xBCBCBC, 0xBDBDBD, 0xBEBEBE, 0xBFBFBF,
- 0xC0C0C0, 0xC1C1C1, 0xC2C2C2, 0xC3C3C3,
- 0xC4C4C4, 0xC5C5C5, 0xC6C6C6, 0xC7C7C7,
- 0xC8C8C8, 0xC9C9C9, 0xCACACA, 0xCBCBCB,
- 0xCCCCCC, 0xCDCDCD, 0xCECECE, 0xCFCFCF,
- 0xD0D0D0, 0xD1D1D1, 0xD2D2D2, 0xD3D3D3,
- 0xD4D4D4, 0xD5D5D5, 0xD6D6D6, 0xD7D7D7,
- 0xD8D8D8, 0xD9D9D9, 0xDADADA, 0xDBDBDB,
- 0xDCDCDC, 0xDDDDDD, 0xDEDEDE, 0xDFDFDF,
- 0xE0E0E0, 0xE1E1E1, 0xE2E2E2, 0xE3E3E3,
- 0xE4E4E4, 0xE5E5E5, 0xE6E6E6, 0xE7E7E7,
- 0xE8E8E8, 0xE9E9E9, 0xEAEAEA, 0xEBEBEB,
- 0xECECEC, 0xEDEDED, 0xEEEEEE, 0xEFEFEF,
- 0xF0F0F0, 0xF1F1F1, 0xF2F2F2, 0xF3F3F3,
- 0xF4F4F4, 0xF5F5F5, 0xF6F6F6, 0xF7F7F7,
- 0xF8F8F8, 0xF9F9F9, 0xFAFAFA, 0xFBFBFB,
- 0xFCFCFC, 0xFDFDFD, 0xFEFEFE, 0xFFFFFF
- };
- static GUI_CONST_STORAGE GUI_LOGPALETTE _Palzoo = {
- 256, // Number of entries
- 0, // No transparency
- &_Colorszoo[0]
- };
- GUI_CONST_STORAGE GUI_BITMAP bmzoo = {
- 1200, // xSize
- 825, // ySize
- 1200, // BytesPerLine
- 8, // BitsPerPixel
- _aczoo, // Pointer to picture data (indices)
- &_Palzoo // Pointer to palette
- };
- static GUI_CONST_STORAGE unsigned char _aczoo[] = {
将以上代码修改为如下(数组名可自定义):
- const unsigned char zoo_1200_825[] = {
- 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];
- }
- IT8951WaitForDisplayReady();
- //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);
- }
不同墨水屏型号,由于产品的升级与改进,硬件连接与图片相比,可能存在一定的差异,具体以FPC线引脚标号为准:
IT8951针对不同分辨率的屏幕刷入了不同的固件,不同的固件有不同的刷新模式,详情见模式说明,在例程中用到的模式有:INIT模式,GC16模式,A2模式
下面对相关模式进行简要说明:
模式 | 特点 | 6inch/6inch HD | 7.8inch/9.7inch/10.3inch |
---|---|---|---|
INIT | 用于擦除显示内容,清屏,多次A2模式刷新后建议采用INIT模式清屏 | Mode0 | Mode0 |
GC16 | 采用16级灰度更新屏幕显示内容,显示效果最好 | Mode2 | Mode2 |
A2 | 只能更新黑白2级灰度,但刷新速度最快 | 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;
- }else{
- //default set to 6 as A2 Mode
- A2_Mode = 6;
- }
bpp(Bits Per Pixel),表示的是一个像素点所占用的bit数,目前,所有屏幕支持1bpp,2bpp,4bpp,8bpp模式刷新。
- UDOUBLE Addr = X * (Paint.BitsPerPixel) / 8 + Y * Paint.WidthByte;
- switch( Paint.BitsPerPixel ){
- case 8:{
- Paint.Image[Addr] = Color & 0xF0;
- break;
- }
- case 4:{
- Paint.Image[Addr] &= ~( (0xF0) >> (7 - (X*4+3)%8 ) );
- Paint.Image[Addr] |= (Color & 0xF0) >> (7 - (X*4+3)%8 );
- break;
- }
- case 2:{
- Paint.Image[Addr] &= ~( (0xC0) >> (7 - (X*2+1)%8 ) );
- Paint.Image[Addr] |= (Color & 0xC0) >> (7 - (X*2+1)%8 );
- break;
- }
- case 1:{
- Paint.Image[Addr] &= ~( (0x80) >> (7 - X%8) );
- Paint.Image[Addr] |= (Color & 0x80) >> (7 - X%8);
- break;
- }
- }
实际测试中发现:对于6inch e-Paper HAT, 6inch HD e-Paper HAT, 6inch HD touch e-Paper HAT这3款产品,在使用1bpp模式刷新时,需要将刷新区域的起点X,刷新宽度W,进行4字节(32bit)对齐,否则,刷新区域图像将显示异常,具体操作如下面程序所示:
- 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);
- }else{
- In_4bp_Refresh_Area_Width = Panel_Width;
- }
- X_Start = Min_X < 32 ? 0 : Min_X - (Min_X % 32);
- Debug("X_Start:%d\r\n",X_Start);
- X_End = ( Max_X + (32 - (Max_X % 32)) ) > Touch_Pannel_Area_Width ? ( Max_X - (Max_X % 32) ) : ( Max_X + (32 - (Max_X % 32)) );
- Debug("X_End:%d\r\n",X_End);
- Y_Start = Min_Y;
- Debug("Y_Start:%d\r\n",Y_Start);
- Y_End = Max_Y;
- Debug("Y_Start:%d\r\n",Y_End);
- Width = X_End - X_Start;
- if(Width<=0){
- Width = 32;
- }
- Debug("Width:%d\r\n",Width);
- Height = Y_End-Y_Start;
- if(Height<=0){
- Height = 32;
- }
- Debug("Height:%d\r\n",Height);
由于树莓派3和树莓派4的CPU主频的差异:
- 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:*/
- /*http://www.airspayce.com/mikem/bcm2835/group__constants.html#gaf2e0ca069b8caef24602a02e8a00884e*/
某些情况下,由于FPC线过长等原因,会导致墨水屏显示局部模糊,此时,尝试增强驱动能力,可有效解决屏幕显示模糊的问题。
具体你程序如下图所示:
- #if(Enhance)
- Debug("Attention! Enhanced driving ability, only used when the screen is blurred\r\n");
- Enhance_Driving_Capability();
- #endif
- /******************************************************************************
- 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);
- }
如果在PC(Windows)上使用E-LINK-TCON-DEMO软件,通过USB接口来刷新墨水屏,则可以通过以下方式修改寄存器值来增强驱动能力:
若读取的寄存器地址0x18000038的数据为0x02,说明还未增强驱动能力
将寄存器地址0x18000038的数据修改为602,增强驱动能力
检查寄存器地址0x18000038的数据是否修改成功,若该地址的数据为0x602,说明已经增强驱动能力,在该状态下刷屏,可避免某些情况下,如FPC线过长,生产批次不同等原因,造成显示模糊的现象。
每一块墨水屏的VCOM值均有一定的差异,每一块墨水屏的VCOM值在FPC排线上有标注,在每一次执行程序时,确保使用了正确的VCOM值,否则,长期使墨水屏工作在错误的VCOM值下,显示效果将变差。
上面仅说明了9.7inch e-Paper HAT (D)的使用方法,具体如何修改和进行二次开发,用户需要自行查阅相关代码。
以下提供IT8951的相关资料: