接下来介绍硬件接口程序 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 con 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;
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次,这里的 value & 0x80就是在判断最高位是1还是0, 是1 代表MOSI=1,是0 代表MOSI=0。因为SPI写数据是从最高位开始但是数据保存在最低位, 所以要往左移一位即value = (value << 1)这样循环8次就得到了一个字节。
b: CS和DC了 CS和DC就是要用到写数据和写命令里(时序图中CS低电平的时候开始写数据或者命令;DC=0的时候写命令,DC=1的时候写数据。结束后CS重新回到高电平。) 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通常只用在初始化部分,0,1代表电平 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=1代表忙状态,就会一直在while(1)的死循环里;busy=0才会跳出循环执行接下来的程序 void Epaper_READBUSY(void) { while(1) { //=1 BUSY if(isEPD_W21_BUSY==0) break;; } }
|