From 3957853296e8b15f3ea0ce575b0ccb8141b883fc Mon Sep 17 00:00:00 2001 From: Shuanglei Tao Date: Fri, 17 Jan 2025 10:28:18 +0800 Subject: [PATCH] optimize SPI data transfer --- EPD/DEV_Config.c | 5 +++++ EPD/DEV_Config.h | 1 + EPD/EPD_4in2.c | 8 ++++++++ EPD/EPD_4in2.h | 1 + EPD/EPD_4in2_V2.c | 7 +++++++ EPD/EPD_4in2_V2.h | 1 + EPD/EPD_4in2b_V2.c | 8 ++++++++ EPD/EPD_4in2b_V2.h | 1 + EPD/EPD_ble.c | 11 ++++------- EPD/EPD_ble.h | 2 +- 10 files changed, 37 insertions(+), 8 deletions(-) diff --git a/EPD/DEV_Config.c b/EPD/DEV_Config.c index cb535f7..81be0ef 100644 --- a/EPD/DEV_Config.c +++ b/EPD/DEV_Config.c @@ -72,6 +72,11 @@ void DEV_SPI_WriteByte(UBYTE value) nrf_drv_spi_transfer(&spi, &value, 1, NULL, 0); } +void DEV_SPI_WriteBytes(UBYTE *value, UBYTE len) +{ + nrf_drv_spi_transfer(&spi, value, len, NULL, 0); +} + UBYTE DEV_SPI_ReadByte(void) { UBYTE value; diff --git a/EPD/DEV_Config.h b/EPD/DEV_Config.h index 5c01b8f..1c0ed50 100644 --- a/EPD/DEV_Config.h +++ b/EPD/DEV_Config.h @@ -51,6 +51,7 @@ UBYTE DEV_Module_Init(void); void DEV_Module_Exit(void); void DEV_SPI_WriteByte(UBYTE value); +void DEV_SPI_WriteBytes(UBYTE *value, UBYTE len); UBYTE DEV_SPI_ReadByte(void); #endif diff --git a/EPD/EPD_4in2.c b/EPD/EPD_4in2.c index 7b027cb..d470421 100644 --- a/EPD/EPD_4in2.c +++ b/EPD/EPD_4in2.c @@ -73,6 +73,14 @@ void EPD_4IN2_SendData(UBYTE Data) DEV_Digital_Write(EPD_CS_PIN, 1); } +void EPD_4IN2_SendData2(UBYTE *Data, UBYTE Len) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_WriteBytes(Data, Len); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + /****************************************************************************** function : Wait until the busy_pin goes LOW parameter: diff --git a/EPD/EPD_4in2.h b/EPD/EPD_4in2.h index da5fb29..95c0ffb 100644 --- a/EPD/EPD_4in2.h +++ b/EPD/EPD_4in2.h @@ -44,6 +44,7 @@ void EPD_4IN2_Sleep(void); void EPD_4IN2_SendCommand(UBYTE Reg); void EPD_4IN2_SendData(UBYTE Data); +void EPD_4IN2_SendData2(UBYTE *Data, UBYTE Len); void EPD_4IN2_TurnOnDisplay(void); #endif diff --git a/EPD/EPD_4in2_V2.c b/EPD/EPD_4in2_V2.c index 249b965..3ec1138 100644 --- a/EPD/EPD_4in2_V2.c +++ b/EPD/EPD_4in2_V2.c @@ -70,6 +70,13 @@ void EPD_4IN2_V2_SendData(UBYTE Data) DEV_Digital_Write(EPD_CS_PIN, 1); } +void EPD_4IN2_V2_SendData2(UBYTE *Data, UBYTE Len) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_WriteBytes(Data, Len); + DEV_Digital_Write(EPD_CS_PIN, 1); +} /****************************************************************************** function : Wait until the busy_pin goes LOW parameter: diff --git a/EPD/EPD_4in2_V2.h b/EPD/EPD_4in2_V2.h index b47fdce..2a1cbe7 100644 --- a/EPD/EPD_4in2_V2.h +++ b/EPD/EPD_4in2_V2.h @@ -47,6 +47,7 @@ void EPD_4IN2_V2_Sleep(void); void EPD_4IN2_V2_SendCommand(UBYTE Reg); void EPD_4IN2_V2_SendData(UBYTE Data); +void EPD_4IN2_V2_SendData2(UBYTE *Data, UBYTE Len); void EPD_4IN2_V2_TurnOnDisplay(void); #endif diff --git a/EPD/EPD_4in2b_V2.c b/EPD/EPD_4in2b_V2.c index fdbb54f..d6b089e 100644 --- a/EPD/EPD_4in2b_V2.c +++ b/EPD/EPD_4in2b_V2.c @@ -69,6 +69,14 @@ void EPD_4IN2B_V2_SendData(UBYTE Data) DEV_Digital_Write(EPD_CS_PIN, 1); } +void EPD_4IN2B_V2_SendData2(UBYTE *Data, UBYTE Len) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_WriteBytes(Data, Len); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + /****************************************************************************** function : Wait until the busy_pin goes LOW parameter: diff --git a/EPD/EPD_4in2b_V2.h b/EPD/EPD_4in2b_V2.h index bfbdfdf..7d82ae3 100644 --- a/EPD/EPD_4in2b_V2.h +++ b/EPD/EPD_4in2b_V2.h @@ -43,6 +43,7 @@ void EPD_4IN2B_V2_Sleep(void); void EPD_4IN2B_V2_SendCommand(UBYTE Reg); void EPD_4IN2B_V2_SendData(UBYTE Data); +void EPD_4IN2B_V2_SendData2(UBYTE *Data, UBYTE Len); void EPD_4IN2B_V2_TurnOnDisplay(void); #endif diff --git a/EPD/EPD_ble.c b/EPD/EPD_ble.c index 3dcbaa7..85e0f33 100644 --- a/EPD/EPD_ble.c +++ b/EPD/EPD_ble.c @@ -41,13 +41,13 @@ /** EPD drivers */ static epd_driver_t epd_drivers[] = { {EPD_DRIVER_4IN2, EPD_4IN2_Init, EPD_4IN2_Clear, - EPD_4IN2_SendCommand, EPD_4IN2_SendData, + EPD_4IN2_SendCommand, EPD_4IN2_SendData2, EPD_4IN2_TurnOnDisplay, EPD_4IN2_Sleep}, {EPD_DRIVER_4IN2_V2, EPD_4IN2_V2_Init, EPD_4IN2_V2_Clear, - EPD_4IN2_V2_SendCommand, EPD_4IN2_V2_SendData, + EPD_4IN2_V2_SendCommand, EPD_4IN2_V2_SendData2, EPD_4IN2_V2_TurnOnDisplay, EPD_4IN2_V2_Sleep}, {EPD_DRIVER_4IN2B_V2, EPD_4IN2B_V2_Init, EPD_4IN2B_V2_Clear, - EPD_4IN2B_V2_SendCommand, EPD_4IN2B_V2_SendData, + EPD_4IN2B_V2_SendCommand, EPD_4IN2B_V2_SendData2, EPD_4IN2B_V2_TurnOnDisplay, EPD_4IN2B_V2_Sleep}, }; @@ -178,10 +178,7 @@ static void epd_service_process(ble_epd_t * p_epd, uint8_t * p_data, uint16_t le break; case EPD_CMD_SEND_DATA: - for (UWORD i = 0; i < length - 1; i++) - { - p_epd->driver->send_data(p_data[i + 1]); - } + p_epd->driver->send_data(&p_data[1], length - 1); break; case EPD_CMD_DISPLAY: diff --git a/EPD/EPD_ble.h b/EPD/EPD_ble.h index 6e0ce90..030ede6 100644 --- a/EPD/EPD_ble.h +++ b/EPD/EPD_ble.h @@ -76,7 +76,7 @@ typedef struct void (*init)(void); /**< Initialize the e-Paper register */ void (*clear)(void); /**< Clear screen */ void (*send_command)(UBYTE Reg); /**< send command */ - void (*send_data)(UBYTE Data); /**< send data */ + void (*send_data)(UBYTE *Data, UBYTE Len); /**< send data */ void (*display)(void); /**< Sends the image buffer in RAM to e-Paper and displays */ void (*sleep)(void); /**< Enter sleep mode */ } epd_driver_t;