首頁 > 評測 > PSoC6評測之三:享受閱讀——EInk模塊驅(qū)動原理與評測

PSoC6評測之三:享受閱讀——EInk模塊驅(qū)動原理與評測

PSoC6   BLE   先鋒套件   Cypress   低功耗   EInk   電子紙   墨水屏   
  • 作者:
  • 來源:21ic
  • [導(dǎo)讀]
  • 此次PSoC6先鋒套件的評測,其實(shí)還了作者自己的一個心愿,那就是對EInk屏幕的原理與驅(qū)動代碼進(jìn)行一個深入的分析.作為9年前就開始使用電紙書進(jìn)行閱讀的本文作者,一直沒有抽出時間與精力來對它的原理進(jìn)行了解確實(shí)有點(diǎn)小小遺憾.希望本文能給有需要的朋友能帶來一點(diǎn)知識和閱讀的興趣.Happy Reading and Happy Coding!

image9.png

圖 4步更新

注意因?yàn)檫@樣的更新方式,所以每次顯示都需要保持上次的內(nèi)容以作取反之用.2步更新法就是省去了取反的過程,部分更新法則是直接顯示新內(nèi)容.本文所使用的顯示器是264x176的點(diǎn)陣,無灰階,則每個Frame的顯存為:

264 * 176 = 46464 Bits / 8 = 5808 Bytes

EPD更新顯示內(nèi)容方式的介紹應(yīng)該是建立在存儲在同一內(nèi)存的兩幀數(shù)據(jù),之前顯示內(nèi)容變更為新的顯示內(nèi)容(Previous Display-> New Dispaly)之上.所以需要兩個Frame,那么顯存就是10KB以上了,另外驅(qū)動的過程中也需要19KB以上的中間緩存,為什么需要兩個Frame呢?故此在選用主控芯片時需要考慮到顯存的尺寸.

EPD驅(qū)動流程圖如下:

image10.png

圖 流程圖

EPD更新周期內(nèi)的信號控制圖:

image11.png

圖 信號波形

使用PSoC 6驅(qū)動EInk

如上文所述,EInk的特點(diǎn)是保持顯示內(nèi)容不需要電源,但是更新顯示內(nèi)容時,不停地需要處理器來做控制與查詢.這種任務(wù)比較適合于低功耗的內(nèi)核,比如PSoC 6中的Cortex M0+內(nèi)核,此例中Cortex M4沒有用武之處,所以干脆就沒有使能.

頂層設(shè)計圖:

image12.png

圖 頂層設(shè)計

包括SPI口為通信口,定時器用來產(chǎn)生1ms的定時Tick,其余幾個IO口為通用IO.

image13.png

圖 SPI模組配置

image14.png

圖 更新定時器配置

這個定時器的主要作用是提供1ms的Tick計時,實(shí)際上任何可以提供1ms的tick的定時器都可以用,比如內(nèi)核中的SysTick.這里只是為了展示如何配制通用定時器.

至于要顯示的資源與內(nèi)容,因?yàn)樵擄@示器的點(diǎn)陣與內(nèi)存的對應(yīng)是逐行對應(yīng),所以取模時使用橫行取模,字節(jié)正序即可. CYPRESS提供的EINK例程中支持兩種大小字體,分別是CY_EINK_FONT_8X12BLACK和CY_EINK_FONT_16X16BLACK.當(dāng)然更高階的玩家可以使用取模工具支持更多字體開發(fā).

image15.png

圖 像素與顯存對應(yīng)圖

取模軟件與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原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!

網(wǎng)友評論

  • 聯(lián)系人:巧克力娃娃
  • 郵箱:board@21ic.com
  • 我要投稿
  • 歡迎入駐,開放投稿

熱門標(biāo)簽
項目外包 more+