12.48电子墨水屏使用教程

12.48寸电子墨水屏硬件连接和软件设置

特点

  • 尺寸: 12.48inch
  • 外形尺寸(裸屏):261.5mm × 211mm × 0.3mm
  • 外形尺寸(亚克力外壳):280mm x 229.5mm
  • 显示尺寸:252.98mm × 190.90mm
  • 工作电压:3.3V/5V
  • 通信接口:SPI
  • 点距:0.194mm × 0.194mm
  • 分辨率:1304 x 984
  • 显示颜色:黑、白、红
  • 灰度等级:2
  • 全局刷新 :16s
  • 刷新功耗 : 82.5mW(typ.)
  • 待机功耗 :<=0.017mW

【备注】: 刷新时间:刷新时间为实验测试数据,实际刷新时间会有误差,以实际效果为准。全局刷新过程中会有闪烁效果,这个是正常现象
功耗:功耗数据为实验测试数据,实际功耗由于驱动板的存在和实际使用情况的不同,会有一定误差,以实际效果为准

SPI 通信时序


由于墨水屏只需要显示,这里将从机发,主机收的数据线(MISO)隐藏。
CS:从机片选,当CS为低电平的时候,芯片使能
DC:数据/命令控制引脚,当DC=0时写入命令;DC=1时写入数据
SCLK: SPI通信时钟
SDIN:SPI通信主机发送,从机接收
时序:CPHL=0, CPOL=0 (SPI0)
【备注】具体关于SPI通信的相关信息,可以自行网上搜索资料了解

屏幕图片刷新实质

上面了解到屏幕使用的是SPI通信,对于此屏幕可能有些客户会觉得奇怪为什么会有两个排线?
对于此问题的解释就是该屏幕是由4块小屏幕拼接而成变得大尺寸屏幕,因此对应着4路片选信号。

  • 刷新实质

简略图如下:

我们把四部分分别命名为S2,M2,M1,S1,他们在程序中是依次进行传输的。
其中S2,M1是同样大小的分辨率:648*492,M2,S1是同样大小的分辨率:656*492.
他们的横竖加起来分辨率就是:1304*984

  • 控制原理

4个屏幕,那么他们就对应这4个SPI从机,所需要的控制线就是4个屏幕的总数:
一般SPI接口类显示屏具有以下4条控制线:MOSI,SCLK,CS,DC
然后需要最基本电源和复位:VCC,GND,RST
由于墨水屏的刷新特性,会一直闪烁,用于表示屏幕忙碌:BUSY
为了节省接口,其中4块屏幕共用VCC,GND,MOSI,SCLK;2块屏幕共用DC,RST
此时,重点来了,4块屏幕所需要电源线加控制线16条:

  • 核心代码分析

屏幕要进行工作,一般都会进行复位并初始化一些相关的寄存器,然后传输图像数据,最后打开显示。
这里主要讲述传输图像数据:
对于黑白或者红白,我们都可以认为是一张二阶灰度图片,那么一个字节的8个位就对应8个像素点,那么S2部分和M1部分:一行像素点有648点,将占用648/8 = 81个字节,有492列,总共占用81 * 492 = 39852个字节。同理M2部分与S1部分:一行像素点有656点,将占用656/8 = 82个字节,有492列,总共占用82 * 492 = 40344个字节。
12.48inch e-paper的寄存器0x13和0x10分别用于控制黑色图片数据和红色图片数据的传输。
他们的关系如下:

颜色0x100x13
白色0xff0x00
黑色0x000x00
红色0xff/0x000xff

下面以黑白屏为例子:

  1. void EPD_12in48_Display(const UBYTE *Image)
  2. {
  3. int x,y;
  4. //S1 part 648*492
  5. EPD_S2_SendCommand(0x13);
  6. for(y = 0; y < 492; y++)
  7. for(x = 0; x < 81; x++) {
  8. EPD_S2_SendData(*(Image + (y*163 + x)));
  9. }
  10.  
  11. //M2 part 656*492
  12. EPD_M2_SendCommand(0x13);
  13. for(y = 0; y < 492; y++)
  14. for(x = 81; x < 163; x++) {
  15. EPD_M2_SendData(*(Image+ (y*163) +x));
  16. }
  17.  
  18. //S1 part 656*492
  19. EPD_S1_SendCommand(0x13);
  20. for(y = 492; y < 984; y++)
  21. for(x = 81; x < 163; x++) {
  22. EPD_S1_SendData(*(Image+ (y*163) +x));
  23. }
  24.  
  25. //M1 part 648*492
  26. EPD_M1_SendCommand(0x13);
  27. for(y = 492; y < 984; y++)
  28. for(x = 0; x < 81; x++) {
  29. EPD_M1_SendData(*(Image+ (y*163) +x));
  30. }
  31. EPD_12in48_TurnOnDisplay();
  32. }