手把手教你驱动电子墨水屏——SPI硬件接口

今天再次来更新下,虽然还没有人看,上一篇介绍了驱动墨水屏的硬件接口,今天来介绍硬件接口程序(废话不多说开始整)

1、首先我们我们就要按照我们定义的硬件接口用程序定义出来(上程序)

void EPD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);


//CS-->PD8 SCK-->PD9 SDO--->PD10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; //Port configuration
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

// D/C--->PE15 RES-->PE14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15; //Port configuration
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);

// BUSY--->PE13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //Pull up input
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure); //Initialize GPIO

//LED
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //Port configuration
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}

(看到程序只有BUSY设置成了输入,其他都设置成了输出,这个很容易理解的检测忙不忙嘛,是要得到墨水屏传递的信号,对于单片机来讲就是输入)

2、接下来就是各个迎接接口的程序了

a、首先就是通信方式SPI

SPI时序图

程序代码

void SPI_Write(unsigned char value)
{
unsigned char i;

for(i=0; i<8; i++)
{
EPD_W21_CLK_0;
if(value & 0x80)
EPD_W21_MOSI_1;
else
EPD_W21_MOSI_0;
value = (value << 1);
EPD_W21_CLK_1;
}
}

 (这段的程序代码的理解那就是要通过spi的通信协议写东西,每次写一个字节也就是8位所以利用了一个for循环,根据上边的时序图,内部循环8次,这里说一下 if 里的判断程序value & 0x80就是在判断最高位是1还是0,是1 MOSI=1,是0 MOSI=0,因为我们写是从最高位开始写但是数据保存缺保存到了最低位,所以要往左移一位即   value = (value << 1)这样循环8次就得到了一个字节了)

b:接下来就要说CS和DC了

CS和DC就是要用到写数据和写命令里(看上边的时序图CS拉低的时候就开始写数据或者命令,写完后在拉高 DC=0的时候写命令,DC=1的时候写数据,就这么简单上代码)

void EPD_W21_WriteCMD(unsigned char command)//写命令
{
EPD_W21_CS_0;
EPD_W21_DC_0; // command write
SPI_Write(command);
EPD_W21_CS_1;
}
void EPD_W21_WriteDATA(unsigned char data)//写数据
{
EPD_W21_CS_0;
EPD_W21_DC_1; // data write
SPI_Write(data);
EPD_W21_CS_1;
}

c:复位RST就是高低电平,通常只用在初始化的开头无需多虑

EPD_W21_RST_0; // Module reset
delay_xms(10);//At least 10ms delay
EPD_W21_RST_1;
delay_xms(10); //At least 10ms delay

d:剩下的就是BUSY这个就是读取BUSY的电平,busy=1就是忙就会一直在while(1)的死循环里busy=0才会跳出循环执行下边的程序

void Epaper_READBUSY(void)
{
while(1)
{ //=1 BUSY
if(isEPD_W21_BUSY==0) break;;
}
}

ok,这一期的内容就到这里,请关注 ShiningMan ,欢迎大家留言!下一期更新 快刷,局刷,全刷的初始化代码!!!!

posted @ 2022-11-22 16:34  ShiningMan  阅读(4493)  评论(0)    收藏  举报