SPI TFT / Touchscreen for STM32H7 (#25784)

Co-authored-by: thisiskeithb <13375512+thisiskeithb@users.noreply.github.com>
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
Alexander Gavrilenko
2023-07-02 04:16:12 +03:00
committed by GitHub
parent c483fe76c7
commit 3ea87ad54c
11 changed files with 388 additions and 140 deletions

View File

@@ -52,7 +52,6 @@ void TFT_SPI::init() {
SPIx.Init.NSS = SPI_NSS_SOFT; SPIx.Init.NSS = SPI_NSS_SOFT;
SPIx.Init.Mode = SPI_MODE_MASTER; SPIx.Init.Mode = SPI_MODE_MASTER;
SPIx.Init.Direction = (TFT_MISO_PIN == TFT_MOSI_PIN) ? SPI_DIRECTION_1LINE : SPI_DIRECTION_2LINES; SPIx.Init.Direction = (TFT_MISO_PIN == TFT_MOSI_PIN) ? SPI_DIRECTION_1LINE : SPI_DIRECTION_2LINES;
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
SPIx.Init.CLKPhase = SPI_PHASE_1EDGE; SPIx.Init.CLKPhase = SPI_PHASE_1EDGE;
SPIx.Init.CLKPolarity = SPI_POLARITY_LOW; SPIx.Init.CLKPolarity = SPI_POLARITY_LOW;
SPIx.Init.DataSize = SPI_DATASIZE_8BIT; SPIx.Init.DataSize = SPI_DATASIZE_8BIT;
@@ -61,12 +60,25 @@ void TFT_SPI::init() {
SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
SPIx.Init.CRCPolynomial = 10; SPIx.Init.CRCPolynomial = 10;
#ifndef STM32H7xx
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; // 18 MBit/s for F103, 21 MBit/s for F407, 25 MBit/s for F411
#else
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 20 MBit/s for H743
SPIx.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
SPIx.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
SPIx.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
SPIx.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
SPIx.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
SPIx.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
SPIx.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
SPIx.Init.IOSwap = SPI_IO_SWAP_DISABLE;
#endif
pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK); pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK);
pinmap_pinout(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI); pinmap_pinout(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI);
#if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN #if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN
pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO); pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO);
#endif #endif
pin_PullConfig(get_GPIO_Port(STM_PORT(digitalPinToPinName(TFT_SCK_PIN))), STM_LL_GPIO_PIN(digitalPinToPinName(TFT_SCK_PIN)), GPIO_PULLDOWN);
#ifdef SPI1_BASE #ifdef SPI1_BASE
if (SPIx.Instance == SPI1) { if (SPIx.Instance == SPI1) {
@@ -74,12 +86,17 @@ void TFT_SPI::init() {
#ifdef STM32F1xx #ifdef STM32F1xx
__HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE();
DMAtx.Instance = DMA1_Channel3; DMAtx.Instance = DMA1_Channel3;
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // SPI1 clock on F1 and F4 is two times faster than SPI2 and SPI3 clock
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
__HAL_RCC_DMA2_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE();
DMAtx.Instance = DMA2_Stream3; DMAtx.Instance = DMA2_Stream3;
DMAtx.Init.Channel = DMA_CHANNEL_3; DMAtx.Init.Channel = DMA_CHANNEL_3;
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // SPI1 clock on F1 and F4 is two times faster than SPI2 and SPI3 clock
#elif defined(STM32H7xx)
__HAL_RCC_DMA1_CLK_ENABLE();
DMAtx.Instance = DMA1_Stream4;
DMAtx.Init.Request = DMA_REQUEST_SPI1_TX;
#endif #endif
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
} }
#endif #endif
#ifdef SPI2_BASE #ifdef SPI2_BASE
@@ -92,6 +109,10 @@ void TFT_SPI::init() {
__HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE();
DMAtx.Instance = DMA1_Stream4; DMAtx.Instance = DMA1_Stream4;
DMAtx.Init.Channel = DMA_CHANNEL_0; DMAtx.Init.Channel = DMA_CHANNEL_0;
#elif defined(STM32H7xx)
__HAL_RCC_DMA1_CLK_ENABLE();
DMAtx.Instance = DMA1_Stream4;
DMAtx.Init.Request = DMA_REQUEST_SPI2_TX;
#endif #endif
} }
#endif #endif
@@ -105,25 +126,27 @@ void TFT_SPI::init() {
__HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE();
DMAtx.Instance = DMA1_Stream5; DMAtx.Instance = DMA1_Stream5;
DMAtx.Init.Channel = DMA_CHANNEL_0; DMAtx.Init.Channel = DMA_CHANNEL_0;
#elif defined(STM32H7xx)
__HAL_RCC_DMA1_CLK_ENABLE();
DMAtx.Instance = DMA1_Stream4;
DMAtx.Init.Request = DMA_REQUEST_SPI3_TX;
#endif #endif
} }
#endif #endif
HAL_SPI_Init(&SPIx);
DMAtx.Init.Direction = DMA_MEMORY_TO_PERIPH; DMAtx.Init.Direction = DMA_MEMORY_TO_PERIPH;
DMAtx.Init.PeriphInc = DMA_PINC_DISABLE; DMAtx.Init.PeriphInc = DMA_PINC_DISABLE;
DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
DMAtx.Init.Mode = DMA_NORMAL; DMAtx.Init.Mode = DMA_NORMAL;
DMAtx.Init.Priority = DMA_PRIORITY_LOW; DMAtx.Init.Priority = DMA_PRIORITY_LOW;
#ifdef STM32F4xx #if ANY(STM32F4xx, STM32H7xx)
DMAtx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; DMAtx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
#endif #endif
} }
void TFT_SPI::dataTransferBegin(uint16_t dataSize) { void TFT_SPI::dataTransferBegin(uint16_t dataSize) {
SPIx.Init.DataSize = dataSize == DATASIZE_8BIT ? SPI_DATASIZE_8BIT : SPI_DATASIZE_16BIT; SPIx.Init.DataSize = dataSize;
HAL_SPI_Init(&SPIx); HAL_SPI_Init(&SPIx);
WRITE(TFT_CS_PIN, LOW); WRITE(TFT_CS_PIN, LOW);
} }
@@ -148,28 +171,43 @@ uint32_t TFT_SPI::getID() {
uint32_t TFT_SPI::readID(const uint16_t inReg) { uint32_t TFT_SPI::readID(const uint16_t inReg) {
uint32_t data = 0; uint32_t data = 0;
#if PIN_EXISTS(TFT_MISO) #if PIN_EXISTS(TFT_MISO)
uint32_t BaudRatePrescaler = SPIx.Init.BaudRatePrescaler; const uint32_t oldPrescaler = SPIx.Init.BaudRatePrescaler;
uint32_t i;
SPIx.Init.BaudRatePrescaler = SPIx.Instance == SPI1 ? SPI_BAUDRATEPRESCALER_8 : SPI_BAUDRATEPRESCALER_4; SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
dataTransferBegin(DATASIZE_8BIT); dataTransferBegin(DATASIZE_8BIT);
writeReg(inReg); writeReg(inReg);
if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_RX(&SPIx); if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_RX(&SPIx);
__HAL_SPI_ENABLE(&SPIx);
for (i = 0; i < 4; i++) { #ifdef STM32H7xx
#if TFT_MISO_PIN != TFT_MOSI_PIN for (uint32_t i = 0; i < 4; i++) {
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) {} MODIFY_REG(SPIx.Instance->CR2, SPI_CR2_TSIZE, 1);
SPIx.Instance->DR = 0; __HAL_SPI_ENABLE(&SPIx);
#endif SET_BIT(SPIx.Instance->CR1, SPI_CR1_CSTART);
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_RXNE)) {}
data = (data << 8) | SPIx.Instance->DR; #if TFT_MISO_PIN != TFT_MOSI_PIN
} SPIx.Instance->TXDR = 0;
#endif
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_EOT)) {}
data = (data << 8) | SPIx.Instance->RXDR;
__HAL_SPI_DISABLE(&SPIx);
__HAL_SPI_CLEAR_EOTFLAG(&SPIx);
__HAL_SPI_CLEAR_TXTFFLAG(&SPIx);
}
#else
__HAL_SPI_ENABLE(&SPIx);
for (uint32_t i = 0; i < 4; i++) {
#if TFT_MISO_PIN != TFT_MOSI_PIN
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) {}
SPIx.Instance->DR = 0;
#endif
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_RXNE)) {}
data = (data << 8) | SPIx.Instance->DR;
}
#endif
dataTransferEnd(); dataTransferEnd();
SPIx.Init.BaudRatePrescaler = oldPrescaler;
SPIx.Init.BaudRatePrescaler = BaudRatePrescaler;
#endif #endif
return data >> 7; return data >> 7;
@@ -182,6 +220,9 @@ bool TFT_SPI::isBusy() {
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
#define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN)
#define __IS_DMA_CONFIGURED(__HANDLE__) ((__HANDLE__)->Instance->PAR != 0) #define __IS_DMA_CONFIGURED(__HANDLE__) ((__HANDLE__)->Instance->PAR != 0)
#elif defined(STM32H7xx)
#define __IS_DMA_ENABLED(__HANDLE__) (((DMA_Stream_TypeDef *)((__HANDLE__)->Instance))->CR & DMA_SxCR_EN)
#define __IS_DMA_CONFIGURED(__HANDLE__) (((DMA_Stream_TypeDef *)((__HANDLE__)->Instance))->PAR != 0)
#endif #endif
if (!__IS_DMA_CONFIGURED(&DMAtx)) return false; if (!__IS_DMA_CONFIGURED(&DMAtx)) return false;
@@ -193,8 +234,13 @@ bool TFT_SPI::isBusy() {
else { else {
// Check if DMA transfer completed flag is set // Check if DMA transfer completed flag is set
if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) == 0) return true; if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) == 0) return true;
// Check if SPI transmit butter is empty and SPI is idle #ifdef STM32H7xx
if ((!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) || (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY))) return true; // Check if SPI data transfer is completed
if (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_EOT)) return true;
#else
// Check if SPI is idle
if (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) return true;
#endif
} }
abort(); abort();
@@ -205,9 +251,15 @@ void TFT_SPI::abort() {
HAL_DMA_Abort(&DMAtx); // Abort DMA transfer if any HAL_DMA_Abort(&DMAtx); // Abort DMA transfer if any
HAL_DMA_DeInit(&DMAtx); HAL_DMA_DeInit(&DMAtx);
CLEAR_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); #ifdef STM32H7xx
CLEAR_BIT(SPIx.Instance->CFG1, SPI_CFG1_TXDMAEN);
__HAL_SPI_CLEAR_EOTFLAG(&SPIx);
__HAL_SPI_CLEAR_TXTFFLAG(&SPIx);
#else
CLEAR_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN);
#endif
dataTransferEnd(); // Stop SPI and deselect CS dataTransferEnd(); // Stop SPI and deselect CS
} }
void TFT_SPI::transmit(uint16_t data) { void TFT_SPI::transmit(uint16_t data) {
@@ -215,12 +267,24 @@ void TFT_SPI::transmit(uint16_t data) {
SPI_1LINE_TX(&SPIx); SPI_1LINE_TX(&SPIx);
#endif #endif
__HAL_SPI_ENABLE(&SPIx); #ifdef STM32H7xx
MODIFY_REG(SPIx.Instance->CR2, SPI_CR2_TSIZE, 1);
__HAL_SPI_ENABLE(&SPIx);
SET_BIT(SPIx.Instance->CR1, SPI_CR1_CSTART);
SPIx.Instance->DR = data; SPIx.Instance->TXDR = data;
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) {} while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_SR_EOT)) {}
while ( __HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {}
__HAL_SPI_CLEAR_EOTFLAG(&SPIx);
__HAL_SPI_CLEAR_TXTFFLAG(&SPIx);
#else
__HAL_SPI_ENABLE(&SPIx);
SPIx.Instance->DR = data;
while (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {}
#endif
__HAL_SPI_DISABLE(&SPIx);
#if TFT_MISO_PIN != TFT_MOSI_PIN #if TFT_MISO_PIN != TFT_MOSI_PIN
__HAL_SPI_CLEAR_OVRFLAG(&SPIx); // Clear overrun flag in 2 Lines communication mode because received data is not read __HAL_SPI_CLEAR_OVRFLAG(&SPIx); // Clear overrun flag in 2 Lines communication mode because received data is not read
@@ -237,35 +301,38 @@ void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t coun
dataTransferBegin(); dataTransferBegin();
HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(SPIx.Instance->DR), count); #ifdef STM32H7xx
__HAL_SPI_ENABLE(&SPIx); HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(SPIx.Instance->TXDR), count);
SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); // Enable Tx DMA Request CLEAR_BIT(SPIx.Instance->CFG1, SPI_CFG1_TXDMAEN);
MODIFY_REG(SPIx.Instance->CR2, SPI_CR2_TSIZE, count);
SET_BIT(SPIx.Instance->CFG1, SPI_CFG1_TXDMAEN); // Enable Tx DMA Request
__HAL_SPI_ENABLE(&SPIx);
SET_BIT(SPIx.Instance->CR1, SPI_CR1_CSTART);
#else
HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(SPIx.Instance->DR), count);
__HAL_SPI_ENABLE(&SPIx);
SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); // Enable Tx DMA Request
#endif
TERN_(TFT_SHARED_IO, while (isBusy())); TERN_(TFT_SHARED_IO, while (isBusy()));
} }
void TFT_SPI::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { void TFT_SPI::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
DMAtx.Init.MemInc = memoryIncrease; transmitDMA(memoryIncrease, data, count);
HAL_DMA_Init(&DMAtx);
if (TFT_MISO_PIN == TFT_MOSI_PIN)
SPI_1LINE_TX(&SPIx);
dataTransferBegin();
HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(SPIx.Instance->DR), count);
__HAL_SPI_ENABLE(&SPIx);
SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); // Enable Tx DMA Request
HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
while ( __HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {} #ifdef STM32H7xx
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_SR_EOT)) {}
#else
while (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {}
#endif
abort(); abort();
} }
#if ENABLED(USE_SPI_DMA_TC) #if ENABLED(USE_SPI_DMA_TC)
void TFT_SPI::TransmitDMA_IT(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { void TFT_SPI::transmitDMA_IT(uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
DMAtx.Init.MemInc = memoryIncrease; DMAtx.Init.MemInc = memoryIncrease;
HAL_DMA_Init(&DMAtx); HAL_DMA_Init(&DMAtx);

View File

@@ -25,8 +25,10 @@
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
#include "stm32f4xx_hal.h" #include "stm32f4xx_hal.h"
#elif defined(STM32H7xx)
#include "stm32h7xx_hal.h"
#else #else
#error SPI TFT is currently only supported on STM32F1 and STM32F4 hardware. #error SPI TFT is currently only supported on STM32F1, STM32F4 and STM32H7 hardware.
#endif #endif
#ifndef LCD_READ_ID #ifndef LCD_READ_ID
@@ -38,6 +40,7 @@
#define DATASIZE_8BIT SPI_DATASIZE_8BIT #define DATASIZE_8BIT SPI_DATASIZE_8BIT
#define DATASIZE_16BIT SPI_DATASIZE_16BIT #define DATASIZE_16BIT SPI_DATASIZE_16BIT
#define DATASIZE_32BIT SPI_DATASIZE_32BIT
#define TFT_IO_DRIVER TFT_SPI #define TFT_IO_DRIVER TFT_SPI
#define DMA_MAX_SIZE 0xFFFF #define DMA_MAX_SIZE 0xFFFF
@@ -51,7 +54,7 @@ private:
static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count); static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count);
static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count); static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count);
#if ENABLED(USE_SPI_DMA_TC) #if ENABLED(USE_SPI_DMA_TC)
static void TransmitDMA_IT(uint32_t memoryIncrease, uint16_t *data, uint16_t count); static void transmitDMA_IT(uint32_t memoryIncrease, uint16_t *data, uint16_t count);
#endif #endif
public: public:
@@ -71,7 +74,7 @@ public:
static void writeMultiple_DMA(uint16_t color, uint16_t count) { static uint16_t data; data = color; transmitDMA(DMA_MINC_DISABLE, &data, count); } static void writeMultiple_DMA(uint16_t color, uint16_t count) { static uint16_t data; data = color; transmitDMA(DMA_MINC_DISABLE, &data, count); }
#if ENABLED(USE_SPI_DMA_TC) #if ENABLED(USE_SPI_DMA_TC)
static void writeSequenceIT(uint16_t *data, uint16_t count) { TransmitDMA_IT(DMA_MINC_ENABLE, data, count); } static void writeSequenceIT(uint16_t *data, uint16_t count) { transmitDMA_IT(DMA_MINC_ENABLE, data, count); }
inline static void DMA_IRQHandler() { HAL_DMA_IRQHandler(&TFT_SPI::DMAtx); } inline static void DMA_IRQHandler() { HAL_DMA_IRQHandler(&TFT_SPI::DMAtx); }
#endif #endif

View File

@@ -56,7 +56,6 @@ void XPT2046::init() {
SPIx.Init.NSS = SPI_NSS_SOFT; SPIx.Init.NSS = SPI_NSS_SOFT;
SPIx.Init.Mode = SPI_MODE_MASTER; SPIx.Init.Mode = SPI_MODE_MASTER;
SPIx.Init.Direction = SPI_DIRECTION_2LINES; SPIx.Init.Direction = SPI_DIRECTION_2LINES;
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
SPIx.Init.CLKPhase = SPI_PHASE_2EDGE; SPIx.Init.CLKPhase = SPI_PHASE_2EDGE;
SPIx.Init.CLKPolarity = SPI_POLARITY_HIGH; SPIx.Init.CLKPolarity = SPI_POLARITY_HIGH;
SPIx.Init.DataSize = SPI_DATASIZE_8BIT; SPIx.Init.DataSize = SPI_DATASIZE_8BIT;
@@ -65,6 +64,20 @@ void XPT2046::init() {
SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
SPIx.Init.CRCPolynomial = 10; SPIx.Init.CRCPolynomial = 10;
#ifndef STM32H7xx
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 4.5 MBit/s for F103 and 5.25 MBit/s for F407
#else
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; // 5 MBit/s for H743
SPIx.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
SPIx.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
SPIx.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
SPIx.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
SPIx.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
SPIx.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
SPIx.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
SPIx.Init.IOSwap = SPI_IO_SWAP_DISABLE;
#endif
pinmap_pinout(digitalPinToPinName(TOUCH_SCK_PIN), PinMap_SPI_SCLK); pinmap_pinout(digitalPinToPinName(TOUCH_SCK_PIN), PinMap_SPI_SCLK);
pinmap_pinout(digitalPinToPinName(TOUCH_MOSI_PIN), PinMap_SPI_MOSI); pinmap_pinout(digitalPinToPinName(TOUCH_MOSI_PIN), PinMap_SPI_MOSI);
pinmap_pinout(digitalPinToPinName(TOUCH_MISO_PIN), PinMap_SPI_MISO); pinmap_pinout(digitalPinToPinName(TOUCH_MISO_PIN), PinMap_SPI_MISO);
@@ -141,13 +154,30 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) {
} }
uint16_t XPT2046::hardwareIO(uint16_t data) { uint16_t XPT2046::hardwareIO(uint16_t data) {
__HAL_SPI_ENABLE(&SPIx); #ifdef STM32H7xx
while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} MODIFY_REG(SPIx.Instance->CR2, SPI_CR2_TSIZE, 1);
SPIx.Instance->DR = data; __HAL_SPI_ENABLE(&SPIx);
while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} SET_BIT(SPIx.Instance->CR1, SPI_CR1_CSTART);
__HAL_SPI_DISABLE(&SPIx);
return SPIx.Instance->DR; SPIx.Instance->TXDR = data;
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_SR_EOT)) {}
data = SPIx.Instance->RXDR;
__HAL_SPI_DISABLE(&SPIx);
__HAL_SPI_CLEAR_EOTFLAG(&SPIx);
__HAL_SPI_CLEAR_TXTFFLAG(&SPIx);
return data;
#else
__HAL_SPI_ENABLE(&SPIx);
while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {}
SPIx.Instance->DR = data;
while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {}
__HAL_SPI_DISABLE(&SPIx);
return SPIx.Instance->DR;
#endif
} }
uint16_t XPT2046::softwareIO(uint16_t data) { uint16_t XPT2046::softwareIO(uint16_t data) {

View File

@@ -22,9 +22,13 @@
#pragma once #pragma once
#ifdef STM32F1xx #ifdef STM32F1xx
#include <stm32f1xx_hal.h> #include "stm32f1xx_hal.h"
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
#include <stm32f4xx_hal.h> #include "stm32f4xx_hal.h"
#elif defined(STM32H7xx)
#include "stm32h7xx_hal.h"
#else
#error SPI Touch Screen is currently only supported on STM32F1, STM32F4 and STM32H7 hardware.
#endif #endif
#include "../../../inc/MarlinConfig.h" #include "../../../inc/MarlinConfig.h"

View File

@@ -533,6 +533,20 @@
#endif #endif
#if ANY(HAS_WIRED_LCD, EXTENSIBLE_UI, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) #if ANY(HAS_WIRED_LCD, EXTENSIBLE_UI, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI)
/**
* HAS_DISPLAY indicates the display uses these MarlinUI methods...
* - update
* - abort_print
* - pause_print
* - resume_print
* - poweroff (for PSU_CONTROL and HAS_MARLINUI_MENU)
*
* ...and implements these MarlinUI methods:
* - zoffset_overlay (if BABYSTEP_GFX_OVERLAY or MESH_EDIT_GFX_OVERLAY are supported)
* - draw_kill_screen
* - kill_screen
* - draw_status_message
*/
#define HAS_DISPLAY 1 #define HAS_DISPLAY 1
#endif #endif

View File

@@ -2587,7 +2587,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
+ COUNT_ENABLED(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_GENERIC_12864_1_1) \ + COUNT_ENABLED(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_GENERIC_12864_1_1) \
+ COUNT_ENABLED(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \ + COUNT_ENABLED(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \
+ COUNT_ENABLED(MKS_12864OLED, MKS_12864OLED_SSD1306) \ + COUNT_ENABLED(MKS_12864OLED, MKS_12864OLED_SSD1306) \
+ COUNT_ENABLED(MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, ANET_ET4_TFT28, ANET_ET5_TFT35, BIQU_BX_TFT70, BTT_TFT35_SPI_V1_0) \ + COUNT_ENABLED(MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, \
MKS_ROBIN_TFT_V1_1R, ANET_ET4_TFT28, ANET_ET5_TFT35, BIQU_BX_TFT70, BTT_TFT35_SPI_V1_0) \
+ COUNT_ENABLED(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) \ + COUNT_ENABLED(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) \
+ COUNT_ENABLED(VIKI2, miniVIKI) \ + COUNT_ENABLED(VIKI2, miniVIKI) \
+ ENABLED(WYH_L12864) \ + ENABLED(WYH_L12864) \
@@ -2638,7 +2639,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
#undef IS_U8GLIB_SSD1306 #undef IS_U8GLIB_SSD1306
#undef IS_EXTUI #undef IS_EXTUI
#if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28, ANET_ET4_TFT28, ANET_ET5_TFT35, BIQU_BX_TFT70, BTT_TFT35_SPI_V1_0) #if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, \
TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28, ANET_ET4_TFT28, ANET_ET5_TFT35, BIQU_BX_TFT70, BTT_TFT35_SPI_V1_0)
#if NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI) #if NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI)
#error "TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI is required for your TFT. Please enable one." #error "TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI is required for your TFT. Please enable one."
#elif MANY(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI) #elif MANY(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI)

View File

@@ -1679,11 +1679,13 @@ void MarlinUI::host_status() {
#endif #endif
void MarlinUI::flow_fault() { #if ENABLED(FLOWMETER_SAFETY)
LCD_ALERTMESSAGE(MSG_FLOWMETER_FAULT); void MarlinUI::flow_fault() {
BUZZ(1000, 440); LCD_ALERTMESSAGE(MSG_FLOWMETER_FAULT);
TERN_(HAS_MARLINUI_MENU, return_to_status()); BUZZ(1000, 440);
} TERN_(HAS_MARLINUI_MENU, return_to_status());
}
#endif
void MarlinUI::pause_print() { void MarlinUI::pause_print() {
#if HAS_MARLINUI_MENU #if HAS_MARLINUI_MENU
@@ -1718,13 +1720,13 @@ void MarlinUI::host_status() {
#if HAS_TOUCH_BUTTONS #if HAS_TOUCH_BUTTONS
// /**
// Screen Click * Screen Click
// - On menu screens move directly to the touched item * - On menu screens move directly to the touched item
// - On menu screens, right side (last 3 cols) acts like a scroll - half up => prev page, half down = next page * - On menu screens, right side (last 3 cols) acts like a scroll - half up => prev page, half down = next page
// - On select screens (and others) touch the Right Half for +, Left Half for - * - On select screens (and others) touch the Left Half for , Right Half for
// - On edit screens, touch Up Half for -, Bottom Half to + * - On edit screens, touch Top Half for , Bottom Half for ↓
// */
void MarlinUI::screen_click(const uint8_t row, const uint8_t col, const uint8_t, const uint8_t) { void MarlinUI::screen_click(const uint8_t row, const uint8_t col, const uint8_t, const uint8_t) {
const millis_t now = millis(); const millis_t now = millis();
if (PENDING(now, next_button_update_ms)) return; if (PENDING(now, next_button_update_ms)) return;

View File

@@ -505,7 +505,10 @@ public:
static void abort_print(); static void abort_print();
static void pause_print(); static void pause_print();
static void resume_print(); static void resume_print();
static void flow_fault();
#if ENABLED(FLOWMETER_SAFETY)
static void flow_fault();
#endif
#if ALL(HAS_MARLINUI_MENU, PSU_CONTROL) #if ALL(HAS_MARLINUI_MENU, PSU_CONTROL)
static void poweroff(); static void poweroff();

View File

@@ -311,28 +311,15 @@
#elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI
#define TFT_A0_PIN EXP1_08_PIN
#define TFT_DC_PIN EXP1_08_PIN
#define TFT_CS_PIN EXP1_07_PIN
#define TFT_RESET_PIN EXP1_04_PIN
#define TFT_BACKLIGHT_PIN EXP1_03_PIN
//#define TFT_RST_PIN EXP2_07_PIN
#define TFT_MOSI_PIN EXP2_06_PIN
#define TFT_SCK_PIN EXP2_02_PIN
#define TFT_MISO_PIN EXP2_01_PIN
#define BTN_EN2 EXP2_05_PIN
#define BTN_EN1 EXP2_03_PIN
#define BTN_ENC EXP1_02_PIN
#define BEEPER_PIN EXP1_01_PIN
#define SDCARD_CONNECTION ONBOARD #define SDCARD_CONNECTION ONBOARD
#define TOUCH_BUTTONS_HW_SPI #define BEEPER_PIN EXP1_01_PIN
#define TOUCH_BUTTONS_HW_SPI_DEVICE 1
#define TFT_BUFFER_SIZE 2400 #define BTN_ENC EXP1_02_PIN
#define BTN_EN1 EXP2_03_PIN
#define BTN_EN2 EXP2_05_PIN
#define TFT_DC_PIN TFT_A0_PIN
#ifndef TFT_WIDTH #ifndef TFT_WIDTH
#define TFT_WIDTH 480 #define TFT_WIDTH 480
@@ -341,8 +328,41 @@
#define TFT_HEIGHT 320 #define TFT_HEIGHT 320
#endif #endif
#define LCD_READ_ID 0xD3 #if ENABLED(BTT_TFT35_SPI_V1_0)
#define LCD_USE_DMA_SPI // 480x320, 3.5", SPI Display with Rotary Encoder.
// Stock Display for the BIQU B1 SE.
#define TFT_CS_PIN EXP2_04_PIN
#define TFT_A0_PIN EXP2_07_PIN
#define TOUCH_CS_PIN EXP1_04_PIN
#define TOUCH_SCK_PIN EXP1_05_PIN
#define TOUCH_MISO_PIN EXP1_06_PIN
#define TOUCH_MOSI_PIN EXP1_03_PIN
#define TOUCH_INT_PIN EXP1_07_PIN
#elif ENABLED(MKS_TS35_V2_0)
#define TFT_CS_PIN EXP1_07_PIN
#define TFT_A0_PIN EXP1_08_PIN
#define TFT_RESET_PIN EXP1_04_PIN
#define TFT_BACKLIGHT_PIN EXP1_03_PIN
#define TOUCH_BUTTONS_HW_SPI
#define TOUCH_BUTTONS_HW_SPI_DEVICE 1
//#define TFT_RST_PIN EXP2_07_PIN
#define TFT_SCK_PIN EXP2_02_PIN
#define TFT_MISO_PIN EXP2_01_PIN
#define TFT_MOSI_PIN EXP2_06_PIN
#define LCD_READ_ID 0xD3
#define LCD_USE_DMA_SPI
#define TFT_BUFFER_SIZE 2400
#endif
#if ENABLED(TFT_CLASSIC_UI) #if ENABLED(TFT_CLASSIC_UI)
#ifndef TOUCH_CALIBRATION_X #ifndef TOUCH_CALIBRATION_X
@@ -380,7 +400,7 @@
#define SD_DETECT_PIN EXP2_07_PIN #define SD_DETECT_PIN EXP2_07_PIN
#else // !CR10_STOCKDISPLAY #else // !CR10_STOCKDISPLAY
#define LCD_PINS_RS EXP1_04_PIN #define LCD_PINS_RS EXP1_04_PIN
@@ -421,7 +441,7 @@
#define NEOPIXEL_PIN EXP1_06_PIN #define NEOPIXEL_PIN EXP1_06_PIN
#endif #endif
#else // !FYSETC_MINI_12864 #else // !FYSETC_MINI_12864
#if ENABLED(MKS_MINI_12864) #if ENABLED(MKS_MINI_12864)

View File

@@ -514,6 +514,61 @@
#endif // HAS_WIRED_LCD #endif // HAS_WIRED_LCD
#if HAS_SPI_TFT
#define BTN_ENC EXP1_02_PIN
#define BTN_EN1 EXP2_03_PIN
#define BTN_EN2 EXP2_05_PIN
#if ENABLED(BTT_TFT35_SPI_V1_0)
// 480x320, 3.5", SPI Display with Rotary Encoder.
// Stock Display for the BIQU B1 SE.
#define TFT_CS_PIN EXP2_04_PIN
#define TFT_A0_PIN EXP2_07_PIN
#define TOUCH_CS_PIN EXP1_04_PIN
#define TOUCH_SCK_PIN EXP1_05_PIN
#define TOUCH_MISO_PIN EXP1_06_PIN
#define TOUCH_MOSI_PIN EXP1_03_PIN
#define TOUCH_INT_PIN EXP1_07_PIN
#elif ENABLED(MKS_TS35_V2_0)
/** ------ ------
* BEEPER | 1 2 | BTN_ENC SPI1_MISO | 1 2 | SPI1_SCK
* TFT_BKL / LCD_EN | 3 4 | TFT_RESET / LCD_RS BTN_EN1 | 3 4 | SPI1_CS
* TOUCH_CS / LCD_D4 | 5 6 TOUCH_INT / LCD_D5 BTN_EN2 | 5 6 SPI1_MOSI
* SPI1_CS / LCD_D6 | 7 8 | SPI1_RS / LCD_D7 SPI1_RS | 7 8 | RESET
* GND | 9 10 | VCC GND | 9 10 | VCC
* ------ ------
* EXP1 EXP2
*/
#define TFT_CS_PIN EXP1_07_PIN // SPI1_CS
#define TFT_A0_PIN EXP1_08_PIN // SPI1_RS
#define TFT_DC_PIN TFT_DC_PIN
#define TFT_RESET_PIN EXP1_04_PIN
#define LCD_BACKLIGHT_PIN EXP1_03_PIN
#define TFT_BACKLIGHT_PIN LCD_BACKLIGHT_PIN
#define TOUCH_BUTTONS_HW_SPI
#define TOUCH_BUTTONS_HW_SPI_DEVICE 1
#define TOUCH_CS_PIN EXP1_05_PIN // SPI1_NSS
#define TOUCH_SCK_PIN EXP2_02_PIN // SPI1_SCK
#define TOUCH_MISO_PIN EXP2_01_PIN // SPI1_MISO
#define TOUCH_MOSI_PIN EXP2_06_PIN // SPI1_MOSI
#define LCD_READ_ID 0xD3
#define LCD_USE_DMA_SPI
#define TFT_BUFFER_SIZE 14400
#endif
#endif // HAS_SPI_TFT
// Alter timing for graphical display // Alter timing for graphical display
#if IS_U8GLIB_ST7920 #if IS_U8GLIB_ST7920
#ifndef BOARD_ST7920_DELAY_1 #ifndef BOARD_ST7920_DELAY_1
@@ -527,29 +582,6 @@
#endif #endif
#endif #endif
#if HAS_SPI_TFT
#define BTN_EN1 EXP2_03_PIN
#define BTN_EN2 EXP2_05_PIN
#define BTN_ENC EXP1_02_PIN
//
// e.g., BTT_TFT35_SPI_V1_0 (480x320, 3.5", SPI Stock Display with Rotary Encoder in BIQU B1 SE)
//
#define TFT_CS_PIN EXP2_04_PIN
#define TFT_A0_PIN EXP2_07_PIN
#define TFT_SCK_PIN EXP2_02_PIN
#define TFT_MISO_PIN EXP2_01_PIN
#define TFT_MOSI_PIN EXP2_06_PIN
#define TOUCH_INT_PIN EXP1_07_PIN
#define TOUCH_MISO_PIN EXP1_06_PIN
#define TOUCH_MOSI_PIN EXP1_03_PIN
#define TOUCH_SCK_PIN EXP1_05_PIN
#define TOUCH_CS_PIN EXP1_04_PIN
#endif
// //
// NeoPixel LED // NeoPixel LED
// //

View File

@@ -459,6 +459,98 @@
#define BTN_EN1 EXP2_03_PIN #define BTN_EN1 EXP2_03_PIN
#define BTN_EN2 EXP2_05_PIN #define BTN_EN2 EXP2_05_PIN
#elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI
#define BTN_EN1 EXP2_03_PIN
#define BTN_EN2 EXP2_05_PIN
#define TFT_DC_PIN TFT_A0_PIN
#ifndef TFT_WIDTH
#define TFT_WIDTH 480
#endif
#ifndef TFT_HEIGHT
#define TFT_HEIGHT 320
#endif
#if ENABLED(BTT_TFT35_SPI_V1_0)
// 480x320, 3.5", SPI Display with Rotary Encoder.
// Stock Display for the BIQU B1 SE.
#define TFT_CS_PIN EXP2_04_PIN
#define TFT_A0_PIN EXP2_07_PIN
#define TOUCH_CS_PIN EXP1_04_PIN
#define TOUCH_SCK_PIN EXP1_05_PIN
#define TOUCH_MISO_PIN EXP1_06_PIN
#define TOUCH_MOSI_PIN EXP1_03_PIN
#define TOUCH_INT_PIN EXP1_07_PIN
#ifndef TOUCH_CALIBRATION_X
#define TOUCH_CALIBRATION_X 17540
#endif
#ifndef TOUCH_CALIBRATION_Y
#define TOUCH_CALIBRATION_Y -11388
#endif
#ifndef TOUCH_OFFSET_X
#define TOUCH_OFFSET_X -21
#endif
#ifndef TOUCH_OFFSET_Y
#define TOUCH_OFFSET_Y 337
#endif
#ifndef TOUCH_ORIENTATION
#define TOUCH_ORIENTATION TOUCH_LANDSCAPE
#endif
#elif ENABLED(MKS_TS35_V2_0)
/** ------ ------
* BEEPER | 1 2 | BTN_ENC SPI1_MISO | 1 2 | SPI1_SCK
* TFT_BKL / LCD_EN | 3 4 | TFT_RESET / LCD_RS BTN_EN1 | 3 4 | SPI1_CS
* TOUCH_CS / LCD_D4 | 5 6 TOUCH_INT / LCD_D5 BTN_EN2 | 5 6 SPI1_MOSI
* SPI1_CS / LCD_D6 | 7 8 | SPI1_RS / LCD_D7 SPI1_RS | 7 8 | RESET
* GND | 9 10 | VCC GND | 9 10 | VCC
* ------ ------
* EXP1 EXP2
*/
#define TFT_CS_PIN EXP1_07_PIN // SPI1_CS
#define TFT_A0_PIN EXP1_08_PIN // SPI1_RS
#define TFT_RESET_PIN EXP1_04_PIN
#define LCD_BACKLIGHT_PIN EXP1_03_PIN
#define TFT_BACKLIGHT_PIN LCD_BACKLIGHT_PIN
#define TOUCH_BUTTONS_HW_SPI
#define TOUCH_BUTTONS_HW_SPI_DEVICE 1
#define TOUCH_CS_PIN EXP1_05_PIN // SPI1_NSS
#define TOUCH_SCK_PIN EXP2_02_PIN // SPI1_SCK
#define TOUCH_MISO_PIN EXP2_01_PIN // SPI1_MISO
#define TOUCH_MOSI_PIN EXP2_06_PIN // SPI1_MOSI
#define LCD_READ_ID 0xD3
#define LCD_USE_DMA_SPI
#define TFT_BUFFER_SIZE 14400
#ifndef TOUCH_CALIBRATION_X
#define TOUCH_CALIBRATION_X -17253
#endif
#ifndef TOUCH_CALIBRATION_Y
#define TOUCH_CALIBRATION_Y 11579
#endif
#ifndef TOUCH_OFFSET_X
#define TOUCH_OFFSET_X 514
#endif
#ifndef TOUCH_OFFSET_Y
#define TOUCH_OFFSET_Y -24
#endif
#ifndef TOUCH_ORIENTATION
#define TOUCH_ORIENTATION TOUCH_LANDSCAPE
#endif
#endif
#else #else
#define LCD_PINS_RS EXP1_04_PIN #define LCD_PINS_RS EXP1_04_PIN
@@ -517,27 +609,6 @@
#endif #endif
#endif #endif
#if HAS_SPI_TFT
//
// e.g., BTT_TFT35_SPI_V1_0 (480x320, 3.5", SPI Stock Display with Rotary Encoder in BIQU B1 SE)
//
#define TFT_CS_PIN EXP2_04_PIN
#define TFT_A0_PIN EXP2_07_PIN
#define TFT_SCK_PIN EXP2_02_PIN
#define TFT_MISO_PIN EXP2_01_PIN
#define TFT_MOSI_PIN EXP2_06_PIN
#define TOUCH_INT_PIN EXP1_07_PIN
#define TOUCH_MISO_PIN EXP1_06_PIN
#define TOUCH_MOSI_PIN EXP1_03_PIN
#define TOUCH_SCK_PIN EXP1_05_PIN
#define TOUCH_CS_PIN EXP1_04_PIN
#define BTN_EN1 EXP2_03_PIN
#define BTN_EN2 EXP2_05_PIN
#define BTN_ENC EXP1_02_PIN
#endif
// //
// NeoPixel LED // NeoPixel LED
// //