【目标】
配置硬件I2C驱动GT911
【开发环境】
win11
【硬件】
1、CPKCOR-RA8D1B核心板
2、拓展板(CPKEXP-EKRA8X1)
3、ST7796 SPI屏
4、GT911触摸屏
【开发工具】
MDK
【RASC配置】
从原理图上得知Arduino的标准接有引出了PA15、PA14为I2C接口,并给出了上拉电阻,因此做为I2C接口是最佳选择。

配置RASC如下图所示:

再配置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, ®h, 1);
memcpy (write_package + 1, ®l, 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的时序要求图:

修改配置代码如下:
/* 选择地址 */ // 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的代码,以及初始触摸的函数:

【测试】
点击LVGL界面,可以精准的控制
【总结】
通过RASC图形化配置I2C可以快速的实现GT911的驱动移植。与LVGL完美匹配,实现用户的交互。
我要赚赏金
