跳到主要内容

电子墨水瓶

本文旨在详细介绍如何使用 Luckfox Pico Plus 来驱动 2.13inch 屏幕(与Pico的区别在于右侧的引脚编号不同),我们采用的是微雪的 Pico-ePaper-2.13 墨水屏,屏幕的具体参数可以查看 Pico-ePaper-2.13 的产品wiki。您可以下载镜像文件和示例程序直接使用或按照下面步骤自己配置。

1. 引脚配置

  • Luckfox Pico / Plus / Pro / Max 系列主要参考了 Raspberry Pi Pico 的引脚布局,通过引脚配置可以兼容部分 Raspberry Pi Pico 的外设。

  • Luckfox Pico 不同型号支持的兼容设备列表参考Luckfox-Pico_support-List

  • 兼容设备选项本质上是多种引脚配置的组合,可以简化配置的步骤

  • Luckfox Pico 在 ubuntu 下由于没有 io 命令直接配置寄存器,配置兼容设备 Pico-LCD 时引脚无法配置为默认上拉,无法正常控制按键

  • 启动兼容设备配置时会覆盖原有配置,需要取消兼容设备到 Advanced Options 界面关闭启动的设备功能即可

2. 示例程序

为了实现 Pico-ePaper-2.13 的显示功能,我们需要在程序中定义引脚以及实现 SPI 通讯,再通过交叉编译工具对程序进行编译。接下来,我们一起来看看具体的实现步骤。

  1. 引脚定义

    1. DEV_Config.h 中定义引脚编号

      #define EPD_DC_PIN    (34)
      #define EPD_CS_PIN (48)
      #define EPD_RST_PIN (51)
      #define EPD_BUSY_PIN (4)
    2. DEV_Config.h 中添加控制引脚电平宏定义

      #define EPD_CS_0        DEV_Digital_Write(EPD_CS_PIN,0)
      #define EPD_CS_1 DEV_Digital_Write(EPD_CS_PIN,1)
      #define EPD_RST_0 DEV_Digital_Write(EPD_RST_PIN,0)
      #define EPD_RST_1 DEV_Digital_Write(EPD_RST_PIN,1)
      #define EPD_DC_0 DEV_Digital_Write(EPD_DC_PIN,0)
      #define EPD_DC_1 DEV_Digital_Write(EPD_DC_PIN,1)
      #define EPD_BUSY_0 DEV_Digital_Write(EPD_BUSY_PIN,0)
      #define EPD_BUSY_1 DEV_Digital_Write(EPD_BUSY_PIN,1)
    3. DEV_GPIO_Init 函数中对GPIO进行初始化

      static void DEV_GPIO_Init(void)
      {
      DEV_GPIO_Mode(EPD_CS_PIN, 1);
      DEV_GPIO_Mode(EPD_RST_PIN, 1);
      DEV_GPIO_Mode(EPD_DC_PIN, 1);
      DEV_GPIO_Mode(EPD_BUSY_PIN, 0);

      EPD_CS_1;
      }
  2. SPI通讯

    1. DEV_ModuleInit 函数中申请SPI资源

      DEV_HARDWARE_SPI_begin("/dev/spidev0.0");
    2. 初始化

      main 函数中调用 EPD_2in13_V4_Init 函数对ePaper进行初始化

      void EPD_2in13_V4_Init(void)
      {
      EPD_2in13_V4_Reset();

      EPD_2in13_V4_ReadBusy();
      EPD_2in13_V4_SendCommand(0x12); //SWRESET
      EPD_2in13_V4_ReadBusy();

      EPD_2in13_V4_SendCommand(0x01); //Driver output control
      EPD_2in13_V4_SendData(0xF9);
      ......
      }
    3. 发送数据

      EPD_2in13_V4_SendCommand 函数中将EPD_DC_PIN引脚拉低,表示发送命令,再调用 DEV_SPI_WriteByte 函数向LCD发送数据

      static void EPD_2in13_V4_SendCommand(UBYTE Reg)
      {
      DEV_Digital_Write(EPD_DC_PIN, 0); //发送命令,DC引脚拉低
      DEV_Digital_Write(EPD_CS_PIN, 0); //开始通讯,CS引脚拉低
      DEV_HARDWARE_SPI_TransferByte(Reg); //发送数据
      DEV_Digital_Write(EPD_CS_PIN, 1); //通讯结束,CS引脚置高
      }

      EPD_2in13_V4_SendData 函数中将LCD_DC引脚置高,表示发送数据,再调用 DEV_SPI_WriteByte 函数向LCD发送数据

      static void EPD_2in13_V4_SendData(UBYTE Data)
      {
      DEV_Digital_Write(EPD_DC_PIN, 1); //发送数据,DC引脚置高
      DEV_Digital_Write(EPD_CS_PIN, 0); //开始通讯,CS引脚拉低
      DEV_HARDWARE_SPI_TransferByte(Data);//发送数据
      DEV_Digital_Write(EPD_CS_PIN, 1); //通讯结束,CS引脚置高
      }
  3. 交叉编译

    1. 指定交叉编译工具

      用户需要将整个 "c" 文件夹移到虚拟机,并编辑 "c" 文件夹中的 Makefile 文件,修改其中的 CC= 后的内容以指定交叉编译工具。

      将 Makefile 中 <SDK Directory>修改为自己的 SDK 路径,如 /home/luckfox/luckfox-pico/

      DIR_Config   = ./lib/Config
      DIR_EPD = ./lib/ePaper
      DIR_FONTS = ./lib/Fonts
      DIR_GUI = ./lib/GUI
      DIR_Examples = ./examples
      DIR_BIN = ./bin

      OBJ_C = $(wildcard ${DIR_EPD}/*.c ${DIR_Config}/*.c ${DIR_GUI}/*.c ${DIR_Examples}/*.c ${DIR_FONTS}/*.c)
      OBJ_O = $(patsubst %.c,${DIR_BIN}/%.o,$(notdir ${OBJ_C}))

      TARGET = main

      USELIB = USE_DEV_LIB
      DEBUG = -D $(USELIB)

      CC = <SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc
      MSG = -g -O0 -Wall
      CFLAGS += $(MSG) $(DEBUG)

      ${TARGET}:${OBJ_O}
      $(CC) $(CFLAGS) $(OBJ_O) -o $@ $(LIB)

      ${DIR_BIN}/%.o:$(DIR_Examples)/%.c
      $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_GUI) -I $(DIR_EPD)

      ${DIR_BIN}/%.o:$(DIR_EPD)/%.c
      $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config)

      ${DIR_BIN}/%.o:$(DIR_FONTS)/%.c
      $(CC) $(CFLAGS) -c $< -o $@

      ${DIR_BIN}/%.o:$(DIR_GUI)/%.c
      $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_EPD) -I $(DIR_Examples)

      ${DIR_BIN}/%.o:$(DIR_Config)/%.c
      $(CC) $(CFLAGS) -c $< -o $@ $(LIB)

      clean :
      rm $(DIR_BIN)/*.*
      rm $(TARGET)
    2. 编译程序

      修改完 Makefile 后,使用 make 命令对程序进行交叉编译。

      luckfox@luckfox:~/c$ make

      交叉编译成功后,将在当前目录下生成可执行文件 main

      luckfox@luckfox:~/c$ ls
      bin examples lib main Makefile pic readme_CN.txt readme_EN.txt

3. 实现效果

  1. 将编译好的文件传输到开发板

    先将整个 "c" 文件夹从虚拟机传输到 Windows,再通过 TFTP 或 ADB 传输到开发板,将文件从 Windows 通过 ADB 将文件传输到开发板的步骤如下:

    adb push 文件所在路径 开发板存储路径

    eg:(将当前目录下的c文件夹传输到开发板的根目录)
    adb push c /
  2. 运行程序

    修改 main 文件的操作权限后运行程序

    #cd c/
    #chmod 777 main
    #./main 2.13
  3. 实验现象

    图片显示
    image

    GUI界面1
    image

    GUI界面2
    image