一、GT9147 触摸屏GT9147 是什么GT9147 是一款电容触摸屏控制器。它负责检测触摸屏上的触摸点通过 I2C 把坐标告诉主控。主要特性参数值通信接口I2C设备地址0x14GT1151或 0x5DGT9147支持触摸点最多 5 点中断输出有触摸时产生中断复位有通过 RST 引脚复位和主控的连接I2C2SDA、SCL用来读坐标和写配置GPIO1_IO09中断引脚CT_INT触摸时产生中断GPIO5_IO09复位引脚CT_RST控制复位工作原理上电后主控通过 RST 引脚复位 GT9147主控通过 I2C 读设备 ID确认芯片型号配置 GT9147 进入读坐标模式触摸发生时GT9147 拉低中断引脚产生中断主控在中断服务函数里通过 I2C 读触摸点数量、坐标处理完后通过 I2C 清中断标志二、GT9147 的寄存器寄存器作用0x8140设备 ID4 字节0x814E触摸状态寄存器0x8150触摸点 0 坐标0x8158触摸点 1 坐标0x8160触摸点 2 坐标0x8168触摸点 3 坐标0x8170触摸点 4 坐标0x8040控制寄存器进入读坐标模式触摸状态寄存器0x814E低 4 位触摸点数量0~5bit7坐标就绪标志坐标寄存器每个触摸点的坐标占 4 字节字节 0~1X 坐标低字节在前字节 2~3Y 坐标低字节在前三、gt9147初始化1. I2C 初始化ci2c_init(I2C2);GT9147 接在 I2C2 上。2. 引脚复用cIOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09, 0); // CT_INT IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09, 0); // CT_RST IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09, 0x10B0); IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09, 0x10B0);GPIO1_IO09中断引脚GPIO5_IO09复位引脚3. 设置方向cGPIO1-GDIR | (1 9); // 中断引脚先设为输出 GPIO5-GDIR | (1 9); // 复位引脚设为输出4. 复位 GT9147cGPIO1-DR ~(1 9); // 中断引脚拉低 GPIO5-DR ~(1 9); // 复位引脚拉低 delay_ms(50); GPIO5-DR | (1 9); // 复位引脚拉高释放复位 delay_ms(100);复位序列拉低复位引脚延时拉高延时。GT9147 复位后进入工作状态。5. 读设备 IDcunsigned char buffer[128] {0}; gt9147_read(0x8140, buffer, 4); printf(Gesture ID %s\n, buffer);读 0x8140 寄存器的 4 个字节就是芯片型号字符串。根据读到的型号选择对应的设备地址和坐标寄存器地址。6. 配置中断cIOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09, 0x0800); // 开漏 GPIO1-GDIR ~(1 9); // 设为输入 GPIO1-ICR1 | (3 18); // 触发方式上升沿 GPIO1-IMR | (1 9); // 中断屏蔽解除电气特性改成开漏0x0800中断引脚设为输入ICR1 设置触发方式IMR 使能中断7. 配置 GICcGIC_SetPriority(GPIO1_Combined_0_15_IRQn, 0); system_interrupt_register(GPIO1_Combined_0_15_IRQn, touch_irq_hangdler); GIC_EnableIRQ(GPIO1_Combined_0_15_IRQn);和之前中断一样设置优先级、注册处理函数、使能。8. 进入读坐标模式cbuffer[0] 0; gt9147_write(0x8040, buffer, 1);写 0x8040 寄存器告诉 GT9147 进入读坐标模式。四、中断处理cvoid touch_irq_hangdler(void) { if ((GPIO1-ISR (1 9)) ! 0) { unsigned char buffer[64] {0}; gt9147_read(0x814E, buffer, 1); unsigned char num buffer[0] 0x0F; if (_gt9147.num ! num) { _gt9147.num num; int i 0; for (i 0; i num; i) { gt9147_read(pointer_add[i], buffer, 4); _gt9147.x[i] (buffer[1] 8) | (buffer[0] 0); _gt9147.y[i] (buffer[3] 8) | (buffer[2] 0); } _gt9147.vail 1; show_pointer(); } buffer[0] 0; gt9147_write(0x814E, buffer, 1); GPIO1-ISR | (1 9); } }1. 检查中断状态cif ((GPIO1-ISR (1 9)) ! 0)检查 GPIO1_IO09 的中断状态确认是触摸中断。2. 读触摸点数量cgt9147_read(0x814E, buffer, 1); unsigned char num buffer[0] 0x0F;读 0x814E 寄存器低 4 位是触摸点数量。3. 读坐标cfor (i 0; i num; i) { gt9147_read(pointer_add[i], buffer, 4); _gt9147.x[i] (buffer[1] 8) | (buffer[0] 0); _gt9147.y[i] (buffer[3] 8) | (buffer[2] 0); }每个触摸点读 4 字节X 低字节、X 高字节、Y 低字节、Y 高字节。合成 16 位坐标。4. 显示坐标cshow_pointer();打印触摸点数量和坐标。5. 清中断标志cbuffer[0] 0; gt9147_write(0x814E, buffer, 1); GPIO1-ISR | (1 9);写 0x814E 寄存器告诉 GT9147 处理完毕写 1 清 GPIO1 的中断标志位清标志是必须的不清的话中断会一直触发。五、SPI 通信SPI 是什么SPISerial Peripheral Interface串行外设接口是一种同步串行通信协议比 I2C 快。四根线线名称作用SCLK时钟主机产生MOSIMaster Out Slave In主机发从机收MISOMaster In Slave Out从机发主机收SSSlave Select片选选择从机和 I2C 的区别部分I2CSPI线数2SCL、SDA4SCLK、MOSI、MISO、SS速度较慢较快拓扑一主多从有地址一主多从有片选应答有 ACK/NACK无全双工半双工全双工SPI 的优点速度快可以到几十 MHz全双工收发可以同时进行协议简单没有地址、应答只有片选SPI 的缺点线多每个从机需要一根片选线没有应答不知道对方收没收到六、SPI 初始化1. 引脚复用cIOMUXC_SetPinMux(IOMUXC_UART2_CTS_B_ECSPI3_MOSI, 0); IOMUXC_SetPinMux(IOMUXC_UART2_RTS_B_ECSPI3_MISO, 0); IOMUXC_SetPinMux(IOMUXC_UART2_RX_DATA_ECSPI3_SCLK, 0); IOMUXC_SetPinMux(IOMUXC_UART2_TX_DATA_ECSPI3_SS0, 0);把 UART2 的四个引脚复用成 ECSPI3 的 MOSI、MISO、SCLK、SS0。2. 电气特性cIOMUXC_SetPinConfig(IOMUXC_UART2_CTS_B_ECSPI3_MOSI, 0x10B1); // ...0x10B1配置电气特性比之前用的0x10B0多一点可能开了上拉或其他特性。3. 片选引脚cGPIO1-GDIR | (1 20); GPIO1-DR | (1 20);GPIO1_IO20 用作片选设为输出默认拉高不选中。4. 配置 CONREGcECSPI3-CONREG 0; ECSPI3-CONREG | (7 20) | (14 12) | (2 8) | (1 4) | (1 3);bits 20-23PRE_DIV预分频bits 12-15POST_DIV后分频bits 8-11CHANNEL_MODE通道模式bit 4SMC开始模式控制bit 3SCLK_POL时钟极性5. 配置 CONFIGREGcECSPI3-CONFIGREG 0; ECSPI3-CONFIGREG | (1 20) | (1 4) | (1 0);bit 20SCLK_CTL时钟控制bit 4DATA_CTL数据控制bit 0SS_CTL片选控制6. 使能 SPIcECSPI3-CONREG | (1 0);CONREG 的 bit0 是ENSPI 使能位。七、收发数据cunsigned int ecspi3_write_and_read(unsigned int data) { unsigned int ret 0; while((ECSPI3-STATREG (1 0)) 0); // 等 TX FIFO 就绪 ECSPI3-TXDATA data; // 写数据 while((ECSPI3-STATREG (1 3)) 0); // 等 RX FIFO 有数据 ret ECSPI3-RXDATA; // 读数据 return ret; }SPI 是全双工的发一个字节的同时也收一个字节。流程等STATREG的 bit0TETX FIFO Empty表示可以写数据写TXDATA等STATREG的 bit3RRRX FIFO Ready表示收到数据读RXDATA注意SPI 没有只发或只收每次收发都是同时进行的。要读数据必须发一个哑字节dummy byte通常是 0xFF来产生时钟。八、今日总结今天学了 GT9147 触摸屏和 SPI 通信核心要点GT9147电容触摸屏控制器通过 I2C 通信引脚I2C2SDA、SCL、GPIO1_IO09中断、GPIO5_IO09复位初始化复位 → 读设备 ID → 配中断 → 进入读坐标模式中断处理读触摸点数量 → 读坐标 → 清中断标志坐标格式每点 4 字节X 低、X 高、Y 低、Y 高SPI同步串行通信四根线SCLK、MOSI、MISO、SS全双工收发同时进行寄存器CONREG控制、CONFIGREG配置、STATREG状态、TXDATA/RXDATA数据收发流程等 TX 就绪 → 写数据 → 等 RX 就绪 → 读数据特点速度快无应答用片选选择从机