这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【瑞萨RA8D1LVGL/LWIP评测】硬件I2C驱动GT911

共1条 1/1 1 跳转至

【瑞萨RA8D1LVGL/LWIP评测】硬件I2C驱动GT911

高工
2026-01-22 08:01:32     打赏

【目标】

配置硬件I2C驱动GT911

【开发环境】

win11

【硬件】

1、CPKCOR-RA8D1B核心板

2、拓展板(CPKEXP-EKRA8X1)

3、ST7796 SPI屏

4、GT911触摸屏

【开发工具】

MDK

【RASC配置】

从原理图上得知Arduino的标准接有引出了PA15、PA14为I2C接口,并给出了上拉电阻,因此做为I2C接口是最佳选择。

image.png

配置RASC如下图所示:

image.png

再配置PA11与P506为普通IO输出,与GT911的RST与INT相接,为初始配置GT911的地址做设计。

【代码移植】

复制GT911的驱动到工程中。

1、修改INT与RST的宏定义

#define GT911_RESET_PIN             BSP_IO_PORT_10_PIN_11
#define GT911_INT_PIN               BSP_IO_PORT_10_PIN_06

2、修改发送与读取函数:

static fsp_err_t gt911_write_reg(uint16_t reg, uint8_t *buf, uint8_t len)
{
    fsp_err_t err;

    uint8_t regl = (uint8_t) (reg & 0xff);
    uint8_t regh = (uint8_t) (reg >> 8);
    uint8_t *write_package = malloc ((len + 2) * sizeof(uint8_t));
    memcpy (write_package, &regh, 1);
    memcpy (write_package + 1, &regl, 1);
    memcpy (write_package + 2, buf, len);


		err =	R_SCI_B_I2C_Write(&g_i2c9_ctrl,
                            write_package,
                            len + 2,
                            0);
    i2c0_wait_for_tx ();
    free (write_package);
    return err;
}

static fsp_err_t gt911_read_reg(uint16_t reg, uint8_t *buf, uint8_t len)
{
    fsp_err_t err;
    uint8_t tmpbuf[2];

    tmpbuf[0] = (uint8_t) (reg >> 8);
    tmpbuf[1] = (uint8_t) (reg & 0xff);

		err =	R_SCI_B_I2C_Write(&g_i2c9_ctrl,
                            tmpbuf,
                            2,
                            0);
    i2c0_wait_for_tx ();

		err = R_SCI_B_I2C_Read(&g_i2c9_ctrl,
                           buf,
                           len,
                           0);
    i2c0_wait_for_rx ();

    return err;
}

3、修改回调函数:

void sci_b_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
    switch (p_args->event)
    {
        case I2C_MASTER_EVENT_TX_COMPLETE:
        {
            g_i2c0_tx_complete = true;
            break;
        }
        case I2C_MASTER_EVENT_RX_COMPLETE:
        {
            g_i2c0_rx_complete = true;
            break;
        }
        default:
        {
            g_i2c0_tx_complete = g_i2c0_rx_complete = false;
            break;
        }
    }
}

4、配置GT911上电的地址设置时序

根据GT911的数据手册,按照0x28/0x29的时序要求图:

image.png

修改配置代码如下:

    /* 选择地址 */
    // 0x14
	//拉低RST与INT	
    g_ioport.p_api->pinWrite (g_ioport.p_ctrl, GT911_INT_PIN, BSP_IO_LEVEL_LOW);
    g_ioport.p_api->pinWrite (g_ioport.p_ctrl, GT911_RESET_PIN, BSP_IO_LEVEL_LOW);
    R_BSP_SoftwareDelay (100, BSP_DELAY_UNITS_MILLISECONDS);
    //拉高INT 保持高电平100us以上
    g_ioport.p_api->pinWrite (g_ioport.p_ctrl, GT911_INT_PIN, BSP_IO_LEVEL_HIGH);
    R_BSP_SoftwareDelay (1, BSP_DELAY_UNITS_MILLISECONDS);
    //拉高RST 保持高电平5ms以上
    g_ioport.p_api->pinWrite (g_ioport.p_ctrl, GT911_RESET_PIN, BSP_IO_LEVEL_HIGH);
    R_BSP_SoftwareDelay (5, BSP_DELAY_UNITS_MILLISECONDS);
    //配置INT为输入模式
    g_ioport.p_api->pinCfg (g_ioport.p_ctrl, GT911_INT_PIN, IOPORT_CFG_PORT_DIRECTION_INPUT);
    R_BSP_SoftwareDelay (100, BSP_DELAY_UNITS_MILLISECONDS);

【匹配LVGL触摸】

1、打开lv_port_indev_template.h/c的编译开关,即#if 0 修改为if 1

2、添加st7796与gt911的头文件引用。

3、在lv_port_indev_template.c中只保留Touchpad的代码(删掉button、keyboard等代码)

4、添加gt911的初始化函数到touchpad_init中。

static void touchpad_init(void)
{
    /*Your code comes here*/
	drv_i2c_touchpad_init();
}

5、添加获取触摸坐标的代码:

/*Will be called by the library to read the touchpad*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    fsp_err_t err;
    static lv_coord_t last_x = 0;
    static lv_coord_t last_y = 0;

    /*Save the pressed coordinates and the state*/
    err = touchpad_is_touched();
    if(FSP_SUCCESS == err) {
        touchpad_get_pos((uint16_t *)&last_x, (uint16_t *)&last_y, 0);
        data->state = LV_INDEV_STATE_PR;
    }
    else {
        data->state = LV_INDEV_STATE_REL;
    }

    /*Set the last pressed coordinates*/
    data->point.x = last_x;
    data->point.y = last_y;
}

6、在hal_enty中添加#include "lv_port_indev_template.h"以及seggerrtt的代码,以及初始触摸的函数:

image.png

【测试】

点击LVGL界面,可以精准的控制image.png

【总结】

通过RASC图形化配置I2C可以快速的实现GT911的驱动移植。与LVGL完美匹配,实现用户的交互。






关键词: GT911     RA8D1     LVGL    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]