✨ 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:
committed by
GitHub
parent
c483fe76c7
commit
3ea87ad54c
@@ -52,7 +52,6 @@ void TFT_SPI::init() {
|
||||
SPIx.Init.NSS = SPI_NSS_SOFT;
|
||||
SPIx.Init.Mode = SPI_MODE_MASTER;
|
||||
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.CLKPolarity = SPI_POLARITY_LOW;
|
||||
SPIx.Init.DataSize = SPI_DATASIZE_8BIT;
|
||||
@@ -61,12 +60,25 @@ void TFT_SPI::init() {
|
||||
SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||
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_MOSI_PIN), PinMap_SPI_MOSI);
|
||||
#if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN
|
||||
pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO);
|
||||
#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
|
||||
if (SPIx.Instance == SPI1) {
|
||||
@@ -74,12 +86,17 @@ void TFT_SPI::init() {
|
||||
#ifdef STM32F1xx
|
||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||
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)
|
||||
__HAL_RCC_DMA2_CLK_ENABLE();
|
||||
DMAtx.Instance = DMA2_Stream3;
|
||||
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
|
||||
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
|
||||
}
|
||||
#endif
|
||||
#ifdef SPI2_BASE
|
||||
@@ -92,6 +109,10 @@ void TFT_SPI::init() {
|
||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||
DMAtx.Instance = DMA1_Stream4;
|
||||
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
|
||||
@@ -105,25 +126,27 @@ void TFT_SPI::init() {
|
||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||
DMAtx.Instance = DMA1_Stream5;
|
||||
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
|
||||
|
||||
HAL_SPI_Init(&SPIx);
|
||||
|
||||
DMAtx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||
DMAtx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
||||
DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
||||
DMAtx.Init.Mode = DMA_NORMAL;
|
||||
DMAtx.Init.Priority = DMA_PRIORITY_LOW;
|
||||
#ifdef STM32F4xx
|
||||
#if ANY(STM32F4xx, STM32H7xx)
|
||||
DMAtx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
#endif
|
||||
}
|
||||
|
||||
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);
|
||||
WRITE(TFT_CS_PIN, LOW);
|
||||
}
|
||||
@@ -148,17 +171,32 @@ uint32_t TFT_SPI::getID() {
|
||||
uint32_t TFT_SPI::readID(const uint16_t inReg) {
|
||||
uint32_t data = 0;
|
||||
#if PIN_EXISTS(TFT_MISO)
|
||||
uint32_t BaudRatePrescaler = SPIx.Init.BaudRatePrescaler;
|
||||
uint32_t i;
|
||||
const uint32_t oldPrescaler = SPIx.Init.BaudRatePrescaler;
|
||||
|
||||
SPIx.Init.BaudRatePrescaler = SPIx.Instance == SPI1 ? SPI_BAUDRATEPRESCALER_8 : SPI_BAUDRATEPRESCALER_4;
|
||||
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
|
||||
dataTransferBegin(DATASIZE_8BIT);
|
||||
writeReg(inReg);
|
||||
|
||||
if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_RX(&SPIx);
|
||||
__HAL_SPI_ENABLE(&SPIx);
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
#ifdef STM32H7xx
|
||||
for (uint32_t i = 0; i < 4; i++) {
|
||||
MODIFY_REG(SPIx.Instance->CR2, SPI_CR2_TSIZE, 1);
|
||||
__HAL_SPI_ENABLE(&SPIx);
|
||||
SET_BIT(SPIx.Instance->CR1, SPI_CR1_CSTART);
|
||||
|
||||
#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;
|
||||
@@ -166,10 +204,10 @@ uint32_t TFT_SPI::readID(const uint16_t inReg) {
|
||||
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_RXNE)) {}
|
||||
data = (data << 8) | SPIx.Instance->DR;
|
||||
}
|
||||
#endif
|
||||
|
||||
dataTransferEnd();
|
||||
|
||||
SPIx.Init.BaudRatePrescaler = BaudRatePrescaler;
|
||||
SPIx.Init.BaudRatePrescaler = oldPrescaler;
|
||||
#endif
|
||||
|
||||
return data >> 7;
|
||||
@@ -182,6 +220,9 @@ bool TFT_SPI::isBusy() {
|
||||
#elif defined(STM32F4xx)
|
||||
#define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN)
|
||||
#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
|
||||
|
||||
if (!__IS_DMA_CONFIGURED(&DMAtx)) return false;
|
||||
@@ -193,8 +234,13 @@ bool TFT_SPI::isBusy() {
|
||||
else {
|
||||
// Check if DMA transfer completed flag is set
|
||||
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
|
||||
if ((!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) || (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY))) return true;
|
||||
#ifdef STM32H7xx
|
||||
// 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();
|
||||
@@ -205,7 +251,13 @@ void TFT_SPI::abort() {
|
||||
HAL_DMA_Abort(&DMAtx); // Abort DMA transfer if any
|
||||
HAL_DMA_DeInit(&DMAtx);
|
||||
|
||||
#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
|
||||
}
|
||||
@@ -215,12 +267,24 @@ void TFT_SPI::transmit(uint16_t data) {
|
||||
SPI_1LINE_TX(&SPIx);
|
||||
#endif
|
||||
|
||||
#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->TXDR = data;
|
||||
|
||||
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_SR_EOT)) {}
|
||||
|
||||
__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_TXE)) {}
|
||||
while (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {}
|
||||
#endif
|
||||
|
||||
__HAL_SPI_DISABLE(&SPIx);
|
||||
|
||||
#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
|
||||
@@ -237,35 +301,38 @@ void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t coun
|
||||
|
||||
dataTransferBegin();
|
||||
|
||||
HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(SPIx.Instance->DR), count);
|
||||
__HAL_SPI_ENABLE(&SPIx);
|
||||
#ifdef STM32H7xx
|
||||
HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(SPIx.Instance->TXDR), count);
|
||||
|
||||
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()));
|
||||
}
|
||||
|
||||
void TFT_SPI::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
|
||||
DMAtx.Init.MemInc = memoryIncrease;
|
||||
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
|
||||
transmitDMA(memoryIncrease, data, count);
|
||||
|
||||
HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
|
||||
#ifdef STM32H7xx
|
||||
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_SR_EOT)) {}
|
||||
#else
|
||||
while (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {}
|
||||
#endif
|
||||
abort();
|
||||
}
|
||||
|
||||
#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;
|
||||
HAL_DMA_Init(&DMAtx);
|
||||
|
@@ -25,8 +25,10 @@
|
||||
#include "stm32f1xx_hal.h"
|
||||
#elif defined(STM32F4xx)
|
||||
#include "stm32f4xx_hal.h"
|
||||
#elif defined(STM32H7xx)
|
||||
#include "stm32h7xx_hal.h"
|
||||
#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
|
||||
|
||||
#ifndef LCD_READ_ID
|
||||
@@ -38,6 +40,7 @@
|
||||
|
||||
#define DATASIZE_8BIT SPI_DATASIZE_8BIT
|
||||
#define DATASIZE_16BIT SPI_DATASIZE_16BIT
|
||||
#define DATASIZE_32BIT SPI_DATASIZE_32BIT
|
||||
#define TFT_IO_DRIVER TFT_SPI
|
||||
#define DMA_MAX_SIZE 0xFFFF
|
||||
|
||||
@@ -51,7 +54,7 @@ private:
|
||||
static void transmit(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)
|
||||
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
|
||||
|
||||
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); }
|
||||
|
||||
#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); }
|
||||
#endif
|
||||
|
||||
|
@@ -56,7 +56,6 @@ void XPT2046::init() {
|
||||
SPIx.Init.NSS = SPI_NSS_SOFT;
|
||||
SPIx.Init.Mode = SPI_MODE_MASTER;
|
||||
SPIx.Init.Direction = SPI_DIRECTION_2LINES;
|
||||
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
|
||||
SPIx.Init.CLKPhase = SPI_PHASE_2EDGE;
|
||||
SPIx.Init.CLKPolarity = SPI_POLARITY_HIGH;
|
||||
SPIx.Init.DataSize = SPI_DATASIZE_8BIT;
|
||||
@@ -65,6 +64,20 @@ void XPT2046::init() {
|
||||
SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||
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_MOSI_PIN), PinMap_SPI_MOSI);
|
||||
pinmap_pinout(digitalPinToPinName(TOUCH_MISO_PIN), PinMap_SPI_MISO);
|
||||
@@ -141,6 +154,22 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) {
|
||||
}
|
||||
|
||||
uint16_t XPT2046::hardwareIO(uint16_t data) {
|
||||
#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->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;
|
||||
@@ -148,6 +177,7 @@ uint16_t XPT2046::hardwareIO(uint16_t data) {
|
||||
__HAL_SPI_DISABLE(&SPIx);
|
||||
|
||||
return SPIx.Instance->DR;
|
||||
#endif
|
||||
}
|
||||
|
||||
uint16_t XPT2046::softwareIO(uint16_t data) {
|
||||
|
@@ -22,9 +22,13 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef STM32F1xx
|
||||
#include <stm32f1xx_hal.h>
|
||||
#include "stm32f1xx_hal.h"
|
||||
#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
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
@@ -533,6 +533,20 @@
|
||||
#endif
|
||||
|
||||
#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
|
||||
#endif
|
||||
|
||||
|
@@ -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(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \
|
||||
+ 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(VIKI2, miniVIKI) \
|
||||
+ 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_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)
|
||||
#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)
|
||||
|
@@ -1679,11 +1679,13 @@ void MarlinUI::host_status() {
|
||||
|
||||
#endif
|
||||
|
||||
#if ENABLED(FLOWMETER_SAFETY)
|
||||
void MarlinUI::flow_fault() {
|
||||
LCD_ALERTMESSAGE(MSG_FLOWMETER_FAULT);
|
||||
BUZZ(1000, 440);
|
||||
TERN_(HAS_MARLINUI_MENU, return_to_status());
|
||||
}
|
||||
#endif
|
||||
|
||||
void MarlinUI::pause_print() {
|
||||
#if HAS_MARLINUI_MENU
|
||||
@@ -1718,13 +1720,13 @@ void MarlinUI::host_status() {
|
||||
|
||||
#if HAS_TOUCH_BUTTONS
|
||||
|
||||
//
|
||||
// Screen Click
|
||||
// - 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 select screens (and others) touch the Right Half for +, Left Half for -
|
||||
// - On edit screens, touch Up Half for -, Bottom Half to +
|
||||
//
|
||||
/**
|
||||
* Screen Click
|
||||
* - 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 select screens (and others) touch the Left Half for ←, Right Half for →
|
||||
* - 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) {
|
||||
const millis_t now = millis();
|
||||
if (PENDING(now, next_button_update_ms)) return;
|
||||
|
@@ -505,7 +505,10 @@ public:
|
||||
static void abort_print();
|
||||
static void pause_print();
|
||||
static void resume_print();
|
||||
|
||||
#if ENABLED(FLOWMETER_SAFETY)
|
||||
static void flow_fault();
|
||||
#endif
|
||||
|
||||
#if ALL(HAS_MARLINUI_MENU, PSU_CONTROL)
|
||||
static void poweroff();
|
||||
|
@@ -311,28 +311,15 @@
|
||||
|
||||
#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 TOUCH_BUTTONS_HW_SPI
|
||||
#define TOUCH_BUTTONS_HW_SPI_DEVICE 1
|
||||
#define BEEPER_PIN EXP1_01_PIN
|
||||
|
||||
#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
|
||||
#define TFT_WIDTH 480
|
||||
@@ -341,9 +328,42 @@
|
||||
#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
|
||||
|
||||
#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)
|
||||
#ifndef TOUCH_CALIBRATION_X
|
||||
#define TOUCH_CALIBRATION_X -11386
|
||||
|
@@ -514,6 +514,61 @@
|
||||
|
||||
#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
|
||||
#if IS_U8GLIB_ST7920
|
||||
#ifndef BOARD_ST7920_DELAY_1
|
||||
@@ -527,29 +582,6 @@
|
||||
#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
|
||||
//
|
||||
|
@@ -459,6 +459,98 @@
|
||||
#define BTN_EN1 EXP2_03_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
|
||||
|
||||
#define LCD_PINS_RS EXP1_04_PIN
|
||||
@@ -517,27 +609,6 @@
|
||||
#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
|
||||
//
|
||||
|
Reference in New Issue
Block a user