(手搓轮子)在AI-M61上用软件SPI驱动UC8179屏幕 #35
Yaqing-Zheng
started this conversation in
Show and tell(技术分享)
Replies: 1 comment
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
1. 硬件介绍
(1) Ai-M61
(2) UC8179
(3) 使用模块
2. 寄存器介绍
UC8179的寄存器较多,但大多数寄存器都是为提供LUT的屏幕设计的,对于不支持LUT功能的屏幕,涉及到的寄存器命令只有6个,对应的地址如下。
(1)单字节命令寄存器
UC8179_PON(0x04):面板升压上电,启动内部的DC-DC升压电路,产生EPD电压。
UC8179_DRF(0x12):启动电泳刷新动作,加载LUT波形,把SRAM现存的数据输出到面板。
UC8179_POF(0x02):面板高压掉电序列,关闭 DC‑DC 升压、Source 驱动器、VCOM,但是图像显存保留。
(2)双字节命令寄存器
UC8179_DSLP(0x04):进入深睡眠模式,操作字0xA5,如果不需要刷新就可以进入深睡眠模式。
(3)数据写入命令寄存器
UC8179_DTW1(0x10):数据区域BW,黑白图层数据,后续紧跟像素的操作字。
UC8179_DTW2(0x13):数据区域R,红色图层数据,后续紧跟像素的操作字。
3. 代码部分
(1) 端口定义
寄存器宏在寄存器介绍部分已经配置完成,此处直接定义用到的端口,后续修改端口可以直接修改端口定义。
(2)软件SPI与UC8179的访问
SPI的时序比较简单,此处不再做过多介绍,仅定义了三个函数用于初始化和交互。
(3) 屏幕刷新逻辑
屏幕刷新逻辑包含五个过程,分别为:复位--写入缓存--上电--刷新--下电。
此处提供两个函数用于刷新屏幕,分别对应黑白模式和红白模式
(4) 主函数示例
注意:gImage变量为全局数组,根据屏幕的分辨率定义即可,例如本例使用的屏幕为648×480分辨率的,数组大小即为648×480/8,由于数组太大,此处即用0x00替代,测试用数组可见工程。
4. 接线与测试效果
(1) 硬件接线
按照前面宏定义的接线即可,以本例为例,接线如下:
(2) 测试效果
测试用效果图选用了2026年9月4日的摸鱼人日历,gImage数组见工程。
5. 拓展实验
(1) 一个小问题
既然屏幕支持红、白、黑三种颜色,能不能同时显示呢?当然也是可以的,为了方便测试,我们可以写一个这样的函数。
后续只需要在主函数中调用该函数即可,如下:
最终的测试效果如下:
(2) 第二个问题
如果在UC8179_DTW1区域和UC8179_DTW2区域同时写数会有什么效果?答案其实就藏在数据手册的角落里。这是数据手册中表格的一个部分,当DDX[1:0]两个位未被配置(即DDX=2'b01)时,有下面这个真值表。
简单说,就是当红色像素存在,则输出为红色像素,否则该点输出与黑白模式一致。
(3) 第三个问题
那么,知道了这些有什么用呢?其实作用很明显,我们可以通过掩码的方式,显示一张包含黑、白、红三色的图片,具体的计算如下:
比如,我们在一个连续的区域0x00位置写入内容,如果这块区域的第三个像素为白色,第五个像素为红色,只需要按照如下的方式操作数据。
上述伪代码去除了数据写入前后的复位刷新等操作,相关操作同前文,此处不再赘述。
All reactions