[ESP32] 触摸FT5x06,HY46XX 驱动

#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, &reg_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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值