根据官方文档对微雪墨水屏(2.9inch)的STM32代码进行原理解析

最近从好兄弟手里那里“抢”到一款墨水屏,想着解析一下微雪官方的STM32代码示例工程

下附好兄弟的链接,他用的是ESP32的,如果涉及过ESP32的可以去看看。

【ESP32-arduino】墨水屏使用GxEPD2库(以微雪墨水屏为例)_esp32 墨水屏-CSDN博客

目录

1.文章链接

2.协议解析

2.1串行总线选择

2.2MCU串行外设接口

2.3文档推荐的流程


本文是根据微雪官方技术文档对官方的示例代码进行讲解,纯技术分享。有问题欢迎讨论,有错误欢迎指出。

1.文章链接

2.9inch e-Paper V2 Specificatin-WS

2.协议解析

2.1串行总线选择

要实现代码的解读,我们就要看一下硬件的协议

当BS1为高电平的时候,墨水屏选择三总线串行传输(SPI)。

当BS1为低电平的时候,墨水屏选择四总线串行传输(SPI)。

我手上的墨水屏是商家已经帮我选择的,为四总线串行传输(SPI),而且微雪官方代码使用的也是四总线串行传输的,本章主要讲的就是四总线串行传输。

2.2MCU串行外设接口

Write command:写入命令,当SCL时钟为上升沿的时候,D/C#=Low和CS#=Low的时候,使用SPI协议传输的数据会被墨水屏认为传入命令。

Write data:写入数据,当SCL为上升沿的时候,D/C#=High和CS#=Low的时候,使用SPI协议传输的数据会被墨水屏认为传入数据。

根据原理图的图像我们可以知道墨水屏的SPI时序单元为模式0

CPOL=0:空闲状态时,SCK为低电平

CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

由此得出墨水屏的执行逻辑

1.CS#片选线和D/C线变为有效(即变成低电平)

2.将SDA输出线准备好要输出的数据(0或1)

3.SCL(MOSI)线拉高(代表数据的移入)主机——>从机

4.SCL(MOSI)线拉低(代表数据的移出)从机——>主机

下面对微雪官方示例代码进行解析

/******************************************************************************
function :	send command
parameter:
     Reg : Command register
******************************************************************************/
static void EPD_2IN9_V2_SendCommand(UBYTE Reg)
{
    //D/C和CS片选线都为低电平
    DEV_Digital_Write(EPD_DC_PIN, 0);
    DEV_Digital_Write(EPD_CS_PIN, 0);
    //传入的数据被认为是指令
    DEV_SPI_WriteByte(Reg);
    //片选线升高,退出SPI通信
    DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function :	send data
parameter:
    Data : Write data
******************************************************************************/
static void EPD_2IN9_V2_SendData(UBYTE Data)
{
    //D/C线为高电平,CS片选线为低电平
    DEV_Digital_Write(EPD_DC_PIN, 1);
    DEV_Digital_Write(EPD_CS_PIN, 0);
    //通过SPI传入的数据被当成数据
    DEV_SPI_WriteByte(Data);
    DEV_Digital_Write(EPD_CS_PIN, 1);
}

微雪官方的代码也只写了写的程序,并没有写读的程序,本章也不叙述。

2.3文档推荐的流程

文档为防止我们看不懂流程,特意写了一个开启流程,跟官方示例代码差不多

SCL和SDA线在spi初始化的时候就已经设置好了,具体查看SPI的定义

    DEV_Digital_Write(EPD_DC_PIN, 0);//DC#=HIGH,即DC线为低电平有效
    DEV_Digital_Write(EPD_CS_PIN, 0);//CS#=HIGH,即CS片选线为低电平有效
	DEV_Digital_Write(EPD_PWR_PIN, 1);//
    DEV_Digital_Write(EPD_RST_PIN, 1);

/******************************************************************************
function :	Software reset
parameter:
******************************************************************************/
static void EPD_2IN9_V2_Reset(void)
{
    DEV_Digital_Write(EPD_RST_PIN, 1);//RST#=LOW
    DEV_Delay_ms(10);                 //延时10s
    DEV_Digital_Write(EPD_RST_PIN, 0);//RST#=HIGH
    DEV_Delay_ms(2);
    DEV_Digital_Write(EPD_RST_PIN, 1);//实现功能后要将复位键还原
    DEV_Delay_ms(10);
}

软件复位后输入命令0x12

	EPD_2IN9_V2_Reset();
	DEV_Delay_ms(100);
    /*在软件复位过程中,硬件需要时间处理,硬件处理的时候Busy线会拉高,而硬件使能完成后,Busy线拉低,说明之前的命令已经执行完,重新恢复数据接收*/
	EPD_2IN9_V2_ReadBusy();   
	EPD_2IN9_V2_SendCommand(0x12); // soft reset
	EPD_2IN9_V2_ReadBusy();

对应的命令表

第一个数据是传输命令0x01

根据文档之后开始传输数据0x27和0x01是一起的,8位二进制说明该线程开启了295+1个多路选择器(MUX),也就是官方将MUX拉满了

	EPD_2IN9_V2_SendCommand(0x01); //Driver output control      
	EPD_2IN9_V2_SendData(0x27);
	EPD_2IN9_V2_SendData(0x01);
	EPD_2IN9_V2_SendData(0x00);

对应的命令表

数据输入序列设置,这里官方的例程给的是0x11和0x03,0x03是x和y都是增量

	EPD_2IN9_V2_SendCommand(0x11); //data entry mode       
	EPD_2IN9_V2_SendData(0x03);

对应的命令表

官方历程并没有0x4e和0x4f命令,说明官方没有开启RAM计数器的寄存器,只是写入RAM

/******************************************************************************
function :	Clear screen
parameter:
******************************************************************************/
void EPD_2IN9_V2_Clear(void)
{
	UWORD i;
	
	EPD_2IN9_V2_SendCommand(0x24);   //write RAM for black(0)/white (1)
	for(i=0;i<4736;i++)
	{
		EPD_2IN9_V2_SendData(0xff);    //给予5000个字节的数据
	}

	EPD_2IN9_V2_SendCommand(0x26);   //write RAM for black(0)/white (1)
	for(i=0;i<4736;i++)
	{
		EPD_2IN9_V2_SendData(0xff);    //给予5000个字节的数据
	}
	EPD_2IN9_V2_TurnOnDisplay();
}

对应的命令表

官方只输入了指令并没有修改寄存器的数据,而一开始的寄存器复位的指令为0xff,对应指令表为

使能时钟和模拟值,其他的都关闭

/******************************************************************************
function :	Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN9_V2_TurnOnDisplay(void)
{
	EPD_2IN9_V2_SendCommand(0x22); //Display Update Control
	EPD_2IN9_V2_SendData(0xc7);
	EPD_2IN9_V2_SendCommand(0x20); //Activate Display Update Sequence
	EPD_2IN9_V2_ReadBusy();
}

作者:明早你自己说

物联沃分享整理
物联沃-IOTWORD物联网 » 根据官方文档对微雪墨水屏(2.9inch)的STM32代码进行原理解析

发表回复