逐步指导:如何驱动电子墨水屏 /第一篇
尊敬的各位客户,大家好!
我们的技术小组一直在全力开发墨水屏的教学项目,以期为您呈现一个从零开始驱动墨水屏的完整过程。我们从初学者的角度出发,旨在为您提供简单易懂的指导。
在上一期中,我们分享了关于电子纸显示屏的硬件知识,这部分内容得益于来自各位观众和客户的宝贵反馈,我们将持续整理并分享更多相关信息。
接下来的新系列将陆续推出,为您填补更多相关内容,敬请期待。感谢您对我们项目的关注和支持!
首先,您需要掌握一些硬件知识。
1、了解墨水屏的工作原理
墨水屏,学名电子纸,它背后的技术是一种“微胶囊电泳显示”技术。其基本原理是悬浮在液体中的带电纳米粒子受到电场作用而产生迁移。
电子墨水被涂布在一层塑料薄膜上,再贴覆上薄膜晶体管(TFT)电路,经由驱动IC控制,形成像素图形。
1)双色电子墨水原理
电子墨水由数百万个微胶囊所构成,微胶囊的大小约等同于人类头发的直径。每个微胶囊里含有电泳粒子──带负电荷的白色以及带正电荷的黑色粒子,悬浮于透明液体中。
利用正负相吸的原理,当电场接通时,该区块对应的黑或白粒子会移动至微胶囊的顶端,使用者在该区块上,就能看见白色或黑色。
2)三色电子墨水原理
三色电子墨水系统,特别适用于电子货架标签(简称ESL)应用。
三色电子墨水系统运作原理与双色系统类似,施加不同的电压,使不同颜色的粒子移动至上层,看见不同的颜色。三色系统在微杯技术架构下开发而成。
3)电子纸基本结构
a. 电子纸膜片
这是电子纸显示模组的核心材料,负责显示人眼实际看到的图案。
b. 底板
作为电子纸显示屏的像素电极(下电极),用于控制电子纸每个像素的黑白变化。底板有多种类型可选,包括PCB、FPC、TFT玻璃、PET等,
实际应用时可根据具体需求选择不同的底板。电子纸膜片可通过层压的方式贴合在底板上。
c. 驱动芯片
可根据控制指令和信号产生相应的逻辑电平和时序,用于控制底板每个像素(或段码)的工作时序和状态,并使电子纸能够显示所需图案。
d. 透明保护膜
一种高分子塑料薄膜,具有很强的防水汽透过性。用层压机将其紧密贴合在电子纸膜片与底板上面,可有效防止水汽侵入电子纸膜片,避免电子纸因受潮而损坏。
e. 封边胶
一种特殊的化学胶水,将其均匀涂在透明保护膜的四周边缘处,起到隔离水汽的作用。可避免水汽从透明保护膜四周渗入进去而对电子纸膜片造成损坏。
2、下一步准备您的开发板,单片机MCU
我们诚挚地推荐初学者选用Good Display系列的开发套件STM32、ESP8266、ESP32、ArduinoUNO,点击链接了解更多产品 www.good-display.cn
以STM32为例,当您拿到板子时,首要考虑的是接线问题。
这是我所采用的连接方式,VCC电源和GND接地是固定的,而其他连接根据您的实际需求来灵活定义。只要您的程序按照这些定义来编写,就能保证正常运行。
3、重点在于理解为何选择连接这几个引脚,以及它们各自的功能代表着什么。
a. 首先,电源和接地是至关重要的,因为MCU的工作必须有稳定的电源供给。
b. 我们需要明确的是,电子墨水屏和任何主控都是采用SPI通信协议(这里不讨论并口的屏幕)
DIN代表了MOSI(主设备(单片机)输出,从设备(墨水屏)输入,这个很好理解,单片机要给墨水屏发送内容显示)
CLK代表的就是时钟(数据传输双方都要约定在同一个频段上进行)
c. CS代表的是片选,低电平有效
d.DC是数据引脚,代表 数据/命令 读写选择,高电平为数据,低电平为命令
e. RST是墨水屏复位引脚,您可以这么理解,墨水屏重新更新画面时需要掉电喘口气才能继续。
f. BUSY顾名思义就是忙,用来检测墨水屏工作状态是busy还是idle,如果处于busy状态,MCU是没办法对墨水屏进行任何操作的。
接下来介绍硬件接口程序
1、首先您需要把我们已经定义好的硬件接口在程序中体现出来
void EPD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);
//CS-->PD8 SCK-->PD9 SDO--->PD10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; //Port con
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
// D/C--->PE15 RES-->PE14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15; //Port configuration
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
// BUSY--->PE13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
2、接下是各个硬件接口的程序
a、首先就是通信方式SPI
SPI时序图
void SPI_Write(unsigned char value)
{
unsigned char i;
for(i=0; i<8; i++)
{
EPD_W21_CLK_0;
if(value & 0x80)
EPD_W21_MOSI_1;
else
EPD_W21_MOSI_0;
value = (value << 1);
EPD_W21_CLK_1;
}
}
这段代码实现的是通过SPI通信协议写数据,每次写一个字节也就是8位所以利用了for循环,
根据上边的时序图,循环8次,这里的 value & 0x80就是在判断最高位是1还是0,
是1 代表MOSI=1,是0 代表MOSI=0。因为SPI写数据是从最高位开始但是数据保存在最低位,
所以要往左移一位即value = (value << 1)这样循环8次就得到了一个字节。
b: CS和DC了
CS和DC就是要用到写数据和写命令里(时序图中CS低电平的时候开始写数据或者命令;DC=0的时候写命令,DC=1的时候写数据。结束后CS重新回到高电平。)
void EPD_W21_WriteCMD(unsigned char command)//写命令
{
EPD_W21_CS_0;
EPD_W21_DC_0; // command write
SPI_Write(command);
EPD_W21_CS_1;
}
void EPD_W21_WriteDATA(unsigned char data)//写数据
{
EPD_W21_CS_0;
EPD_W21_DC_1; // data write
SPI_Write(data);
EPD_W21_CS_1;
}
c: RST通常只用在初始化部分,0,1代表电平
EPD_W21_RST_0; // Module reset
delay_xms(10);//At least 10ms delay
EPD_W21_RST_1;
delay_xms(10); //At least 10ms delay
d:读取BUSY的电平,busy=1代表忙状态,就会一直在while(1)的死循环里;busy=0才会跳出循环执行接下来的程序
void Epaper_READBUSY(void)
{
while(1)
{ //=1 BUSY
if(isEPD_W21_BUSY==0) break;;
}
}
如果您有任何问题,欢迎访问此链接 www.eink-display.cn 给我们留言,我们将尽快为您答疑解惑。
在下一期更新中,我们将分享快刷、局刷和全刷的初始化代码。敬请期待!
相关资讯
您可以点击此处或者导航栏中的企业定制服务,快速提交您对我们的需求!我们会及时回复并跟进处理。
扫二维码用手机看