Welcome to the Bridgetek Community!
Please read our Welcome Note
Technical Support enquires
please contact the team @ Bridgetek Support
Please refer to our website for detailed information on all our products - Bridgetek - Bridging Technology
TFT_qspi_cmd_setrotate(0);
TFT_qspi_write16(REG_GPIOX_DIR, 0xFFFF);
TFT_qspi_write16(REG_GPIOX, 0xFFFF);
<---------------------- TO HERE
/* after this display is visible on the LCD */
TFT_qspi_write8(REG_PCLK, DispPCLK);
//while (TFT_busy() != E_OK){};
TFT_qspi_WaitCmdfifo_empty();
/* If the status of the flash is 0 (INIT) Attach it */
while (EVE_FLASH_STATUS_DETACHED == TFT_qspi_read8(REG_FLASH_STATUS))
{
TFT_qspi_dl_cmd(CMD_FLASHATTACH);
}
/* Initialize the onboard flash and put in FAST mode
* Need to check the return value and not proceed if
* there is an error so we can read in the Fonts
*/
if (TFT_init_flash() == E_OK)
{
/* Read the image from the flash */
uint32_t flashCommands[] =
{
CMD_FLASHREAD, (uint32_t) MEM_FONT34, (uint32_t) 198592, (uint32_t) 280 + 40,
CMD_FLASHREAD, (uint32_t) CAR_IMAGE_HORIZONTAL, (uint32_t) 198912, (uint32_t) 92000 + 32
};
TFT_qspi_cmd_burst(flashCommands, sizeof(flashCommands) / sizeof(flashCommands[0]));
while (TFT_busy() != E_OK)
{
};
TFT_qspi_WaitCmdfifo_empty();
}
<---------------------- OR HERE
TFT_qspi_dl_cmd(CMD_DLSTART);
TFT_qspi_dl_cmd(DL_CLEAR_COLOR_RGB | WHITE);
TFT_qspi_dl_cmd(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG);
TFT_qspi_dl_cmd(DL_BEGIN);
TFT_qspi_dl_cmd(COLOR_RGB(120, 6, 6));
TFT_qspi_cmd_setfont2(13, MEM_FONT34, 0); /* assign bitmap handle to a custom font */
TFT_qspi_cmd_text((DispWidth / 2), (DispHeight / 5) - 15, 13, EVE_OPT_CENTERX, "Please wait...");
TFT_qspi_dl_cmd(COLOR_RGB(20, 20, 130));
TFT_qspi_cmd_spinner(DispWidth / 2, DispHeight / 2, 0, 0);
//TFT_qspi_write8(REG_PWM_DUTY, 25);
void TFT_qspi_init()
{
tft_active = 0;
HAL_GPIO_WritePin(MCU_DISP_RST_GPIO_Port, MCU_DISP_RST_Pin, GPIO_PIN_RESET);
HAL_Delay(40); /* minimum time for power-down is 5ms */
HAL_GPIO_WritePin(MCU_DISP_RST_GPIO_Port, MCU_DISP_RST_Pin, GPIO_PIN_SET);
HAL_Delay(40); /* minimum time to allow from rising PD_N to first access is 20ms */
//Explicitly put SPI in single mode
TFT_write8(REG_SPI_WIDTH, 0x00);
//External Crystal
TFT_sendCmd(CMD_CLKEXT, 0x00);
HAL_Delay(100);
/* set clock to 72 MHz */
TFT_sendCmd(CMD_CLKSEL, 0x46);
//Reset the device
TFT_sendCmd(EVE_RST_PULSE, 0x00);
/* give EVE time to power up */
HAL_Delay(40);
/* start EVE */
TFT_sendCmd(CMD_ACTIVE, 0x00);
HAL_Delay(300);
/* tell EVE that we changed the frequency to 72MHz */
TFT_write32(REG_FREQUENCY, 72000000);
/* read the frequency to verify */
if (TFT_read32(REG_FREQUENCY) != 72000000)
Error_Handler();
TFT_write8(REG_TRIM, 25);
/* read the ID */
while (TFT_readId(REG_ID) != 0x7c)
{
};
/* read REG_CPURESET to confirm 0 is returned */
uint8_t engine_status;
/* Read REG_CPURESET to check if engines are ready.
Bit 0 for coprocessor engine,
Bit 1 for touch engine,
Bit 2 for audio engine.
*/
engine_status = TFT_read8(REG_CPURESET);
while (engine_status != 0x00)
{
engine_status = TFT_read8(REG_CPURESET);
HAL_Delay(100);
}
TFT_write16(REG_PWM_HZ, 4000);
TFT_write8(REG_PWM_DUTY, 0);
/* switch to QSPI */
TFT_write8(REG_SPI_WIDTH, 0x02);
while (TFT_qspi_read8(REG_SPI_WIDTH) != 0x02)
{
TFT_write8(REG_SPI_WIDTH, 0x02);
};
/* Check if everything is okay */
if (TFT_qspi_read16(REG_CMD_READ) == 0xFFF)
{
uint8_t Offset = 0;
uint8_t ErrChar;
uint8_t result[128 + 1]; // Buffer to hold the full string (including null terminator)
int result_index = 0;
do
{
// Get the error character and display it
ErrChar = TFT_qspi_read8(EVE_RAM_ERR_REPORT + Offset);
// Only append valid characters (non-null)
if (ErrChar != 0 && result_index < 128)
{
result[result_index++] = ErrChar;
}
Offset++;
}
while ((ErrChar != 0) && (Offset < 128)); // when the last stuffed character was null, we are done
// Null-terminate the string
result[result_index] = '\0';
// Now the full string is in 'result', which you can use or print
printf("Captured string: %s\n", result);
sprintf((char*) message, "Captured string: %s\r\n", result);
CDC_Transmit_FS((uint8_t*) message, strlen((char*) message));
}
TFT_qspi_write16(REG_HSIZE, DispWidth); /* 800 */
TFT_qspi_write16(REG_VSIZE, DispHeight); /* 480 */
TFT_qspi_write16(REG_HCYCLE, DispHCycle); /* 816 */
TFT_qspi_write16(REG_HOFFSET, DispHOffset); /* 8 */
TFT_qspi_write16(REG_HSYNC0, DispHSync0); /* 0 */
TFT_qspi_write16(REG_HSYNC1, DispHSync1); /* 4 */
TFT_qspi_write16(REG_VCYCLE, DispVCycle); /* 496 */
TFT_qspi_write16(REG_VOFFSET, DispVOffset); /* 8 */
TFT_qspi_write16(REG_VSYNC0, DispVSync0); /* 0 */
TFT_qspi_write16(REG_VSYNC1, DispVSync1); /* 4 */
TFT_qspi_write8(REG_SWIZZLE, DispSwizzle); /* 0 */
TFT_qspi_write8(REG_PCLK_POL, DispPCLKPol); /* 1 */
TFT_qspi_write16(REG_CSPREAD, DispCSpread); /* 0 */
TFT_qspi_write16(REG_DITHER, DispDither); /* 0 */
TFT_qspi_write16(REG_PCLK_FREQ, DispPLCLKFREQ); /* 0xD14 */
TFT_qspi_write8(REG_PCLK_2X, DispPCLK2x); /* 0 */
/* disable Audio for now */
TFT_qspi_write8(REG_VOL_PB, 0U); /* turn recorded audio volume down, reset-default is 0xff */
TFT_qspi_write8(REG_VOL_SOUND, 0U); /* turn synthesizer volume down, reset-default is 0xff */
TFT_qspi_write16(REG_SOUND, EVE_MUTE); /* set synthesizer to mute */
uint32_t initCommands[] =
{
CMD_DLSTART,
DL_CLEAR_COLOR_RGB | WHITE,
DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG, /* clear the screen - this and the previous prevent artifacts between lists, Attributes are the color, stencil and tag buffers */
DL_DISPLAY,
CMD_SWAP // display, in this case nothing
};
TFT_qspi_cmd_burst(initCommands,
sizeof(initCommands) / sizeof(initCommands[0]));
//while (TFT_busy() != E_OK){};
TFT_qspi_WaitCmdfifo_empty();
if (TFT_qspi_read16(REG_CMD_READ) == 0xFFF)
{
uint8_t Offset = 0;
uint8_t ErrChar;
uint8_t result[128 + 1]; // Buffer to hold the full string (including null terminator)
int result_index = 0;
do
{
// Get the error character and display it
ErrChar = TFT_qspi_read8(EVE_RAM_ERR_REPORT + Offset);
// Only append valid characters (non-null)
if (ErrChar != 0 && result_index < 128)
{
result[result_index++] = ErrChar;
}
Offset++;
}
while ((ErrChar != 0) && (Offset < 128)); // when the last stuffed character was null, we are done
// Null-terminate the string
result[result_index] = '\0';
// Now the full string is in 'result', which you can use or print
printf("Captured string: %s\n", result);
sprintf((char*) message, "Captured string: %s\r\n", result);
CDC_Transmit_FS((uint8_t*) message, strlen((char*) message));
}
TFT_qspi_cmd_setrotate(0);
TFT_qspi_write16(REG_GPIOX_DIR, 0xFFFF);
TFT_qspi_write16(REG_GPIOX, 0xFFFF);
/* after this display is visible on the LCD */
TFT_qspi_write8(REG_PCLK, DispPCLK);
//while (TFT_busy() != E_OK){};
TFT_qspi_WaitCmdfifo_empty();
/* If the status of the flash is 0 (INIT) Attach it */
while (EVE_FLASH_STATUS_DETACHED == TFT_qspi_read8(REG_FLASH_STATUS))
{
TFT_qspi_dl_cmd(CMD_FLASHATTACH);
}
/* Initialize the onboard flash and put in FAST mode
* Need to check the return value and not proceed if
* there is an error so we can read in the Fonts
*/
if (TFT_init_flash() == E_OK)
{
/* Read the image from the flash */
uint32_t flashCommands[] =
{
CMD_FLASHREAD, (uint32_t) MEM_FONT34, (uint32_t) 198592, (uint32_t) 280 + 40,
CMD_FLASHREAD, (uint32_t) CAR_IMAGE_HORIZONTAL, (uint32_t) 198912, (uint32_t) 92000 + 32
};
TFT_qspi_cmd_burst(flashCommands, sizeof(flashCommands) / sizeof(flashCommands[0]));
while (TFT_busy() != E_OK)
{
};
TFT_qspi_WaitCmdfifo_empty();
}
TFT_qspi_dl_cmd(CMD_DLSTART);
TFT_qspi_dl_cmd(DL_CLEAR_COLOR_RGB | WHITE);
TFT_qspi_dl_cmd(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG);
TFT_qspi_dl_cmd(DL_BEGIN);
TFT_qspi_dl_cmd(COLOR_RGB(120, 6, 6));
TFT_qspi_cmd_setfont2(13, MEM_FONT34, 0); /* assign bitmap handle to a custom font */
TFT_qspi_cmd_text((DispWidth / 2), (DispHeight / 5) - 15, 13, EVE_OPT_CENTERX, "Please wait...");
TFT_qspi_dl_cmd(COLOR_RGB(20, 20, 130));
TFT_qspi_cmd_spinner(DispWidth / 2, DispHeight / 2, 0, 0);
//TFT_qspi_write8(REG_PWM_DUTY, 25);
HAL_Delay(2000);
TFT_qspi_cmd_stop();
TFT_qspi_WaitCmdfifo_empty();
/* set the precision of VERTEX2F coordinates */
#if defined (IPS_70) || (IPS_101)
/* VERTEX2F range: -2048 to 2047 */
//TFT_qspi_dl_cmd(VERTEX_FORMAT(3));
pixel_precision = 8;
#else
/* use default VERTEX_FORMAT(3) with VERTEX2F range: -1024 to 1023 */
pixel_precision = 16;
#endif
tft_active = 1;
}
void TFT_qspi_write8(uint32_t const address, uint32_t const data)
{
QSPI_CommandTypeDef sCommand = {0};
// Set up the command structure
sCommand.InstructionMode = QSPI_INSTRUCTION_4_LINES; // Instruction sent over 1 line
sCommand.Instruction = (uint8_t) (address >> 16U) | 0X80; //Get the first byte, should look like 0x30
sCommand.AddressMode = QSPI_ADDRESS_4_LINES; // Address sent over 1 line
sCommand.AddressSize = QSPI_ADDRESS_16_BITS; // 16-bit address
sCommand.Address = address & 0xFFFF; // Mask off the first byte and keep the last two bytes
sCommand.DataMode = QSPI_DATA_4_LINES; // Data mode for receiving ID
sCommand.NbData = 2; // Sending 2 bytes
sCommand.DummyCycles = 0; // No dummy cycles
sCommand.DdrMode = QSPI_DDR_MODE_DISABLE; // Disable DDR mode
sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; // Send instruction every command
// Send the command (instruction and address)
if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
Error_Handler();
// Now write the data
uint8_t localData[2] = {(uint8_t) data & 0xFF,
(uint8_t) (data >> 8) & 0xFF};
if (HAL_QSPI_Transmit(&hqspi, localData, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
Error_Handler();
return;
}
void StartDisplayTask(void *argument)
{
/* USER CODE BEGIN StartDisplayTask */
/* Infinite loop */
(void)argument;
const TickType_t period = pdMS_TO_TICKS(16); // ~60 Hz
TickType_t last = xTaskGetTickCount();
bool initialized = false;
for (;;)
{
if(!initialized)
{
initialized = true;
TFT_qspi_init();
}
//TFT_touch(); - Called from another task
TFT_display();
vTaskDelayUntil(&last, period);
}
/* USER CODE END StartDisplayTask */
}