#include <stdio.h>
#include "esp_log.h"
#include "driver/i2c.h"
#include "driver/gpio.h"
static const char *TAG = "tp-example";
//兼容FT5x06,HY46XX
#define I2C_MASTER_SCL_IO 6 // CONFIG_I2C_MASTER_SCL /*!< GPIO number used for I2C master clock */
#define I2C_MASTER_SDA_IO 5 // CONFIG_I2C_MASTER_SDA /*!< GPIO number used for I2C master data */
#define I2C_MASTER_RST_IO 8
#define I2C_MASTER_NUM 0 /*!< I2C master i2c port number, the number of i2c peripheral interfaces available will depend on the chip */
#define I2C_MASTER_FREQ_HZ 200000 /*!< I2C master clock frequency */
#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
#define I2C_MASTER_TIMEOUT_MS 1000
#define TP_IC_SENSOR_ADDR (0x38) /*!< Slave address of the FT5X06 sensor */
#define FT5x06_TOUCH_POINTS (0x02)
#define FT5x06_TOUCH1_XH (0x03)
/**
* @brief Read a sequence of bytes from a FT5X06 sensor registers
*/
static esp_err_t tp_register_read(uint8_t reg_addr, uint8_t *data, size_t len)
{
return i2c_master_write_read_device(I2C_MASTER_NUM, TP_IC_SENSOR_ADDR, ®_addr, 1, data, len, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
}
/**
* @brief Write a byte to a FT5X06 sensor register
*/
static esp_err_t tp_register_write_byte(uint8_t reg_addr, uint8_t data)
{
int ret;
uint8_t write_buf[2] = {reg_addr, data};
ret = i2c_master_write_to_device(I2C_MASTER_NUM, TP_IC_SENSOR_ADDR, write_buf, sizeof(write_buf), I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
return ret;
}
/**
* @brief i2c master initialization
*/
static esp_err_t i2c_master_init(void)
{
int i2c_master_port = I2C_MASTER_NUM;
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.scl_io_num = I2C_MASTER_SCL_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};
i2c_param_config(i2c_master_port, &conf);
return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}
static void tp_read_possition(void *arg)
{
uint8_t data[30]={0};
uint8_t points=0;
uint8_t points_old=0;
uint16_t index = 0;
uint16_t pos_x = 0;//控件坐标
uint16_t pos_y = 0;
uint16_t tp_x = 0; //原始数据【原点=左下角】
uint16_t tp_y = 0;
// touch_ft5x06_i2c_read(tp, FT5x06_TOUCH_POINTS, &points, 1);
while (1)
{
points = 0;
tp_register_read(FT5x06_TOUCH_POINTS, &points, 1);
if( points_old != points)
{
if(points==1) //toch down
{
tp_register_read(FT5x06_TOUCH1_XH,data, 6);
tp_x = ((data[0]<<8) | data[1])&0x1FF; //Height[0~320]
tp_y = ((data[2]<<8) | data[3])&0x1FF; //Width [0~480]
pos_x = tp_y;
pos_y = 320-tp_x;
if(points==1)
printf("TP_Down: x=%d , y=%d.\n",pos_x,pos_y);
}
points_old = points;
}
vTaskDelay(10);
}
}
void tp_touch_init(void)
{
gpio_config_t rest_config;
rest_config.intr_type = GPIO_INTR_DISABLE;
rest_config.pin_bit_mask = (1ull << I2C_MASTER_RST_IO);
rest_config.mode = GPIO_MODE_OUTPUT;
rest_config.pull_up_en = GPIO_PULLUP_DISABLE;
rest_config.pull_down_en = GPIO_PULLUP_DISABLE;
gpio_config(&rest_config);
gpio_set_level(I2C_MASTER_RST_IO, 0);
vTaskDelay(20);
gpio_set_level(I2C_MASTER_RST_IO, 1);
vTaskDelay(200);
ESP_ERROR_CHECK(i2c_master_init());
ESP_LOGI(TAG, "[TP] I2C initialized successfully");
xTaskCreatePinnedToCore(tp_read_possition, "tp_read_possition", 1024 * 5, NULL, 5, NULL, 0);
}
[ESP32] 触摸FT5x06,HY46XX 驱动
最新推荐文章于 2024-07-24 22:27:20 发布