根据官方文档对微雪墨水屏(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();
}
作者:明早你自己说