This library provides functions for supporting the 2.7" EPD Display (E2271CS021). This is the same display as used on the CY8CKIT-028-EPD shield.
https://www.electronicsdatasheets.com/download/59018c25e34e2457312cc1ab.pdf?format=pdf
- EINK emWin application
- EINK driver usage without emWin
- EINK emWin FreeRTOS application
- EINK emWin mbed application
Follow the steps below in order to create a simple emWin application and display some text on it.
- Create an empty application
- Add this library to the application
- Add emWin library to the application
- Enable EMWIN_NOSNTS emWin library option by adding it to the Makefile COMPONENTS list:
COMPONENTS=EMWIN_NOSNTS
- place the following code in the main.c file:
#include "cyhal.h"
#include "cybsp.h"
#include "GUI.h"
#include "mtb_e2271cs021.h"
#include "LCDConf.h"
cyhal_spi_t spi;
// The pins used here work with the CY8CKIT-028-EPD shield and the CY8CKIT-062-BLE
// or CY8CKIT-062-WIFI-BT kit.
// If the display is being used on different hardware the mappings will be different.
const mtb_e2271cs021_pins_t pins =
{
.spi_mosi = CYBSP_D11,
.spi_miso = CYBSP_D12,
.spi_sclk = CYBSP_D13,
.spi_cs = CYBSP_D10,
.reset = CYBSP_D2,
.busy = CYBSP_D3,
.discharge = CYBSP_D5,
.enable = CYBSP_D4,
.border = CYBSP_D6,
.io_enable = CYBSP_D7
};
uint8_t previous_frame[PV_EINK_IMAGE_SIZE] = {0};
uint8_t *current_frame;
int main(void)
{
cy_rslt_t result;
// Initialize the device and board peripherals
result = cybsp_init();
CY_ASSERT(result == CY_RSLT_SUCCESS);
__enable_irq();
// Initialize SPI and EINK display
result = cyhal_spi_init(&spi, pins.spi_mosi, pins.spi_miso, pins.spi_sclk, NC, NULL, 8,
CYHAL_SPI_MODE_00_MSB, false);
if (CY_RSLT_SUCCESS == result)
{
result = cyhal_spi_set_frequency(&spi, 20000000);
}
result = mtb_e2271cs021_init(&pins, &spi);
CY_ASSERT(result == CY_RSLT_SUCCESS);
current_frame = (uint8_t*)LCD_GetDisplayBuffer();
GUI_Init();
GUI_SetTextMode(GUI_TM_NORMAL);
GUI_SetFont(GUI_FONT_32B_1);
GUI_SetBkColor(GUI_WHITE);
GUI_SetColor(GUI_BLACK);
GUI_SetTextAlign(GUI_ALIGN_HCENTER | GUI_ALIGN_HCENTER);
GUI_Clear();
GUI_DispStringAt("Hello World", LCD_GetXSize() / 2, (LCD_GetYSize() / 2) - (GUI_GetFontSizeY() / 2));
// update the display
mtb_e2271cs021_show_frame(previous_frame, current_frame, MTB_E2271CS021_FULL_4STAGE, true);
while (1);
}
- Build the application and program the kit.
The EINK library can be also used standalone. Follow the steps below to create a simple application which shows an interesting pattern on the display.
- Create an empty application
- Add this library to the application
- Place the following code in the main.c file:
#include "cyhal.h"
#include "cybsp.h"
#include "mtb_e2271cs021.h"
cyhal_spi_t spi;
// The pins used here work with the CY8CKIT-028-EPD shield and the CY8CKIT-062-BLE
// or CY8CKIT-062-WIFI-BT kit.
// If the display is being used on different hardware the mappings will be different.
const mtb_e2271cs021_pins_t pins =
{
.spi_mosi = CYBSP_D11,
.spi_miso = CYBSP_D12,
.spi_sclk = CYBSP_D13,
.spi_cs = CYBSP_D10,
.reset = CYBSP_D2,
.busy = CYBSP_D3,
.discharge = CYBSP_D5,
.enable = CYBSP_D4,
.border = CYBSP_D6,
.io_enable = CYBSP_D7
};
uint8_t previous_frame[PV_EINK_IMAGE_SIZE] = {0};
uint8_t current_frame[PV_EINK_IMAGE_SIZE] = {0};
int main(void)
{
cy_rslt_t result;
uint32_t i;
// Initialize the device and board peripherals
result = cybsp_init();
CY_ASSERT(result == CY_RSLT_SUCCESS);
__enable_irq();
// Initialize SPI and EINK display
result = cyhal_spi_init(&spi, pins.spi_mosi, pins.spi_miso, pins.spi_sclk, NC, NULL, 8,
CYHAL_SPI_MODE_00_MSB, false);
if (CY_RSLT_SUCCESS == result)
{
result = cyhal_spi_set_frequency(&spi, 20000000);
}
result = mtb_e2271cs021_init(&pins, &spi);
// Fill the EINK buffer with an interesting pattern
for (i = 0; i < PV_EINK_IMAGE_SIZE; i++)
{
current_frame[i] = i % 0xFF;
}
// Update the display
mtb_e2271cs021_show_frame(previous_frame, current_frame, MTB_E2271CS021_FULL_4STAGE, true);
while (1);
}
- Build the application and program the kit.
Follow the steps bellow in order to create a simple emWin application and display some text.
- Create an empty application
- Add this library to the application
- Add the emwin, abstraction-rtos, and freertos libraries to the application
- Enable EMWIN_OSNTS emWin library option by adding it to the Makefile COMPONENTS list:
COMPONENTS=EMWIN_OSNTS FREERTOS
- Edit the FreeRTOSConfig.h file in the freertos library. Or make a copy of it in the top level of your project directory. Comment out the #warning statement and update these definitions.
#define configUSE_MUTEXES (1u)
#define configUSE_RECURSIVE_MUTEXES (1u)
#define configUSE_COUNTING_SEMAPHORES (1u)
#define configSUPPORT_STATIC_ALLOCATION (1u)
#define configSUPPORT_DYNAMIC_ALLOCATION (1u)
#define configTOTAL_HEAP_SIZE (1024*48u)
#define configUSE_TRACE_FACILITY (1u)
- Place the following code in the main.c file:
#include "FreeRTOS.h"
#include "GUI.h"
#include "LCDConf.h"
#include "cybsp.h"
#include "cyhal.h"
#include "mtb_e2271cs021.h"
#include "task.h"
cyhal_spi_t spi;
// The pins used here work with the CY8CKIT-028-EPD shield and the CY8CKIT-062-BLE
// or CY8CKIT-062-WIFI-BT kit.
// If the display is being used on different hardware the mappings will be different.
const mtb_e2271cs021_pins_t pins =
{
.spi_mosi = CYBSP_D11,
.spi_miso = CYBSP_D12,
.spi_sclk = CYBSP_D13,
.spi_cs = CYBSP_D10,
.reset = CYBSP_D2,
.busy = CYBSP_D3,
.discharge = CYBSP_D5,
.enable = CYBSP_D4,
.border = CYBSP_D6,
.io_enable = CYBSP_D7
};
uint8_t previous_frame[PV_EINK_IMAGE_SIZE] = {0};
uint8_t *current_frame;
void guiTask(void *arg)
{
current_frame = (uint8_t*)LCD_GetDisplayBuffer();
GUI_Init();
GUI_SetTextMode(GUI_TM_NORMAL);
GUI_SetFont(GUI_FONT_32B_1);
GUI_SetBkColor(GUI_WHITE);
GUI_SetColor(GUI_BLACK);
GUI_SetTextAlign(GUI_ALIGN_HCENTER | GUI_ALIGN_HCENTER);
GUI_Clear();
GUI_DispStringAt("Hello World!", LCD_GetXSize() / 2, (LCD_GetYSize() / 2) - (GUI_GetFontSizeY() / 2));
// update the display
mtb_e2271cs021_show_frame(previous_frame, current_frame, MTB_E2271CS021_FULL_4STAGE, true);
}
int main(void)
{
cy_rslt_t result;
// Initialize the device and board peripherals
result = cybsp_init();
CY_ASSERT(result == CY_RSLT_SUCCESS);
__enable_irq();
// Initialize SPI and EINK display
result = cyhal_spi_init(&spi, pins.spi_mosi, pins.spi_miso, pins.spi_sclk, NC, NULL, 8,
CYHAL_SPI_MODE_00_MSB, false);
if (CY_RSLT_SUCCESS == result)
{
result = cyhal_spi_set_frequency(&spi, 20000000);
}
result = mtb_e2271cs021_init(&pins, &spi);
CY_ASSERT(result == CY_RSLT_SUCCESS);
xTaskCreate(guiTask, "GUI Task", 1024*10, 0, 1, 0);
vTaskStartScheduler();
while (1); // Will never get here
}
- Build the application and program the kit.
Follow the steps bellow in order to create a simple emWin application and display some text.
- Create a new application
mbed new tft_app
cd tft_app
- Add this library to the application
mbed add http://devops-git.aus.cypress.com/repo-staging/display-eink-e2271cs021.git
- Add the emwin library to the application
mbed add http://devops-git.aus.cypress.com/repo-staging/emwin.git
- Enable EMWIN_OSNTS emWin library option by adding it to the mbed_app.json file
"target_overrides": {
"*":{
"target.components_add": ["EMWIN_OSNTS"],
- Place the following code in the main.cpp file:
#include "GUI.h"
#include "LCDConf.h"
#include "cy_pdl.h"
#include "cy_utils.h"
#include "cybsp.h"
#include "cycfg.h"
#include "mbed.h"
#include "mtb_e2271cs021.h"
cyhal_spi_t spi;
// The pins used here work with the CY8CKIT-028-EPD shield and the CY8CKIT-062-BLE
// or CY8CKIT-062-WIFI-BT kit.
// If the display is being used on different hardware the mappings will be different.
const mtb_e2271cs021_pins_t pins =
{
.spi_mosi = CYBSP_D11,
.spi_miso = CYBSP_D12,
.spi_sclk = CYBSP_D13,
.spi_cs = CYBSP_D10,
.reset = CYBSP_D2,
.busy = CYBSP_D3,
.discharge = CYBSP_D5,
.enable = CYBSP_D4,
.border = CYBSP_D6,
.io_enable = CYBSP_D7
};
uint8_t previous_frame[PV_EINK_IMAGE_SIZE] = {0};
uint8_t *current_frame;
int main(void)
{
cy_rslt_t result;
// Initialize the device and board peripherals
cybsp_init();
__enable_irq();
// Initialize SPI and EINK display
result = cyhal_spi_init(&spi, pins.spi_mosi, pins.spi_miso, pins.spi_sclk, NC, NULL, 8,
CYHAL_SPI_MODE_00_MSB, false);
if (CY_RSLT_SUCCESS == result)
{
result = cyhal_spi_set_frequency(&spi, 20000000);
}
result = mtb_e2271cs021_init(&pins, &spi);
CY_ASSERT(result == CY_RSLT_SUCCESS);
current_frame = (uint8_t*)LCD_GetDisplayBuffer();
GUI_Init();
GUI_SetTextMode(GUI_TM_NORMAL);
GUI_SetFont(GUI_FONT_32B_1);
GUI_SetBkColor(GUI_WHITE);
GUI_SetColor(GUI_BLACK);
GUI_SetTextAlign(GUI_ALIGN_HCENTER | GUI_ALIGN_HCENTER);
GUI_Clear();
GUI_DispStringAt("Hello World!", LCD_GetXSize() / 2, (LCD_GetYSize() / 2) - (GUI_GetFontSizeY() / 2));
// update the display
mtb_e2271cs021_show_frame(previous_frame, current_frame, MTB_E2271CS021_FULL_4STAGE, true);
ThisThread::sleep_for(osWaitForever);
}
- Build the application and program the kit.
mbed compile --target CY8CKIT_062_BLE --toolchain GCC_ARM --flash
or
mbed compile --target CY8CKIT_062_WIFI_BT --toolchain GCC_ARM --flash
- API Reference Guide
- Cypress Semiconductor, an Infineon Technologies Company
- Cypress Semiconductor GitHub
- ModusToolbox
- PSoC 6 Code Examples using ModusToolbox IDE
- PSoC 6 Middleware
- PSoC 6 Resources - KBA223067
© Cypress Semiconductor Corporation, 2019-2021.