# 基于NRF52832的墨水屏移植与GUI设计(1)
基于NRF52832的墨水屏移植与GUI设计(1)
主控芯片:NRF52832
外设: HINK 2.13 BWR(黑白红) 三色墨水屏
墨水屏
驱动编写
- 驱动是属于底层的开发,也是GUI界面开发的基础,你的应用层软件程序是在底层的基础上才能编写的。驱动相当于房屋的地基,打好了地基才能这上面盖楼。
那么驱动是干嘛的呢?它相当于一个通道,把你的外部设备和你的单片机通过通信接口连接起来,建立起关系。双方能够收发数据命令,进行通信。
硬件电路
下面直接上电路图
![在这1里插入图片描述](https://img-blog.csdnimg.cn/20200811195128933.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4ODIyNQ==,size_16,color_FFFFFF,t_70)图一 主控芯片
-
图二 屏幕引脚
电路图上可以清楚看到,连接的引脚。
CS# 芯片选择输入引脚
D/C# 数据/命令控制引脚
SCL 串行时钟针(SPI)
SDA 串行数据pin (SPI)
TSCL-------p0-23
TSDA-------P0-22
BS1--------P0-20
BUSY-------P0-19
RES#-------P0-18
D/C#-------P0-17
CS#--------P0-16
SCL--------P0-15
功能口 引脚
MISO 17
MOSI 18
CLK 20
CSN 19
通信接口
那么二者是如何通信的呢?
上屏幕的说明书:
图 3,4 SPI接口数据的读写
在屏幕的数据手册中,你可以清楚地看到各个接口的作用,功能。以及在进行数据传递过程中,需要的条件。
spi接口配置
在这里插入代码片
//#define BOARD_SPI0_MISO_IO 29
#define BOARD_SPI0_MOSI_IO 13
#define BOARD_SPI0_CLK_IO 15
#define BOARD_SPI0_CSN_IO 16
这里按照电路图,把这些接口配置为SPI的接口
分别是:主机输出从机输入,时钟,片选。miso没启用。
还有其他的很多接口,我们用GPIO口复用为功能口
在这里插入代码片
//RST引脚初始化
void pingmuRstPinInit(void)
{
NRF_LOG_INFO("pingmuRstPinInit"); //配置 PWM 输出管脚
nrf_gpio_cfg_output(pingmu_RST_IO); //配置GPIO输出管脚
pingmu_RST_HIGH;
}
//RST引脚设置
void pingmuRstPinSet(bool pinState)
{
NRF_LOG_INFO("pingmuRstPinSet"); //配置 PWM 输出管脚
if(pinState == pingmu_RST_OFF)
{
nrf_gpio_pin_write (pingmu_RST_IO, 1); //配置为写引脚,并写1
}
else if(pinState == pingmu_RST_ON)
{
nrf_gpio_pin_write(pingmu_RST_IO, 0); //配置为写引脚,并写0
}
}
void BS1_Init(void)
{
nrf_gpio_cfg_output(BOARD_BS1_IO);
nrf_gpio_pin_write(BOARD_BS1_IO, 0); //配置BS1为低电平,则设置为4线SPI
}
void BUSY_Init(void)
{
nrf_gpio_cfg_input(pingmu_BUSY_IO,NRF_GPIO_PIN_NOPULL);
}
/*
@brief DC的初始化函数
@param 无
@return 无
*/
void DC_Init(void)
{
nrf_gpio_cfg_output(BOARD_DC_IO);
}
void DC_L(void)
{
nrf_gpio_pin_write(BOARD_DC_IO, 0);
}
void DC_H(void)
{
nrf_gpio_pin_write(BOARD_DC_IO, 1);
}
void RESET() //复位
{
pingmu_RST_LOW;
DELAY_mS(1);
pingmu_RST_HIGH;
DELAY_mS(1);
}
端口配置过之后,我们还要屏幕驱动流程,写驱动程序
屏幕驱动开发流程图
在这里插入代码片
- / 电子纸驱动初始化 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void INIT_SSD1619A()
{
SPI4W_WRITECOM(0x01);
SPI4W_WRITEDATA(0xF9);
SPI4W_WRITEDATA(0x00);
SPI4W_WRITEDATA(0x00);
SPI4W_WRITECOM(0x11); // data enter mode
SPI4W_WRITEDATA(0x01);
SPI4W_WRITECOM(0x44); // set RAM x address start/end, in page 36
SPI4W_WRITEDATA(0x00); // RAM x address start at 00h;
SPI4W_WRITEDATA(0x0F);
SPI4W_WRITECOM(0x45);
SPI4W_WRITEDATA(0xF9);
SPI4W_WRITEDATA(0x00);
SPI4W_WRITEDATA(0x00); // RAM y address end at 00h;
SPI4W_WRITEDATA(0x00);
SPI4W_WRITECOM(0x3C); // board
SPI4W_WRITEDATA(0x05); //GS1-->GS1
SPI4W_WRITECOM(0x21); // Display update control
SPI4W_WRITEDATA(0x00);
SPI4W_WRITEDATA(0x80); // for 1675 type panel New panel 不需要增加
SPI_CS_HIGH;
}
SPI4W_WRITECOM(); //写命令
SPI4W_WRITEDATA(); //写数据
因为这个外设屏幕只用做显示效果,所以我们只要写命令和数据就行,这也是为什么我们不启用,miso端口。
完整的初始化程序:`
void pingmu_Init()
{
pingmuRstPinInit();//RST初始化
BS1_Init(); //BS1初始化
DC_Init(); //DC初始化
SPI_Init(); //SPI端口的初始化
BUSY_Init(); //BUSY初始化
RESET();
SPI4W_WRITECOM(0x12);
READBUSY();
INIT_SSD1619A();
dis_img(PIC_BLACK);//显示函数
Display();
enterdeepsleep();`
};
显示函数就不写了,太乱了
显示效果:
屏幕点亮显示黑色,驱动编写成功。
本人刚入职的小白,第一次有点乱。有兴趣可以交流。
应用层显示编写
下次续集再写,屏幕的说明书自取。
本文地址:https://blog.csdn.net/weixin_43588225/article/details/107942897