EPD_2in9bc.c (9100B)
1 /***************************************************************************** 2 * | File : EPD_2in9bc.c 3 * | Author : Waveshare team 4 * | Function : 2.9inch e-paper b&c 5 * | Info : 6 *---------------- 7 * | This version: V3.0 8 * | Date : 2019-06-12 9 * | Info : 10 * ----------------------------------------------------------------------------- 11 * V3.0(2019-06-12): 12 * 1.Change: 13 * EPD_Reset() => EPD_2IN9BC_Reset() 14 * EPD_SendCommand() => EPD_2IN9BC_SendCommand() 15 * EPD_SendData() => EPD_2IN9BC_SendData() 16 * EPD_WaitUntilIdle() => EPD_2IN9BC_ReadBusy() 17 * EPD_Init() => EPD_2IN9BC_Init() 18 * EPD_Clear() => EPD_2IN9BC_Clear() 19 * EPD_Display() => EPD_2IN9BC_Display() 20 * EPD_Sleep() => EPD_2IN9BC_Sleep() 21 * 2.remove commands define: 22 * #define PANEL_SETTING 0x00 23 * #define POWER_SETTING 0x01 24 * #define POWER_OFF 0x02 25 * #define POWER_OFF_SEQUENCE_SETTING 0x03 26 * #define POWER_ON 0x04 27 * #define POWER_ON_MEASURE 0x05 28 * #define BOOSTER_SOFT_START 0x06 29 * #define DEEP_SLEEP 0x07 30 * #define DATA_START_TRANSMISSION_1 0x10 31 * #define DATA_STOP 0x11 32 * #define DISPLAY_REFRESH 0x12 33 * #define DATA_START_TRANSMISSION_2 0x13 34 * #define PLL_CONTROL 0x30 35 * #define TEMPERATURE_SENSOR_COMMAND 0x40 36 * #define TEMPERATURE_SENSOR_CALIBRATION 0x41 37 * #define TEMPERATURE_SENSOR_WRITE 0x42 38 * #define TEMPERATURE_SENSOR_READ 0x43 39 * #define VCOM_AND_DATA_INTERVAL_SETTING 0x50 40 * #define LOW_POWER_DETECTION 0x51 41 * #define TCON_SETTING 0x60 42 * #define TCON_RESOLUTION 0x61 43 * #define GET_STATUS 0x71 44 * #define AUTO_MEASURE_VCOM 0x80 45 * #define VCOM_VALUE 0x81 46 * #define VCM_DC_SETTING_REGISTER 0x82 47 * #define PARTIAL_WINDOW 0x90 48 * #define PARTIAL_IN 0x91 49 * #define PARTIAL_OUT 0x92 50 * #define PROGRAM_MODE 0xA0 51 * #define ACTIVE_PROGRAM 0xA1 52 * #define READ_OTP_DATA 0xA2 53 * #define POWER_SAVING 0xE3 54 * ----------------------------------------------------------------------------- 55 * V2.0(2018-11-06): 56 * 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8] 57 * 2.Change:EPD_Display(UBYTE *Image) 58 * Need to pass parameters: pointer to cached data 59 * 3.Change: 60 * EPD_RST -> EPD_RST_PIN 61 * EPD_DC -> EPD_DC_PIN 62 * EPD_CS -> EPD_CS_PIN 63 * EPD_BUSY -> EPD_BUSY_PIN 64 # 65 # Permission is hereby granted, free of charge, to any person obtaining a copy 66 # of this software and associated documnetation files (the "Software"), to deal 67 # in the Software without restriction, including without limitation the rights 68 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 69 # copies of the Software, and to permit persons to whom the Software is 70 # furished to do so, subject to the following conditions: 71 # 72 # The above copyright notice and this permission notice shall be included in 73 # all copies or substantial portions of the Software. 74 # 75 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 76 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 77 # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 78 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 79 # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 80 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 81 # THE SOFTWARE. 82 # 83 ******************************************************************************/ 84 #include "EPD_2in9bc.h" 85 #include "Debug.h" 86 87 /****************************************************************************** 88 function : Software reset 89 parameter: 90 ******************************************************************************/ 91 static void EPD_2IN9BC_Reset(void) 92 { 93 DEV_Digital_Write(EPD_RST_PIN, 1); 94 DEV_Delay_ms(200); 95 DEV_Digital_Write(EPD_RST_PIN, 0); 96 DEV_Delay_ms(10); 97 DEV_Digital_Write(EPD_RST_PIN, 1); 98 DEV_Delay_ms(200); 99 } 100 101 /****************************************************************************** 102 function : send command 103 parameter: 104 Reg : Command register 105 ******************************************************************************/ 106 static void EPD_2IN9BC_SendCommand(UBYTE Reg) 107 { 108 DEV_Digital_Write(EPD_DC_PIN, 0); 109 DEV_Digital_Write(EPD_CS_PIN, 0); 110 DEV_SPI_WriteByte(Reg); 111 DEV_Digital_Write(EPD_CS_PIN, 1); 112 } 113 114 /****************************************************************************** 115 function : send data 116 parameter: 117 Data : Write data 118 ******************************************************************************/ 119 static void EPD_2IN9BC_SendData(UBYTE Data) 120 { 121 DEV_Digital_Write(EPD_DC_PIN, 1); 122 DEV_Digital_Write(EPD_CS_PIN, 0); 123 DEV_SPI_WriteByte(Data); 124 DEV_Digital_Write(EPD_CS_PIN, 1); 125 } 126 127 /****************************************************************************** 128 function : Wait until the busy_pin goes LOW 129 parameter: 130 ******************************************************************************/ 131 void EPD_2IN9BC_ReadBusy(void) 132 { 133 Debug("e-Paper busy\r\n"); 134 while(DEV_Digital_Read(EPD_BUSY_PIN) == 0) { //LOW: idle, HIGH: busy 135 DEV_Delay_ms(100); 136 } 137 Debug("e-Paper busy release\r\n"); 138 } 139 140 /****************************************************************************** 141 function : Initialize the e-Paper register 142 parameter: 143 ******************************************************************************/ 144 void EPD_2IN9BC_Init(void) 145 { 146 EPD_2IN9BC_Reset(); 147 148 EPD_2IN9BC_SendCommand(0x06); // BOOSTER_SOFT_START 149 EPD_2IN9BC_SendData(0x17); 150 EPD_2IN9BC_SendData(0x17); 151 EPD_2IN9BC_SendData(0x17); 152 153 EPD_2IN9BC_SendCommand(0x04); // POWER_ON 154 EPD_2IN9BC_ReadBusy(); 155 156 EPD_2IN9BC_SendCommand(0x00); // PANEL_SETTING 157 EPD_2IN9BC_SendData(0x8F); 158 159 EPD_2IN9BC_SendCommand(0x50); // VCOM_AND_DATA_INTERVAL_SETTING 160 EPD_2IN9BC_SendData(0x77); 161 162 EPD_2IN9BC_SendCommand(0x61); // TCON_RESOLUTION 163 EPD_2IN9BC_SendData(0x80); 164 EPD_2IN9BC_SendData(0x01); 165 EPD_2IN9BC_SendData(0x28); 166 167 EPD_2IN9BC_SendCommand(0x82); // VCM_DC_SETTING_REGISTER 168 EPD_2IN9BC_SendData(0X0A); 169 } 170 171 /****************************************************************************** 172 function : Clear screen 173 parameter: 174 ******************************************************************************/ 175 void EPD_2IN9BC_Clear(void) 176 { 177 UWORD Width = (EPD_2IN9BC_WIDTH % 8 == 0)? (EPD_2IN9BC_WIDTH / 8 ): (EPD_2IN9BC_WIDTH / 8 + 1); 178 UWORD Height = EPD_2IN9BC_HEIGHT; 179 180 //send black data 181 EPD_2IN9BC_SendCommand(0x10); 182 for (UWORD j = 0; j < Height; j++) { 183 for (UWORD i = 0; i < Width; i++) { 184 EPD_2IN9BC_SendData(0xFF); 185 } 186 } 187 188 //send red data 189 EPD_2IN9BC_SendCommand(0x13); 190 for (UWORD j = 0; j < Height; j++) { 191 for (UWORD i = 0; i < Width; i++) { 192 EPD_2IN9BC_SendData(0xFF); 193 } 194 } 195 196 EPD_2IN9BC_SendCommand(0x12); 197 EPD_2IN9BC_ReadBusy(); 198 } 199 200 /****************************************************************************** 201 function : Sends the image buffer in RAM to e-Paper and displays 202 parameter: 203 ******************************************************************************/ 204 void EPD_2IN9BC_Display(const UBYTE *blackimage, const UBYTE *ryimage) 205 { 206 UWORD Width, Height; 207 Width = (EPD_2IN9BC_WIDTH % 8 == 0)? (EPD_2IN9BC_WIDTH / 8 ): (EPD_2IN9BC_WIDTH / 8 + 1); 208 Height = EPD_2IN9BC_HEIGHT; 209 210 EPD_2IN9BC_SendCommand(0x10); 211 for (UWORD j = 0; j < Height; j++) { 212 for (UWORD i = 0; i < Width; i++) { 213 EPD_2IN9BC_SendData(blackimage[i + j * Width]); 214 } 215 } 216 EPD_2IN9BC_SendCommand(0x92); 217 218 EPD_2IN9BC_SendCommand(0x13); 219 for (UWORD j = 0; j < Height; j++) { 220 for (UWORD i = 0; i < Width; i++) { 221 EPD_2IN9BC_SendData(ryimage[i + j * Width]); 222 } 223 } 224 EPD_2IN9BC_SendCommand(0x92); 225 226 EPD_2IN9BC_SendCommand(0x12); 227 EPD_2IN9BC_ReadBusy(); 228 } 229 230 /****************************************************************************** 231 function : Enter sleep mode 232 parameter: 233 ******************************************************************************/ 234 void EPD_2IN9BC_Sleep(void) 235 { 236 EPD_2IN9BC_SendCommand(0x02); // POWER_OFF 237 EPD_2IN9BC_ReadBusy(); 238 EPD_2IN9BC_SendCommand(0x07); // DEEP_SLEEP 239 EPD_2IN9BC_SendData(0xA5); // check code 240 }