Harry Chen / EPD_GDEW075T8

Dependents:   EInkTest

GDEW075T8.cpp

Committer:
HarryChen
Date:
2018-10-14
Revision:
0:518ad5d26088
Child:
1:6ae4383194a1

File content as of revision 0:518ad5d26088:

#include "mbed.h"
#include "GDEW075T8.h"

#define nCS_L    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET)
#define nCS_H    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET)

#define nDC_L    HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_RESET)
#define nDC_H    HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_SET)

#define nRST_L   HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, GPIO_PIN_RESET)
#define nRST_H   HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, GPIO_PIN_SET)

// TODO: use real value
DigitalOut nCS(D1);
DigitalOut nDC(D2);
DigitalOut nRST(D3);
DigitalIn  busyPin(D8);

SPI spi(D4, D5, D6, D7);

static inline int SPI_Write(unsigned char value) {
    return spi.write(value);
}

void SPI4W_WRITECOM(unsigned char command) {
    nCS = 0;
    nDC = 0;       // command write
    SPI_Write(command);
    nCS = 1;
}

void SPI4W_WRITEDATA(unsigned char data) {
    nCS = 0;
    nDC = 1;       // data write
    SPI_Write(data);
    nCS = 1;
}

static void lcd_chkstatus(void) {
    unsigned char busy;
    do {
        SPI4W_WRITECOM(0x71);
        busy = busyPin;
        busy = !(busy & 0x01);
    } while (busy);
    wait(0.2);
}

static void EPD_W21_Init(void) {
    // BS tied to GND
    // nBS_L;              //4 wire spi mode selected

    nRST = 0;             //module reset
    wait(0.1);
    nRST = 1;;
    wait(0.1);

}

void color_bar_display (unsigned char k) {
    unsigned long int i;
    unsigned char j, temp1, temp2;

    if (k == 0) {
        SPI4W_WRITECOM(0x10);          //开始传输图像
        for (i = 0; i < 30720; i++) {
            // temp1 = G_Ultrachip1[i];
            temp1 = 0xff; // all black
            for (j = 0; j < 8; j++) {
                if (temp1 & 0x80)
                    temp2 = 0x00;
                else
                    temp2 = 0x03;

                temp2 <<= 4;
                temp1 <<= 1;
                j++;

                if (temp1 & 0x80)
                    temp2 |= 0x00;
                else
                    temp2 |= 0x03;

                temp1 <<= 1;

                SPI4W_WRITEDATA(temp2);

            }

        }

    }
    if (k == 1) {
        SPI4W_WRITECOM(0x10);          //开始传输图像
        for (i = 0; i < 30720; i++) {
            // temp1 = G_Ultrachip2[i];
            temp1 = (i & 1) ? 0xff : 0;
            for (j = 0; j < 8; j++) {
                if (temp1 & 0x80)
                    temp2 = 0x00;
                else
                    temp2 = 0x03;

                temp2 <<= 4;
                temp1 <<= 1;
                j++;

                if (temp1 & 0x80)
                    temp2 |= 0x00;
                else
                    temp2 |= 0x03;

                temp1 <<= 1;

                SPI4W_WRITEDATA(temp2);

            }

        }

    }

}

void GDE_Start(void) {
    EPD_W21_Init();

    SPI4W_WRITECOM(0x01);
    SPI4W_WRITEDATA (0x37);     //POWER SETTING
    SPI4W_WRITEDATA (0x00);

    SPI4W_WRITECOM(0X00);           //PANNEL SETTING
    SPI4W_WRITEDATA(0xCF);
    SPI4W_WRITEDATA(0x08);

    SPI4W_WRITECOM(0x06);         //boost设定
    SPI4W_WRITEDATA (0xc7);
    SPI4W_WRITEDATA (0xcc);
    SPI4W_WRITEDATA (0x28);


    SPI4W_WRITECOM(0x30);           //PLL setting
    SPI4W_WRITEDATA (0x3c);

    SPI4W_WRITECOM(0X41);           //TEMPERATURE SETTING
    SPI4W_WRITEDATA(0x00);

    SPI4W_WRITECOM(0X50);           //VCOM AND DATA INTERVAL SETTING
    SPI4W_WRITEDATA(0x77);

    SPI4W_WRITECOM(0X60);           //TCON SETTING
    SPI4W_WRITEDATA(0x22);

    SPI4W_WRITECOM(0x61);           //tres          单色640*384
    SPI4W_WRITEDATA (0x02);     //source 640
    SPI4W_WRITEDATA (0x80);
    SPI4W_WRITEDATA (0x01);     //gate 384
    SPI4W_WRITEDATA (0x80);

    SPI4W_WRITECOM(0X82);           //VDCS SETTING
    SPI4W_WRITEDATA(0x1E);      //decide by LUT file

    SPI4W_WRITECOM(0xe5);           //FLASH MODE
    SPI4W_WRITEDATA(0x03);

}

void GDE_ShowDemo() {
    for (int k = 0; k < 2; ++k) {
        color_bar_display(k);

        SPI4W_WRITECOM(0x04);           //POWER ON
        lcd_chkstatus();

        SPI4W_WRITECOM(0x12);           //display refresh
        wait(0.1);
        lcd_chkstatus();

        wait(1);
    }

}

void GDE_Stop() {

    SPI4W_WRITECOM(0x02);
    lcd_chkstatus();

    SPI4W_WRITECOM(0x07);
    SPI4W_WRITEDATA(0xa5);

}