承接上期的呼吸灯效果,这期就围绕墨水屏的驱动展开话题,还是采用Keil工具开发。电路原理图如下,可知inky与Pico采用SPI通讯,因此跟OLED屏一样,需要先初始化SPI驱动。
SPI是一种同步、全双工、主从式接口的通信总线。数据在时钟上升沿或下降沿同步。主机和从机可以同时传输数据。
RP2040 内部spi的逻辑框图
下面再来看看墨水屏相关知识,使用的墨水屏参数如下:
墨水屏显示原理
悬浮在液体中的带电纳米粒子受到电场作用而产生迁移。墨水屏是靠反射环境光来显示图案的,因此不需要背光,在环境光下,墨水屏清晰可视,可视角度几乎达到了 180°。所以,墨水屏非常适合阅读。
墨水屏刷新模式
1、全局刷新:墨水屏在刷新过程中会闪烁多次,闪烁是为了清除残影达到最佳的显示效果
2、局部刷新:墨水屏在刷新过程中不闪烁。
注意:使用局刷功能在刷新几次之后,要进行一次全刷操作清除残影,否则残影问题会越来越严重,甚至损坏屏幕
墨水屏通信时序
很显然是SPI模式0,即CPHA=0、CPOL=0。
由于墨水屏刷新较慢,因此SPI时钟一般设置为4MHz
参考的部分代码如下:
#include "pico/stdlib.h" #include "epd2.h" #include "my_epd.h" #include "my_led.h" static void system_init(void) { extern void SystemCoreClockUpdate(); SystemCoreClockUpdate(); } int main(void) { char key = 0x00, key_new; unsigned char txtIndex = 0; system_init(); LED_init(); epd_init(); fb_init(); draw_fb_point(10,20); updata_to_epd(DISPLAY_ALL); while (true) { draw_fb(0, 0, "EEPW&DigiKey"); draw_fb(0, 36, "RP2040 Test"); draw_fb(0, 72, "inky e-book "); updata_to_epd(DISPLAY_PART); DEV_Delay_ms(200); draw_fb(0, 72, "DIY 2024.08"); updata_to_epd(DISPLAY_PART); LED_ON(); DEV_Delay_ms(200); LED_OFF(); } return 0; }
void epd_init(){ OLED_GPIOInit(); EPD_2IN9D_Init(); EPD_2IN9D_Clear(); } void fb_init(){ int x,y; for(x = 0; x < EPD_H; x++){ for(y = 0; y < EPD_W; y++){ drawfb[x][y] = 0; } } EPD_HeightMemory = EPD_H; EPD_WidthMemory = EPD_W; if(EPD_WidthMemory % 8){ EPD_WidthMemory = EPD_W / 8 + 1; }else{ EPD_WidthMemory = EPD_W / 8 ; } } void draw_fb(int x, int y, char *data) { short int word; int i, dataLen = My_strlen(data); for (i = 0; i < dataLen;) { if ((x + ASCII_FONT_H) > EPD_H) { x = 0; y += ASCII_FONT_W; } draw_fb_ASCII(x, y, data[i]); x += ASCII_FONT_H; i++; } } void updata_to_epd(char flag){ fb_to_epddata(); if(flag == DISPLAY_PART){ EPD_2IN9D_DisplayPart(Image_BW2); DEV_Delay_ms(500); }else{ EPD_2IN9D_Init(); EPD_2IN9D_Display(Image_BW2); DEV_Delay_ms(2000); } }
先将板卡进入U盘烧录模式,即先按下“BOOTSEL”按钮,然后再上电,全编译工程,即将转化成的.uf2文件格式拷贝到pico中,自动重启后则看到如下的现象。