首页 > 评测 > PSoC6评测之三:享受阅读——EInk模块驱动原理与评测

PSoC6评测之三:享受阅读——EInk模块驱动原理与评测

PSoC6   BLE   先锋套件   Cypress   低功耗   EInk   电子纸   墨水屏   
  • 作者:
  • 来源:21ic
  • [导读]
  • 此次PSoC6先锋套件的评测,其实还了作者自己的一个心愿,那就是对EInk屏幕的原理与驱动代码进行一个深入的分析.作为9年前就开始使用电纸书进行阅读的本文作者,一直没有抽出时间与精力来对它的原理进行了解确实有点小小遗憾.希望本文能给有需要的朋友能带来一点知识和阅读的兴趣.Happy Reading and Happy Coding!

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 */

  • 本文系21ic原创,未经许可禁止转载!

网友评论