E Ink模块驱动原理与评测 开发板使用 转载自网络

本文转自:http://www.21ic.com/evm/evaluate/MCU/201802/752221.htm

先来两张效果图:

image1.jpg

图 使用PSoC 6来驱动EInk

image2.jpg

图 使用另外一款开发板驱动EInk

近几年来,有感于中国人读书的数量较其他国家少(比如日本,德国等发达国家),不管是国家还是地方政府相继推出了不少倡导读书的活动.如"读书年","读书月","全民阅读",等等.不过起到的效果如何还是要看个人的自身觉悟情况.归根结底阅读还是属于个人行为.就作者本人的体会来讲,从小是很喜欢读书.甚至到了干扰正常学习工作的程度.但是自从有了个人电脑,智能手机,读书时间便直线下降.因为电子版本的资源比起纸质版本的更加及时也更加丰富,导致本人有很长一段时间就没有摸过书.相信这也是我们这一代人共同的体验.真正让本人重拾书本认真阅读的就是电纸书这个技术.2011年本人买了第一个电纸书,从此收不住了.到目前为止,作者拥有6,7个电纸书,不同的电纸书存放不同的书籍种类,如有的放小说,有的放政治历史,有的放外文,有的放时事等等.电纸书阅读给本人的体验就是看起来很舒服,如果配上了均匀的背光,看起来比真正的纸质书还要赏心悦目.当然这是本人的一家之言,也有人认为还是纸质的书好.不论如何,把电纸书技术列作本时代最伟大的发明之一不为过.

本文的主题就是评测Cypress PSoC 6 Pionner Kit配套的EInk模块.该模块是Cypress组装的,核心器件由龙亭新技生产,分辨率是264x176,显示密度是117 dpi.由于PSoC 6双核,高性能,低功耗的特点,使得其非常适合驱动这种显示器件.当然在探究了其原理之后,后面将尝试移植驱动代码到其他器件上以验证这个学习过程.需要指出的是EInk模块不仅仅可以用作电纸书的面板,事实上目前业内应用的不少器件都可以使用EIink来替代以降低功耗.比如很多监控仪器的参数显示面板,如果使用LCD/OLED这种技术,电源不能停,但是其显示更新的频率其实很低,如每天更新只有几次甚至几天一次.如果换成仅仅更新需要电源,维持内容不需要电源的EInk,不仅功耗可大大降低,稳定性也会大大增强.

EInk硬件

先将CY8CKIT-028-EPD原理图的几个部分分别贴出来.

image3.png

图 外部接口

按照Arduino接口来分布的,除了I2C是其他外设,其余引脚是EInk模块控制信号.除了SPI的4根线之外,还有电源控制,边界控制,放电控制,复位信号,状态信号.

image4.png

图 电平转换

EINK模块可以被不同的主控板控制,VCC/VDD电压范围2.3v~3.6v,通过电平转换来进行电压匹配.

image5.png

图 电源控制

因为维持显示内容不需要电源,所以不更新内容时, 可以把COG 驱动power off当需要更新显示内容时,再把COG驱动power on.这对于其他技术的显示器来说是巨大的功耗节省.

image6.png

图 Border控制

边界控制:当进行电子墨水颗粒处理的时候用来保持边框清晰度的一种控制信号,利用时序控制引脚来控制此信号.

image7.png

图 Discharge控制

放电控制就是在更新完毕后,将EInk驱动的电容上的电荷放掉以进一步减少功耗.

image8.png

图 核心模块

上图是EINK模块的显示原理图,也就是最终的显示面板.除了Border信号之外,其余信号跟一般的显示器也差不多.这是因为这个驱动器本身也有COG控制IC以简化外围驱动软硬件设计.

Cypress的这个模块除了EInk之外还有其他几个器件:Motion传感器,热敏电阻与PDM接口的麦克风.这些器件与PSoC 6的配合也是值得一写的,权且放在后面的文章中介绍,此文对它们暂且不题.

驱动方式

如何控制这个显示器,也就是如何控制其内置COG (Chip On Glass) 驱动控制IC,新亭原厂提供了驱动例程.大致顺序是先将内容放到COG控制IC的内存(这个内存(memory)可以是图像buffer,SRAM或者Flash)中, 接着给COG驱动上电并且初始化COG驱动,然后按照特定的显示数据格式将存储在IC内存中的内容发送到EPD(E-Paper Dispaly)显示.

更新EPD显示内容的三种方式:

· 4步;

· 2 步;

· 部分更新;

其中4步更新是最耗时的,但是显示效果也最好(残影少).2步更新是省去了其中两步,部分更新就是省去了大多数操作.如果原来显示的内容与新内容相差过大,则需要用4步更新,否则酌情减少步骤.当然所需要的更新时间与显示效果是一个Trade-Off关系,需要程序员折中处理.一般的电纸书应用这样做的:第一次显示某本书使用4步更新,之后每页纸进行部分更新,若干页后进行2步更新,过了更长的阶段后再进行一次4步更新.对于4步更新,过程是这样的:

image9.png

图 4步更新

注意因为这样的更新方式,所以每次显示都需要保持上次的内容以作取反之用.2步更新法就是省去了取反的过程,部分更新法则是直接显示新内容.本文所使用的显示器是264x176的点阵,无灰阶,则每个Frame的显存为:

264 * 176 = 46464 Bits / 8 = 5808 Bytes

EPD更新显示内容方式的介绍应该是建立在存储在同一内存的两帧数据,之前显示内容变更为新的显示内容(Previous Display-> New Dispaly)之上.所以需要两个Frame,那么显存就是10KB以上了,另外驱动的过程中也需要19KB以上的中间缓存,为什么需要两个Frame呢?故此在选用主控芯片时需要考虑到显存的尺寸.

EPD驱动流程图如下:

image10.png

图 流程图

EPD更新周期内的信号控制图:

image11.png

图 信号波形

使用PSoC 6驱动EInk

如上文所述,EInk的特点是保持显示内容不需要电源,但是更新显示内容时,不停地需要处理器来做控制与查询.这种任务比较适合于低功耗的内核,比如PSoC 6中的Cortex M0+内核,此例中Cortex M4没有用武之处,所以干脆就没有使能.

顶层设计图:

image12.png

图 顶层设计

包括SPI口为通信口,定时器用来产生1ms的定时Tick,其余几个IO口为通用IO.

image13.png

图 SPI模组配置

image14.png

图 更新定时器配置

这个定时器的主要作用是提供1ms的Tick计时,实际上任何可以提供1ms的tick的定时器都可以用,比如内核中的SysTick.这里只是为了展示如何配制通用定时器.

至于要显示的资源与内容,因为该显示器的点阵与内存的对应是逐行对应,所以取模时使用横行取模,字节正序即可. CYPRESS提供的EINK例程中支持两种大小字体,分别是CY_EINK_FONT_8X12BLACK和CY_EINK_FONT_16X16BLACK.当然更高阶的玩家可以使用取模工具支持更多字体开发.

image15.png

图 像素与显存对应图

取模软件与LCD/OLED的取模软件无异,本文也不赘述.

初始化代码:

TIM截图20180206154506.jpg

void Pv_EINK_Init(void)

{

CY_EINK_EnableIO;

CY_EINK_BorderLow;

EINK_VccOff;

/* Initialize the PSoC SPI */

Cy_EINK_InitSPI();

/* Pull the chip select, reset and discharge pins to LOW */

CY_EINK_CsLow;

CY_EINK_RstLow;

CY_EINK_DischargeLow;

/* Initialize the E-INK display Timer */

Cy_EINK_TimerInit();

}

更新代码:

TIM截图20180206154522.jpg

void Cy_EINK_ShowFrame(uint8_t* prevFrame, uint8_t* newFrame,

cy_eink_update_t updateType, bool powerCycle)

{

/* If power cycle operation requested, turn on E-INK power */

if (powerCycle)

{

Cy_EINK_Power(true);

}

/* Partial update stage */

if (updateType == CY_EINK_PARTIAL)

{

/* Update the display with changes from previous frame */

Pv_EINK_PartialStageHandler(prevFrame, newFrame);

}

/* Full update stages */

else if ((updateType == CY_EINK_FULL_4STAGE) ||

(updateType == CY_EINK_FULL_2STAGE))

{

/* Stage 1: update the display with the inverted version of the previous

frame */

Pv_EINK_FullStageHandler(prevFrame, PV_EINK_STAGE1);

/* Additional stages that reduce ghosting for a 4 stage full update */

if (updateType == CY_EINK_FULL_4STAGE)

{

/* Stage 2: update the display with an all white frame */


Pv_EINK_FullStageHandler(prevFrame, PV_EINK_STAGE2);

/* Stage 3: update the display with the inverted version of the new

frame */

Pv_EINK_FullStageHandler(newFrame, PV_EINK_STAGE3);

}

/* Stage 4: update the display with the new frame */

Pv_EINK_FullStageHandler(newFrame, PV_EINK_STAGE4);

}

else

{

}

/* If power cycle operation requested, turn off E-INK power */

if (powerCycle)

{

Cy_EINK_Power(false);

}

}

这个函数会持续Block数秒钟,这样的代码比较适合低功耗的内核执行.当然如果进行优化,可以加入休眠唤醒机制或者Event机制以提高CPU利用率与进一步降低功耗.这些内容当然不在本文覆盖范畴之内,读者可以自行进行思考或者加以改进.

image16.jpg

图 PSoC驱动EInk效果图2

使用其他处理器驱动EInk

因为该模块的引脚分布与Arduino Uno的接口兼容,所以从硬件上来讲可以用任何其他与之兼容的主控板进行驱动.但是从软件上来讲至少需要30 KB的RAM作为缓存.所以Uno这样的板子不是驱动这个模块的最佳选择.这里使用另外一家与Uno接口兼容的Cortex M4F内核的开发板来做这个实验.

外设方面.注意配置好SPI的参数与几个IO,至于定时器使用SysTick即可.

image17.png

图 SPI参数配置成与数据手册中一致

因为该开发板不是Cypress公司的产品,设计方法此处从简以免喧宾夺主.具体请参阅文末的代码连接.

image18.jpg

图 另外一块开发板控制EInk效果图2

总结,代码与参考

本文的写作其实还了自己的一个心愿,那就是对EInk屏幕的原理与驱动代码进行一个深入的分析.作为9年前就开始使用电纸书进行阅读的本文作者,一直没有抽出时间与精力来对它的原理进行了解确实有点小小遗憾.感谢Cypress厂家与21ic网站提供给本人的实验硬件,也感谢读者的阅读与关注.希望本文能给有需要的朋友能带来一点知识和阅读的兴趣.Happy Reading and Happy Coding!

代码下载连接:

PSoC 6工程

实验所用工程从官方例程改来,大家可以直接下载官方例程:

http://www.cypress.com/CE218133

其他处理器工程

https://github.com/zhanzr/stm32l4r5-demo.git

EInk器件原厂参考连接:

http://www.pervasivedisplays.com/products/271

本人最爱的电子书资源网站:

http://www.gutenberg.org/



本文章搜集于互联网,版权属于原出处!公开讯息可转载! 地址:https://einkcn.com/post/238.html

相关阅读

产品咨询
随机文章