承接上期的呼吸灯效果,这期就围绕墨水屏的驱动展开话题,还是采用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中,自动重启后则看到如下的现象。

我要赚赏金
