Skocz do zawartości

Brak dotyku LCD TFT 2,4, TouchGFX, STM32 F407


DeadGeneratio

Pomocna odpowiedź

Dzień dobry, mam problem z brakiem dotyku wyświetlacza TFT LCD o rozdzielczości 320x240px opartym o sterownik ILI9341 oraz XPT2046. Obraz jest wyświetlany, jednak odczyt dotyku nie jest realizowany. Może tydzień temu zdarzyło się, że cudem raz zadziałał, ale od tamtej pory nic. Do obsługi wyświetlacza używam paczkę od STMa TouchGFX. Wstawiłbym cały projekt, ale waży on aż 330mb. Sądzę, że problem może być związany z brakiem odczytania przerwania z pinu T_IRQ ustawionego jako interrupt na zboczu opadającym podłączonym pull_up - nie jest ono wykrywane przez STMa bądź moduł wyświetlacza w ogóle go nie wystawia. Czy ktoś miał kiedyś taki problem? Poniżej kod oraz screeny ustawień poszczególnych ustawień:

/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * @file           : main.c
 * @brief          : Main program body
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2023 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "crc.h"
#include "dma.h"
#include "i2s.h"
#include "spi.h"
#include "tim.h"
#include "gpio.h"
#include "app_touchgfx.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "ili9341.h"
#include "xpt2046.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

float l_a0, l_a1, l_a2, l_b1, l_b2, lin_z1, lin_z2, lout_z1, lout_z2;
float r_a0, r_a1, r_a2, r_b1, r_b2, rin_z1, rin_z2, rout_z1, rout_z2;

uint16_t touch_x, touch_y;

uint16_t rxBuf[8];
uint16_t txBuf[8];
uint16_t volume_filter = 0;
uint16_t l_balance = 0;
uint16_t r_balance = 0;
uint8_t adc_buffer[10];
uint8_t avg_balance = 0;
uint8_t avg_volume = 0;
uint8_t previous_balance = 0;
uint8_t previous_volume = 0;
//  NaN  , -38.0dB, -36.0dB, -34.0dB, -32.0dB, -30.0dB
//-29.0dB, -28.0dB, -27.0dB, -26.0dB, -25.0dB, -24.0dB
//-23.0dB, -22.0dB, -21.0dB, -20.0dB, -19.0dB, -18.0dB
//-17.0dB, -16.0dB, -15.0dB, -14.0dB, -13.0dB, -12.0dB
//-10.8dB, -10.2dB,  -9.6dB,  -9.0dB,  -8.4dB,  -7.8dB
// -7.2dB,  -6,7dB,  -6.2dB,  -5.7dB,  -5.2dB,  -4.7dB
// -4.2dB,  -3.8dB,  -3.4dB,  -3.0dB,  -2.6dB,  -2.2dB
// -1.8dB,  -1.5dB,  -1.2dB,  -0.9dB,  -0.6dB,  -0.3dB
//    0dB,   0.4dB,   0.8dB,   1.2dB,   1.6dB,   2.0dB
//  2.5dB,   3.0dB,   3.5dB,   4.0dB,   4.5dB,   5.0dB
//  5.5dB,   6.0dB,   6.5dB,   7.0dB,   7.5dB,   8.0dB

float volume[330] = { 0, 0, 0, 2, 1,

0.01259038017381747, -0.02517822349570433, 0.0125878435774379,
		-1.9999773923054196, 0.9999773925609704,

		0.01585032768294534, -0.03169746166293428, 0.0158471343017082,
		-1.9999746337494713, 0.9999746340711908,

		0.019954349424441457, -0.03990467822129561, 0.019950329201874072,
		-1.9999715385987913, 0.9999715390038114,

		0.025120993945914636, -0.05023692623037737, 0.025115932794351717,
		-1.999968065782609, 0.9999680662924983,

		0.031625396032791964, -0.06324441982377117, 0.03161902443289015,
		-1.9999641692187653, 0.9999641698606763,

		0.03548424030495652, -0.0709613308445937, 0.035477091259872355,
		-1.9999620461115017, 0.999962046831737,

		0.039813927690065885, -0.07961983322052012, 0.03980590633857047,
		-1.9999597972022245, 0.9999597980103406,

		0.04467190839852597, -0.08933481579664525, 0.04466290830483953,
		-1.9999574150366948, 0.9999574159434148,

		0.050122642374317475, -0.10023518547281332, 0.050112544115851414,
		-1.9999548917189836, 0.9999548927363392,

		0.056238454564293654, -0.11246557756988404, 0.05622712414708059,
		-1.9999522188852987, 0.9999522200267887,

		0.0631004945371515, -0.12618827487432022, 0.06308778161793997,
		-1.9999493876762613, 0.9999493889570323,

		0.070799813182972, -0.14158536082032264, 0.07078554907439745,
		-1.9999463887075417, 0.9999463901445884,

		0.07943857077731155, -0.1588611353745984, 0.07942256620967736,
		-1.9999432120387544, 0.9999432136511447,

		0.08913139243635694, -0.17824482567355876, 0.08911343504633067,
		-1.9999398471405088, 0.9999398489496374,

		0.10000688894473679, -0.19999362737250814, 0.09998674045764369,
		-1.999936282859507, 0.9999362848893791,

		0.11220936313113467, -0.2243961170530507, 0.11218675619946597,
		-1.9999325073815797, 0.9999325096591293,

		0.1259007244279516, -0.2517760809566483, 0.12587535908414463,
		-1.9999285081925207, 0.9999285107479687,

		0.14126263701255334, -0.28249681083428313, 0.14123417668898344,
		-1.9999242720366137, 0.9999242749038676,

		0.1584989300257046, -0.31696592389768824, 0.158466997089088,
		-1.9999197848726902, 0.9999197880897946,

		0.1778383018387186, -0.35564077080876066, 0.1778024725796839,
		-1.9999150318275898, 0.9999150354372318,

		0.19953735424069607, -0.3990345034426763, 0.19949715325205486,
		-1.9999099971468628, 0.9999100011969375,

		0.22388399679269158, -0.447722882910276, 0.22383889066183071,
		-1.9999046641425497, 0.9999046686867963,

		0.2512012665047125, -0.5023519181424306, 0.251150656736432,
		-1.999899015137867, 0.9998990202365806,

		0.28841660233480737, -0.5767750912366323, 0.2883584947559106,
		-1.9998917927707083, 0.9998917986247936,

		0.3090433697624282, -0.6180244699779164, 0.30898110648824206,
		-1.9998879901342324, 0.9998879964069859,

		0.3311452851169626, -0.6622238473435705, 0.33107856894797144,
		-1.9998840538648728, 0.9998840605862361,

		0.3548278429500188, -0.7095841911805776, 0.35475635543261486,
		-1.9998799792664808, 0.9998799864685366,

		0.3802040819456918, -0.7603315560808175, 0.3801274818522516,
		-1.9998757614778746, 0.9998757691950002,

		0.40739512438821174, -0.8147081622076656, 0.4073130460884852,
		-1.9998713954670397, 0.9998714037360708,

		0.4365307542028326, -0.8729735512612993, 0.4364428059188733,
		-1.9998668760251264, 0.9998668848855325,

		0.4623959288093361, -0.9246986888669338, 0.4623027694429982,
		-1.9998629887348962, 0.9998629981202962,

		0.48979363031365664, -0.9794885714773822, 0.48969495110522615,
		-1.999858987933743, 0.9998589978752431,

		0.5188146593342086, -1.0375247820339397, 0.518710133230281,
		-1.9998548703070882, 0.9998548808376381,

		0.5495551961051472, -1.0989996616254376, 0.5494444766747909,
		-1.9998506324435668, 0.9998506435980674,

		0.5821171191791988, -1.1641169468296872, 0.5819998394659089,
		-1.9998462708321987, 0.9998462826476192,

		0.6166083430094622, -1.233092444809064, 0.6164841143151021,
		-1.9998417818594816, 0.9998417943749817,

		0.645667009168293, -1.291203922058624, 0.6455369259956443,
		-1.9998380964855798, 0.999838109590893,

		0.676095082982819, -1.35205393869586, 0.6759588694359631,
		-1.9998343252682935, 0.9998343389912154,

		0.7079570965622899, -1.415771545936615, 0.7078144637439604,
		-1.9998304662080741, 0.9998304805777095,

		0.7413206228853764, -1.4824918761228625, 0.7411712682843118,
		-1.9998265172587972, 0.9998265323056229,

		0.7762564190808073, -1.5523564292551155, 0.7761000259302372,
		-1.9998224763266768, 0.9998224920826057,

		0.812838576458392, -1.6255133730242393, 0.8126748130642962,
		-1.999818341269158, 0.9998183577676069,

		0.8414021539365865, -1.6826347726685829, 0.8412326358102095,
		-1.9998151768892325, 0.9998151939674457,

		0.8709694466297604, -1.741763400503013, 0.8707939715516025,
		-1.9998119573878155, 0.9998119750661657,

		0.90157572350152, -1.8029697873483528, 0.9013940821464084,
		-1.999808681804726, 0.9998087001043018,

		0.9332574927431461, -1.8663269422310813, 0.9330694684305663,
		-1.9998053491630567, 0.9998053681056875,

		0.9660525453121, -1.9319104394515736, 0.9658579137477562,
		-1.999801958468884, 0.9998019780771666,

		1, -1.999798508710969, 0.9997985290082942, -1.999798508710969,
		0.9997985290082942,

		1.0471261467252242, -2.094046109299163, 1.046919982871264,
		-1.999798508710969, 0.9997985290082942,

		1.096473224392352, -2.1927354624603597, 1.0962622583653328,
		-1.999798508710969, 0.9997985290082942,

		1.1481459009492545, -2.2960759015441257, 1.1479300208921965,
		-1.999798508710969, 0.9997985290082942,

		1.202253777161869, -2.4042866254768525, 1.2020328686123083,
		-1.999798508710969, 0.9997985290082942,

		1.2589116190900453, -2.517597163712065, 1.258685564919345,
		-1.999798508710969, 0.9997985290082942,

		1.333503425064056, -2.6667741747591274, 1.3332707699923967,
		-1.999798508710969, 0.9997985290082942,

		1.412514974220637, -2.8247904794215426, 1.4122755254982307,
		-1.999798508710969, 0.9997985290082942,

		1.4962081499113082, -2.9921698387739544, 1.4959617091599715,
		-1.999798508710969, 0.9997985290082942,

		1.5848603529671543, -3.1694670486857857, 1.5846067160159565,
		-1.999798508710969, 0.9997985290082942,

		1.6787654211648229, -3.3572697787484316, 1.678504377880934,
		-1.999798508710969, 0.9997985290082942,

		1.7782346031742395, -3.556200520165755, 1.7779659372888406,
		-1.999798508710969, 0.9997985290082942,

		1.8835975902162758, -3.7669186490643343, 1.8833210791453838,
		-1.999798508710969, 0.9997985290082942,

		1.9952036088499023, -3.9901226120625424, 1.9949190235099654,
		-1.999798508710969, 0.9997985290082942,

		2.113422578510974, -4.22655224134273, 2.1131296831290793,
		-1.999798508710969, 0.9997985290082942,

		2.2386463376394174, -4.476991206900052, 2.238344889557958,
		-1.999798508710969, 0.9997985290082942,

		2.3712899424589375, -4.742269614096192, 2.3709796919345787,
		-1.999798508710969, 0.9997985290082942,

		2.5117930427141792, -5.023266755127802, 2.5114737327109466,
		-1.999798508710969, 0.9997985290082942 };
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_TIM2_Init();
  MX_SPI1_Init();
  MX_TIM3_Init();
  MX_I2S2_Init();
  MX_SPI3_Init();
  MX_CRC_Init();
  MX_TouchGFX_Init();
  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim2);
	HAL_TIM_Base_Start_IT(&htim3);
	HAL_ADC_Start_DMA(&hadc1, adc_buffer, 10);
	HAL_I2SEx_TransmitReceive_DMA(&hi2s2, txBuf, rxBuf, 4);
	ILI9341_Init();
	XPT2046_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	while (1) {
    /* USER CODE END WHILE */

  MX_TouchGFX_Process();
    /* USER CODE BEGIN 3 */
	}
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
void checkBalance() {
	previous_balance = avg_balance;
	if (avg_volume < 43) {
		if (previous_balance > 32) {
			l_balance = (previous_balance - 32) * 5;
			r_balance = 0;
		} else {
			l_balance = 0;
			r_balance = (32 - previous_balance) * 5;
		}
	} else {
		if (previous_balance > 32) {
			l_balance = (previous_balance - 32) * 10;
			r_balance = 0;
		} else {
			l_balance = 0;
			r_balance = (32 - previous_balance) * 10;
		}
	}

}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {

	avg_volume = (adc_buffer[0] + adc_buffer[2] + adc_buffer[4] + adc_buffer[6]
			+ adc_buffer[8]) / 5;
	avg_balance = (adc_buffer[1] + adc_buffer[3] + adc_buffer[5] + adc_buffer[7]
			+ adc_buffer[9]) / 5;
	if (previous_balance != avg_balance) {
		checkBalance();
	}
	if (previous_volume != avg_volume) {
		previous_volume = avg_volume;
		if (avg_volume != 0) {
			volume_filter = avg_volume * 5;
		} else {
			volume_filter = 0;
		}
	}

}

void updateFilter() {

	lin_z2 = lin_z1 = lout_z2 = lout_z1 = rin_z2 = rin_z1 = rout_z2 = rout_z1 =
			0;
	l_a0 = volume[volume_filter - l_balance];
	l_a1 = volume[volume_filter + 1 - l_balance];
	l_a2 = volume[volume_filter + 2 - l_balance];
	l_b1 = volume[volume_filter + 3 - l_balance];
	l_b2 = volume[volume_filter + 4 - l_balance];
	r_a0 = volume[volume_filter - r_balance];
	r_a1 = volume[volume_filter + 1 - r_balance];
	r_a2 = volume[volume_filter + 2 - r_balance];
	r_b1 = volume[volume_filter + 3 - r_balance];
	r_b2 = volume[volume_filter + 4 - r_balance];

}

int Calc_IIR_Left(int inSample) {
	float inSampleF = (float) inSample;
	float outSampleF = l_a0 * inSampleF + l_a1 * lin_z1 + l_a2 * lin_z2
			- l_b1 * lout_z1 - l_b2 * lout_z2;
	lin_z2 = lin_z1;
	lin_z1 = inSampleF;
	lout_z2 = lout_z1;
	lout_z1 = outSampleF;

	return (int) outSampleF;
}

int Calc_IIR_Right(int inSample) {
	float inSampleF = (float) inSample;
	float outSampleF = r_a0 * inSampleF + r_a1 * rin_z1 + r_a2 * rin_z2
			- r_b1 * rout_z1 - r_b2 * rout_z2;
	rin_z2 = rin_z1;
	rin_z1 = inSampleF;
	rout_z2 = rout_z1;
	rout_z1 = outSampleF;

	return (int) outSampleF;
}

void HAL_I2SEx_TxRxHalfCpltCallback(I2S_HandleTypeDef *hi2s) {

	int lSample = (int) (rxBuf[0] << 16) | rxBuf[1];
	int rSample = (int) (rxBuf[2] << 16) | rxBuf[3];

	//run HP on left channel and LP on right channel
	lSample = Calc_IIR_Left(lSample);
	rSample = Calc_IIR_Right(rSample);

	//restore to buffer
	txBuf[0] = (lSample >> 16) & 0xFFFF;
	txBuf[1] = lSample & 0xFFFF;
	txBuf[2] = (rSample >> 16) & 0xFFFF;
	txBuf[3] = rSample & 0xFFFF;
	updateFilter();

}

void HAL_I2SEx_TxRxCpltCallback(I2S_HandleTypeDef *hi2s) {

	int lSample = (int) (rxBuf[4] << 16) | rxBuf[5];
	int rSample = (int) (rxBuf[6] << 16) | rxBuf[7];

	//run HP on left channel and LP on right channel
	lSample = Calc_IIR_Left(lSample);
	rSample = Calc_IIR_Right(rSample);

	//restore to buffer
	txBuf[4] = (lSample >> 16) & 0xFFFF;
	txBuf[5] = lSample & 0xFFFF;
	txBuf[6] = (rSample >> 16) & 0xFFFF;
	txBuf[7] = rSample & 0xFFFF;
	updateFilter();

}
/* USER CODE END 4 */

/**
  * @brief  Period elapsed callback in non blocking mode
  * @note   This function is called  when TIM11 interrupt took place, inside
  * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  * a global variable "uwTick" used as application time base.
  * @param  htim : TIM handle
  * @retval None
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */
	if (htim->Instance == TIM3) {
		touchgfxSignalVSync();
	}
  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM11) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */

  /* USER CODE END Callback 1 */
}

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
	/* User can add his own implementation to report the HAL error return state */
	__disable_irq();
	while (1) {
	}
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

XPT2046.c

#include "xpt2046.h"

#define T_IRQ XPT2046_ReadIRQ()
#define T_CS_ON XPT2046_SetCS()
#define T_CS_OFF XPT2046_ResetCS()

#define READ_TIMES 	5
#define LOST_VAL 	1
#define ERR_RANGE 50
#define Z_THRESHOLD     400
#define Z_THRESHOLD_INT	75
#define MSEC_THRESHOLD  3

extern SPI_HandleTypeDef hspi3;
extern void Error_Handler(void);
static uint8_t XPT2046_initilazed = 0;
static void XPT2046_SetCS(void)
{
	HAL_GPIO_WritePin(T_CS_GPIO_Port, T_CS_Pin, GPIO_PIN_SET);
}

static void XPT2046_ResetCS(void)
{
	HAL_GPIO_WritePin(T_CS_GPIO_Port, T_CS_Pin, GPIO_PIN_RESET);
}

static void XPT2046_Write_Byte(uint8_t num)
{
	hspi3.Instance->CR2 &= ~(SPI_DATASIZE_16BIT); // Set 8 bit mode
	__HAL_SPI_ENABLE(&hspi3);
	if (HAL_SPI_Transmit(&hspi3, &num, 1, 1000) != HAL_OK) {
		Error_Handler();
	}
	__HAL_SPI_DISABLE(&hspi3);
}

static uint16_t XPT2046_Read_AD(uint8_t CMD)
{
	uint8_t num[2];
	uint16_t ret;

	T_CS_OFF;
	XPT2046_Write_Byte(CMD);
	HAL_Delay(6);

	hspi3.Instance->CR2 |= SPI_DATASIZE_16BIT; // Set 16 bit mode
	__HAL_SPI_ENABLE(&hspi3);
	if (HAL_SPI_Receive(&hspi3, num, 1, 1000) != HAL_OK) {
		Error_Handler();
	}
	__HAL_SPI_DISABLE(&hspi3);
	T_CS_ON;

	ret = num[0] << 8 | num[1];
	ret >>= 3;
	ret &= (1<<12)-1;

	return ret;
}

static int16_t besttwoavg( int16_t x , int16_t y , int16_t z ) {
  int16_t da, db, dc;
  int16_t reta = 0;
  if ( x > y ) da = x - y; else da = y - x;
  if ( x > z ) db = x - z; else db = z - x;
  if ( z > y ) dc = z - y; else dc = y - z;

  if ( da <= db && da <= dc ) reta = (x + y) >> 1;
  else if ( db <= da && db <= dc ) reta = (x + z) >> 1;
  else reta = (y + z) >> 1;   //    else if ( dc <= da && dc <= db ) reta = (x + y) >> 1;

  return (reta);
}

void XPT2046_Init(void)
{
	XPT2046_initilazed = 1;
}

void XPT2046_Update(uint16_t *x, uint16_t *y)
{
	int16_t data[6];
	static uint32_t ptime = 0;

	if (XPT2046_initilazed == 0) {
		return;
	}

	if (HAL_GetTick() - ptime < MSEC_THRESHOLD) {
		return;
	}

	int16_t z1 = XPT2046_Read_AD(0xb1); // z1
	int32_t z = z1 + 4095;
	int16_t z2 = XPT2046_Read_AD(0xc1); // z2
	z -= z2;
	if (z >= Z_THRESHOLD) {
		XPT2046_Read_AD(0x91);  // dummy 1st X measure
		data[0] = XPT2046_Read_AD(0x91);
		data[1] = XPT2046_Read_AD(0xd1);
		data[2] = XPT2046_Read_AD(0x91);
		data[3] = XPT2046_Read_AD(0xd1);
	} else {
		data[0] = data[1] = data[2] = data[3] = 0;
	}
	data[4] = XPT2046_Read_AD(0x91);
	data[5] = XPT2046_Read_AD(0xd0);
	ptime = HAL_GetTick();
	if (z < 0) z = 0;
	int16_t intx = besttwoavg( data[0], data[2], data[4] );
	int16_t inty = besttwoavg( data[1], data[3], data[5] );
	if (z >= Z_THRESHOLD) {
		*x = intx;
		*y = inty;
	}
}

uint8_t XPT2046_IsReasonable(uint16_t x, uint16_t y)
{
	if (x >= XPT_XMIN && x <= XPT_XMAX && y >= XPT_YMIN && y <= XPT_YMAX) {
		return 1;
	}
	return 0;
}

image.thumb.png.b710ae988b277bc5879168914ed8e170.pngimage.thumb.png.ac4d95b8f0d7a937950e73f25b87b0d0.pngimage.thumb.png.d5652f467f640e36e98c4ebfd58cee97.pngimage.thumb.png.aac17e64ee35cf278a35cf45bb23f33b.pngimage.thumb.png.69fb28af10468bb9732dc71383335222.pngimage.thumb.png.d7a95d1e6edce0334603a50007cabc45.pngimage.thumb.png.547703293daff51f1477465a73df3e36.pngimage.thumb.png.04861b6370beaa594797db12ebbf31bd.pngimage.thumb.png.f7168e815ed1ef61ecab038308ed9940.pngF407.thumb.png.3a5d969026e79bd0eb0ed3768bbbb08c.png 

Link do komentarza
Share on other sites

@DeadGeneratio Jak zakładasz projekt od zera i dodajesz middleware TouchGFX to najpewniej będzie brakowało podłączenia sterownika touch. Wrzuć np do folderu drivers/BSP.

Teraz idziesz tu:

image.thumb.png.13d37ed8a748b9b8c7e85f9d3c880700.png

image.thumb.png.7d074cce24afa4c7a2faccf886d85023.png

23 godziny temu, DeadGeneratio napisał:

brakiem odczytania przerwania z pinu T_IRQ ustawionego jako interrupt

Te sterowniki używają polling w wątku RTOSa, więc to się raczej nie przydaje. Chyba że skonfigurujesz, żeby jakoś odczytywać i kolejkować.

  • Lubię! 1
Link do komentarza
Share on other sites

48 minut temu, Gieneq napisał:

@DeadGeneratio Jak zakładasz projekt od zera i dodajesz middleware TouchGFX to najpewniej będzie brakowało podłączenia sterownika touch. Wrzuć np do folderu drivers/BSP.

Teraz idziesz tu:

image.thumb.png.13d37ed8a748b9b8c7e85f9d3c880700.png

image.thumb.png.7d074cce24afa4c7a2faccf886d85023.png

Te sterowniki używają polling w wątku RTOSa, więc to się raczej nie przydaje. Chyba że skonfigurujesz, żeby jakoś odczytywać i kolejkować.

W STM32TouchController.cpp mam już inny kod odpowiedzialny za obsługę dotyku. Sądzisz, że powinienem go zastąpić? Po co wtedy sterownik XPT2046?

 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : STM32TouchController.cpp
  ******************************************************************************
  * This file was created by TouchGFX Generator 4.22.0. This file is only
  * generated once! Delete this file from your project and re-generate code
  * using STM32CubeMX or change this file manually to update it.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* USER CODE BEGIN STM32TouchController */

#include <STM32TouchController.hpp>
#include "ili9341.h"
#include "xpt2046.h"

extern "C" {
static void ConvXPTtoILI(uint16_t *x, uint16_t *y)
{
	int16_t tx,ty;
	tx = (int16_t)(((int32_t)*x - XPT_XMIN) * GUI_WIDTH / XPT_WIDTH);
	tx = (tx < 0) ? 0 : tx;
	tx = (tx >= GUI_WIDTH) ? GUI_WIDTH-1 : tx;
	ty = (int16_t)(((int32_t)*y - XPT_YMIN) * GUI_HEIGHT / XPT_HEIGHT);
	ty = (ty < 0) ? 0 : ty;
	ty = (ty >= GUI_HEIGHT) ? GUI_HEIGHT-1 : ty;
	*x = tx;
	*y = ty;
}
}

void STM32TouchController::init()
{
    /**
     * Initialize touch controller and driver
     *
     */
}

bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y)
{
    /**
     * By default sampleTouch returns false,
     * return true if a touch has been detected, otherwise false.
     *
     * Coordinates are passed to the caller by reference by x and y.
     *
     * This function is called by the TouchGFX framework.
     * By default sampleTouch is called every tick, this can be adjusted by HAL::setTouchSampleRate(int8_t);
     *
     */
    static uint16_t prevx = GUI_WIDTH;
	static uint16_t prevy = GUI_HEIGHT;
	uint16_t intx, inty;
	XPT2046_Update(&intx, &inty);
	if (XPT2046_IsReasonable(intx, inty)) {
		ConvXPTtoILI(&intx, &inty);
		if (intx != prevx || inty != prevy) {
			prevx = intx;
			prevy = inty;
			x = (int32_t)intx;
			y = (int32_t)inty;
			return true;
		}
	}
    return false;
}

/* USER CODE END STM32TouchController */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

Link do komentarza
Share on other sites

@DeadGeneratio jak masz jakiś sterownik to raczej dobre, podejrzanie wygląda brak czegokolwiek przy inicjalizacji. Ale zobacz co konkretnie dzieje sie debugerem i co robi funkcja XPT2046_Update(&intx, &inty);

Jak masz analizator stanów logicznych sprawdź jak wygląda magistrala I2C. Jeżeli coś jeszcze z niej korzysta to odłącz. Jeżeli sterownik TS używa funkcje HALa sprawdź czy nie zwracają errorów

  • Lubię! 2
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Przeleciałem debuggerem cały program. W pliku main.c kod poniżej wywołuje ciągle aktualizację stanu panelu dotykowego.

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	while (1) {
    /* USER CODE END WHILE */

  MX_TouchGFX_Process();
    /* USER CODE BEGIN 3 */
	}
  /* USER CODE END 3 */

Wszystko jest pięknie do momentu, gdy kod sprawdza, czy odczytane wartości są możliwe "IsReasonable"

uint8_t XPT2046_IsReasonable(uint16_t x, uint16_t y)
{
	if (x >= XPT_XMIN && x <= XPT_XMAX && y >= XPT_YMIN && y <= XPT_YMAX) {
		return 1;
	}
	return 0;
}

Za każdym razem zwracane jest zero, problem więc jest w odczytaniu pozycji x oraz y na panelu dotykowym. Wina zatem kodu chociaż w to wątpię, albo uszkodzenia modułu wyświetlacza z dotykiem. Zamówię zaraz kolejny, jak okaże się, że też nie będzie działać to będę szukał w kodzie itd, a dwa wyświetlacze zawsze się przydadzą. W międzyczasie ktoś na coś może wpadnie i podpowie co jeszcze sprawdzić

Link do komentarza
Share on other sites

U mnie działa 😉

Co prawda na esp, ale nie miałem z tym żadnych problemów.

Ustawienia: bez powerdown, 8bit sampling, single ended.

Ten układ umożliwia też próbkowanie z wejścia zewnętrznego oraz wbudowanego czujnika temperatury.

Spróbuj po prostu czytać wartości z innych kanałów multipleksera albo wypuść do loga, co odczytuje przy dotknięciu ekranu.

 

No i warto pamiętać że max zegar spi dla tego układu jest rząd wielkości mniejszy niż dla sterownika grafiki.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.