嵌入式应用笔记

此系列作为产品过程中记录开源库移植和一些遇到的问题,包括有效资源、要点、函数、方法和一些使用心得。

移植

  • 开源库移植(一)轻量级环形缓冲区LwRB

驱动

  • 驱动应用(一)低功耗墨水屏硬件驱动与扫描原理

前言

  • 电子墨水屏EPD,是一种革新信息显示的新方法和技术。像多数传统墨水一样,电子墨水和改变它颜色的线路是可以打印到许多表面的,从弯曲塑料、聚脂膜、纸到布。和传统纸差异是电子墨水在通电时改变颜色,并且可以像传统屏幕那样显示变化的图像。
  • 其每个像素点是由单个电子墨水组成,电子墨水可以看成一个个胶囊的样子。每一个胶囊里面有液体电荷,其中正电荷染白色,负电荷染黑色。当我们在一侧给予正负电压,带有电荷的液体就会被分别吸引和排斥。这样,每一个像素点就可以显示白色或者黑色了。
  • 本章用122*250像素的2.13inch墨水屏,通过实际的测试,表述其驱动中的扫描原理,该屏内部控制器采用IL3895,注:相同系列,越大的墨水屏指令相同,设置的位数却更多。

墨水屏应用

  • 前言
  • 1 参考资料
  • 2 硬件参数
  • 3 硬件驱动
  • 4常用SPI指令
    • 4.1通常初始化指令
      • 4.1.1软件复位0x12
      • 4.1.2驱动器输出控制0x01
      • 4.1.3边框设置0x3C
      • 4.1.4 *扫描原理与像素点写入模式设置0x11
    • 4.2通常显示指令
      • 4.2.1 扫描像素点地址设置0x44\0x45\0x4E\0x4F
  • 5 软件驱动
    • 5.1 初始化函数
    • 5.2 缓冲区显示函数设计
      • 5.2.1 扫描显示原理与指令测试
    • 5.3 刷屏函数设计

1 参考资料

  • 原理:
    -知乎-全勾教育《墨水屏是什么?墨水屏是否真的护眼?》
    -知乎-Topbook《墨水屏真的能保护你的眼睛?》

  • 硬件驱动:
    立创-墨水屏Eink通用驱动板
    立创-并口墨水屏ESP32开发板

  • 微雪电子资料

2 硬件参数

参数 标记 条件 最小值 典型值 最大值 单位
单接地 Vss - - 0 - V
逻辑电源电压 Vci - 2.2 3.0 3.7 V
逻辑高电平 Voh - 0.9Vci - - V
逻辑低电平 Vol - - - 0.1Vci V
典型功率 Ptyp Vci=3.0V - 9 - mW
睡眠功率 Psleep - - 0.003 - mW
睡眠电流 Isleep - - 20 - uA
深度睡眠电流 Idsleep - - 1 - uA
VCOM引脚输出 VCOM - - TBD - V

3 硬件驱动

//施工

4常用SPI指令

每个指令有多个位进行设置,可以类比单片机寄存器配置

4.1通常初始化指令

4.1.1软件复位0x12

将命令参数重置为默认值,在深度睡眠模式(0x10)下不起作用,RAM不重置。

4.1.2驱动器输出控制0x01

读写权限 D/C D7 D6 D5 D4 D3 D2 D1 D0
W写 1 A7 A6 A5 A4 A3 A2 A1 A0
默认配置 - 0 0 0 0 0 0 0 0

4.1.3边框设置0x3C

//施工

4.1.4 *扫描原理与像素点写入模式设置0x11

指令表:

读写权限 DC D7 D6 D5 D4 D3 D2 D1 D0
W写 1 - - - - - AM ID1 ID0
默认配置 - 0 0 0 0 0 0 0 0

说明

其内部管理了一个地址计数器,自动地在某方向加减地址,通过AM设置方向;ID控制加减。

  • ID[0]=“1”时,将数据写入RAM后,X地址计数器将自动增加1。
  • ID[0]=“0”时,将数据写入RAM后,X地址计数器会自动减少1。
  • ID[1]=“1”时,将数据写入RAM后,Y地址计数器将自动增加1。
  • ID[1]=“0”时,将数据写入RAM后,Y地址计数器会自动减少1。
  • AM=“0”时,地址计数器在X方向上更新。
  • AM=“1”时,地址计数器在Y方向上更新。
  • 当选择窗口地址后,数据将以ID[1:0]和AM位指定的方式写入由窗口地址指定的RAM区域。

4.2通常显示指令

4.2.1 扫描像素点地址设置0x44\0x45\0x4E\0x4F

指令表:

0x44 DC D7 D6 D5 D4 D3 D2 D1 D0
W写 1 - - - A4 A3 A2 A1 A0
W写 1 - - - B4 B3 B2 B1 B0
默认配置0x00 - 0 0 0 0 0 0 0 0
默认配置0x12 - 0 0 0 1 0 0 1 0
0x45 DC D7 D6 D5 D4 D3 D2 D1 D0
W写 1 A7 A6 A5 A4 A3 A2 A1 A0
W写 1 B7 B6 B5 B4 B3 B2 B1 B0
默认配置0x00 - 0 0 0 0 0 0 0 0
默认配置0xF9 - 1 1 1 1 1 0 0 1
0x4E DC D7 D6 D5 D4 D3 D2 D1 D0
W写 1 - - - A4 A3 A2 A1 A0
默认配置0x00 - 0 0 0 0 0 0 0 0
0x4F DC D7 D6 D5 D4 D3 D2 D1 D0
W写 1 A7 A6 A5 A4 A3 A2 A1 A0
默认配置0x00 - 0 0 0 0 0 0 0 0

说明

0x44、0x45通过地址单元指定窗口地址

  • 0x44:A[4:0]设置窗口的X方向起始地址
  • 0x44:B[4:0]设置窗口的X方向终止地址
  • 0x45:A[7:0]设置窗口的Y方向起始地址
  • 0x45:B[7:0]设置窗口的Y方向起始地址

0x4E、0x4F设置RAM地址计数器的初值

  • 0x4E:A[4:0]设置当前RAM地址X方向计数器的值
  • 0x4F:A[7:0]设置当前RAM地址Y方向计数器的值

5 软件驱动

5.1 初始化函数

5.2 缓冲区显示函数设计

5.2.1 扫描显示原理与指令测试

这里非常重要,由于在使用过程中发现手册可能描述的不太清楚,于是测试程序写入同一个数组条件下,更改配置,附上效果图。

屏幕坐标系
该坐标系X轴总宽为0x0f,即16字节(128像素),其中边框占6像素。


一段测试代码

墨水屏像素点为一位,0为黑色,1为白色

//实验数组,先写入一段40像素黑线,空白8像素,黑线16像素,空8像素,黑线24像素,空16像素,黑线56像素,
uint8_t einkbmp[]={0X00,0X00,0X00,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0X00,0XFF,0XFF,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
/* 省略 */}//初始化函数中调整配置
void EINK_INIT(void)
{/* 省略初始化函数 */EINK_WRITECOM(0x11);      // 写入扫描方向控制指令EINK_WRITEDATA(0x01);    // 0b0000 0001写入配置,调整该设置/* 省略初始化函数 */
}
//实验函数
void TEST_IMG()
{uint16_t pcnt = 0;// 复位或保存提示字节序号READBUSY();//判忙,显示屏BUSY线不占线才往下执行,否则报错SetpointXY(0,0x0f,0xf9,0);//设置起始、终点坐标EINK_WRITECOM(0x24);// 复位或保存提示字节序号            for(uint16_t col=0; col<250; col++)   // 总共250 GATE列  // send 128x250bits ram 2D13for(uint16_t row=0; row<16; row++,pcnt++)  // 总共128 SOURCE行,每个像素1bit,即 128/8=16 字节    EINK_WRITEDATA(einkbmp[pcnt]);//此处省略显示刷屏函数
}

实际效果程序写入显示效果

实践得真知

扫描设置\窗口坐标 (0.0) (0.F9) (0F.0) (0F.F9)
AM+ID[0:1] =000,窗口设置为(0F,F9)到(0,0) 从该点写入,应该左上只有一个点,然后越界,很奇怪有5个像素 从该点写入,应该左下只有一个点,然后越界,很奇怪有5个像素 从该点写入会越界,故第二行会显示在最下面 从原点写入会越界,故第二行会显示在最下面
AM+ID[0:1] =001,窗口设置为(0,F9)到(0F,0) 从原点写入会越界,故第二行会显示在最下面 从该点写入会Y轴递减,X递增,所以顺序显示 从该点写入会越界,所以右上有一个像素点 从该点写入会越界,所以右下有一个像素点
AM+ID[0:1] =010 从原点写入会越界,故第二行会显示在最下面 从该点写入会Y轴递减,X递增,所以顺序显示 从该点写入和预期相符 从该点写入会越界,所以右下有一个像素点
AM+ID[0:1] =011 row 2, cell 2 row 2, cell 1 row 2, cell 2 row 2, cell 1
AM+ID[0:1] =100 row 2, cell 2 row 2, cell 1 row 2, cell 2 row 2, cell 1
AM+ID[0:1] =101 row 2, cell 2 row 2, cell 1 row 2, cell 2 row 2, cell 1
AM+ID[0:1] =110 row 2, cell 2 row 2, cell 1 row 2, cell 2 row 2, cell 1
AM+ID[0:1] =111 从原点写入出现X方向显示为为一个字节 从该点写入会Y轴递减,X递增,所以顺序显示 从该点写入和预期相符 从该点写入会越界,所以右下有一个像素点

5.3 刷屏函数设计

//施工

外设驱动(一)E-Paper墨水屏扫描显示原理相关推荐

  1. 从点阵到OLED屏幕——动态扫描显示原理

    在我们买电脑.手机或者电视时,厂家常常会宣传他们的产品用的是什么屏幕,分辨率达到2K或者4K,色彩有多鲜艳,刷新率有多高. 这些参数到底是什么意思?屏幕到底是如何显示出我们想要的文字.图片以及视频呢? ...

  2. 2.9寸墨水屏制作互联网时钟填坑手记

    制作要求:显示公历日期/农历日期/天气/风向/温度/节日/提醒(屏幕较小,先显示这么多).派加电即可显示,派正常关机屏幕白    屏(休眠)以保护墨水屏,天气相关信息每12小时更新一次.天气信息来源于 ...

  3. AIR32F103(十一) 在AIR32F103上移植微雪墨水屏驱动

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  4. 使用ESP8266驱动微雪e-paer2.13墨水屏

    使用ESP8266驱动微雪e-paer墨水屏 前些时候使用Arduino nona小板子,成功驱动了微雪e-paer2.13墨水屏,但由于Arduino nona小板子内存小.主频低,虽然可以显示,但 ...

  5. 树莓派 java 驱动 微雪 墨水屏 16灰阶 LUT

    16灰度阶梯展示(未优化版) 下图为16灰阶梯度未优化版,可以看出,最黑的黑色颜色不够黑,且往右边越黑,灰阶越不明显,还有很大的优化空间,后续再聊优化. B站视频指导 视频指导:视频地址 https: ...

  6. 树莓派 java 驱动 4.2寸 微雪 墨水屏 天气 预报

    结果展示 我做的这个很简陋,需要插电,自己玩玩还行,效果见下: B站视频指导 视频指导:视频地址 https://www.bilibili.com/video/BV1bQ4y1Z7xL 实现说明 我一 ...

  7. 【N32G457】基于RT-Thread和N32G457的墨水屏日历

    本文是RT-Thread用户@xusiwei1236 原创发布,是用于参加RT-Thread与国民技术联手推出N32G457 RT-Thread设计大赛,原文:https://club.rt-thre ...

  8. 【项目分享】基于AB32和RT-Thread的墨水屏智能日历

    基于AB32VG1的墨水屏智能日历 项目背景 本项目是[RT-Thread x RISC-V 应用创新大赛]参赛项目之一,大赛活动页面: RT-Thread X RISC-V 创新应用设计大赛 (el ...

  9. 【墨水屏】1.54寸墨水屏调试记录

    某宝某店墨水屏挺便宜,买了几个尝试着使用以下. 同时买了微雪的ESP32墨水屏专用驱动板. 由于1.54寸的小屏节假日期间一直没有发货,所以先用了手头的7.5寸屏测试了一下EPS32驱动板,功能一切正 ...

最新文章

  1. 做图形处理Linux小型主机,8个优秀的linux图形图像工具
  2. service 与chkconfig
  3. 三星android获取root权限,三星G9250(S6 Edge公开版全网通 Android 5.1)获取ROOT权限详解教程...
  4. 启明云端方案分享| ESP32-C3智能网关应用解决方案
  5. javax.naming.NameNotFoundException:
  6. Stack Overflow 2016 最新架构探秘
  7. mysql explain 为空_车祸现场!我的MySQL千万级数据表选错索引了!
  8. 论赵泽彬多终端应⽤下的架构设计
  9. 可视化大屏设计指南,附20份可直接套用的实用模板
  10. extjs引入html,ExtJs教程第一集 搭建ext环境后的第一个hello World
  11. 物联那点事儿之自制网络温湿度计(arduino+点灯科技篇)
  12. 浅析SkipList跳跃表原理及代码实现
  13. 自建网络加速服务器,自建DNS缓存服务器加快上网速度
  14. “一点”也不能忍 | 精准检测让屏幕缺陷无所遁形
  15. MES系统多少钱?企业需要什么样的MES系统?
  16. GIC/ITS代码分析(3)ITS驱动初始化
  17. Java中的多线程安全问题
  18. Python统计学:独立样本t检验~均值差的检验
  19. 密钥远程登录与scp
  20. 【bzoj3295】动态逆序对

热门文章

  1. 什么是面向对象编程(OOP)?
  2. django3.x+DRF+simpleui+uniapp打造自己的任务推广(兼职、悬赏)平台
  3. win10如何修改远程桌面的默认端口_win10远程桌面端口的更改办法
  4. 北京化工大学计算机复试面试题,北京化工大学综合素质测试面试题历年总结
  5. 华清远见上海中心22071班--11.19作业
  6. 倪海厦《天纪》「自参」
  7. 你可能不需要担心,AI对你的工作造成威胁:万字长文解读科技革命与人类发展
  8. Qt Design Studio安装教程
  9. Unity Ugui 详解 Content Size Fitter 和 Horizontal Layout Group 的使用
  10. 浅析 ContentSizeFitter 以及 Horizontal Layout Group 嵌套问题