前言
本篇继续 i.MX6ULL 裸机外设驱动学习,从电容多点触控芯片 GT9147/GT9151,再到 SPI 通信协议、ECSPI 控制器配置、ADXL345 三轴加速度传感器完整驱动,覆盖硬件原理、引脚配置、寄存器操作、代码实现与调试踩坑,打通 I2C 触控与 SPI 高速外设开发两条链路。
一、GT9147/GT9151 多点电容触摸屏驱动
1. 触控硬件原理
采用电容式触控 原理:手指触碰屏幕会改变极板间电容,芯片检测电压变化计算触摸坐标;芯片通过 I2C 和 i.MX6ULL 主控通信,最多支持5 点同时触摸。
2. 核心引脚功能
- I2C 引脚:I2C2 的 SDA、SCL,负责坐标数据交互
- CTINT:触控中断引脚,有触摸事件时触发中断通知 SOC
- CTRST:芯片硬件复位引脚
- 通信方式:使用中断方式获取触摸数据,相比轮询节省 CPU 资源,不会丢失触摸事件
3. I2C 从机地址配置时序
GT9147/GT9151 的 I2C 从机地址由复位、中断引脚的上电时序决定:
- 拉低 CTRST、CTINT 保持大于 100us
- 拉高 CTRST,保持大于 5ms,完成地址配置
- 两种时序对应不同从机地址:
0x5D、0x14,调试读 ID 失败优先核对从机地址
4. 芯片识别
读取寄存器0x8140的 Product ID,判断是 GT9147 还是 GT9151;读取出 ID 不对,优先排查 I2C 地址、引脚电气配置。
5. 中断触发方式与 GPIO 配置
- 中断触发模式寄存器:GT9147 读取
0x804D,GT1158 读取0x8056;寄存器低两位代表触发方式- 00:上升沿|01:下降沿|02:低电平|03:高电平
- 本开发板触控芯片为下降沿触发
- 中断引脚 GPIO 配置
- 设置 GPIO 方向为输入
- 引脚配置为开漏模式,悬浮输入,由触控芯片主动拉低产生中断
- 配置中断控制器 ICR 寄存器为下降沿触发,解除 IMR 中断屏蔽位
- 进入坐标读取状态:向命令寄存器
0x8040写入 0,开启触摸检测。
6. 中断服务函数处理规范
中断服务函数原则:短平快,禁止耗时操作,不要在中断里 printf,只更新标志位,主循环处理数据。
- 读取状态寄存器
0x814E,读完必须写 0 清除中断标志,否则会持续触发中断 - 寄存器低 4 位获取触摸点数
- 循环读取多点 X/Y 坐标;坐标为小端存储(低字节在前),高低字节拼接得到完整坐标
- 用结构体存储触摸点数、有效标志、最多 5 组触摸点 XY 坐标
- 上层对接:驱动拿到坐标后,可以供给 LVGL 图形库,做控件点击命中检测。
二、SPI 通信协议基础
1. SPI 特点
SPI(串行外设接口),同步、全双工、串行通信 ,通信速率高,起步 1Mbps,可达 10Mbps,传输效率高于 I2C。
四线标准 SPI:
- SCLK:时钟线,主机输出通信节拍
- MOSI:主机输出、从机输入
- MISO:主机输入、从机输出
- CS/SS:片选引脚,SPI 无设备地址,拉低对应 CS 引脚选中从机,其余从机保持静默。
2. 时序核心:CPOL、CPHA
- CPOL(时钟极性):总线空闲时 SCLK 电平。0 = 空闲低电平;1 = 空闲高电平
- CPHA(时钟相位):数据采样边沿。0 = 第一个边沿采样;1 = 第二个边沿采样
- 4 种组合模式,必须严格按照传感器手册配置 ECSPI 控制器。
3. SPI 读写逻辑
SPI 全双工特性:主机发数据的同时,从机同步回传数据。
读从机寄存器时,主机发送寄存器地址后,需要发送哑字节 (Dummy Byte) ,用来产生时钟,驱动从机返回数据。
ADXL345 通过寄存器地址最高 bit 区分读写:bit7=0 为写,bit7=1 为读(|0x80)。
4. ADXL345 三轴加速度传感器简介
ADXL345 是三轴加速度计,测量 X/Y/Z 三个方向加速度,可以检测姿态、震动、自由落体;
支持量程:±2g、±4g、±8g、±16g;内置 ADC,13 位分辨率;开发板使用 ECSPI3 总线通信。
三、i.MX6ULL ECSPI 增强 SPI 控制器原理与寄存器配置
1. ECSPI 硬件架构
ECSPI 自带 TX、RX FIFO 收发队列,移位寄存器完成串行收发,全双工传输。
对比 I2C:SPI 不需要 ACK 应答、启停信号,协议简单,传输速度更快。
模块时钟独立,本例模块时钟 60MHz,经过两级分频得到最终 SPI 总线时钟。
2. 关键寄存器配置
- CONREG 控制寄存器
- BURST_LENGTH:单次传输比特长度,8 位数据设置为 7
- PRE_DIVIDER、POST_DIVIDER:两级分频,把模块时钟降到目标 SPI 时钟(例 1MHz)
- CHANNEL_MODE:设置为主机模式
- SMC:置 1,写入 TX FIFO 后自动启动 SPI 通信
- CONFIGREG 配置寄存器
- SCLKCTL:配置 CPOL、CPHA,本实验 CPOL=1,CPHA=1
- 片选方案:不使用硬件自动片选,CS 引脚复用为 GPIO,软件手动拉高 / 拉低。
3. 代码配置要点
- 引脚复用:SCLK/MOSI/MISO 配置为 ECSPI3 外设功能;CS 引脚复用 GPIO 输出,默认高电平。
- 高速通信开启高压摆率 SRE=1,让信号边沿更陡,减少波形失真。
- 收发流程:写 STAT 状态寄存器,轮询 TXF,发送 FIFO 空再写入数据;等待 RXF 置位,读取 RXDATA 接收数据。
SPI 天然全双工,一套底层接口同时支持收发。
四、ADXL345 驱动完整实现与调试
1. SPI 读写接口封装
- ADXL345_Read:拉低 CS,发送带读标记的寄存器地址(
addr | 0x80),发送哑字节读取数据,读完拉高 CS - ADXL345_Write:拉低 CS,直接发送寄存器地址(最高位 0)+ 待写入数据,通信结束拉高 CS
2. 硬件接线
- VCC →3.3V;GND→GND
- CS:GPIO1_20
- SDO(MISO)、SDI(MOSI)、SCLK 接到 ECSPI3 对应引脚
- 调试第一步:读取 ID 寄存器
0x00,正确返回0xE5代表 SPI 通信正常;读取失败优先检查接线、CS 时序。
3. ADXL345 寄存器初始化配置
0x2E INT_ENABLE:0x00 关闭中断 / 0x08 开启指定中断0x31 DATA_FORMAT:写入 0x0B,开启全分辨率,量程 ±16g0x2C BW_RATE:0x08,配置输出速率,正常工作模式0x2D POWER_CTL:0x08,开启测量模式,传感器开始采集加速度
4. 多轴数据读取与显示
- 连续读取寄存器
0x32 ~ 0x37,依次是 X、Y、Z 轴低字节、高字节 - 数据拼接:
(high_byte <<8) | low_byte,存为 16 位有符号 short 类型 - 主循环持续读取 XYZ 三轴加速度,输出到 LCD 屏幕;转动传感器,观察数值随姿态变化,验证驱动。
总结
- GT9147 电容触控基于 I2C + 中断,重点掌握 I2C 从机地址时序、中断服务函数规范、小端坐标数据拼接;中断内只更新标志,主循环处理业务。
- SPI 是高速全双工串行总线,依靠 CS 片选选中设备,CPOL/CPHA 时序必须严格匹配外设手册;全双工带来哑字节读取的特殊写法。
- ECSPI 控制器通过两级分频设置波特率,FIFO 队列收发;软件 GPIO 控制 CS 是裸机常用方案。
- ADXL345 三轴加速度传感器驱动流程:硬件接线→ID 校验→寄存器初始化→SPI 读取三轴原始数据,最后可以把姿态数据送到 LCD 显示。