☰
i.MX6ULL 裸机开发|GT9147 触控 + SPI 与 ADXL345 加速度传感器驱动
2026/10/8 13:10:46 网站建设 项目流程

前言

本篇继续 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 从机地址由复位、中断引脚的上电时序决定:

  1. 拉低 CTRST、CTINT 保持大于 100us
  2. 拉高 CTRST,保持大于 5ms,完成地址配置
  3. 两种时序对应不同从机地址:0x5D、0x14,调试读 ID 失败优先核对从机地址

4. 芯片识别

读取寄存器0x8140的 Product ID,判断是 GT9147 还是 GT9151;读取出 ID 不对,优先排查 I2C 地址、引脚电气配置。

5. 中断触发方式与 GPIO 配置

  1. 中断触发模式寄存器:GT9147 读取0x804D,GT1158 读取0x8056;寄存器低两位代表触发方式
    • 00:上升沿|01:下降沿|02:低电平|03:高电平
    • 本开发板触控芯片为下降沿触发
  2. 中断引脚 GPIO 配置
    • 设置 GPIO 方向为输入
    • 引脚配置为开漏模式,悬浮输入,由触控芯片主动拉低产生中断
    • 配置中断控制器 ICR 寄存器为下降沿触发,解除 IMR 中断屏蔽位
  3. 进入坐标读取状态:向命令寄存器0x8040写入 0,开启触摸检测。

6. 中断服务函数处理规范

中断服务函数原则:短平快,禁止耗时操作,不要在中断里 printf,只更新标志位,主循环处理数据。

  1. 读取状态寄存器0x814E,读完必须写 0 清除中断标志,否则会持续触发中断
  2. 寄存器低 4 位获取触摸点数
  3. 循环读取多点 X/Y 坐标;坐标为小端存储(低字节在前),高低字节拼接得到完整坐标
  4. 用结构体存储触摸点数、有效标志、最多 5 组触摸点 XY 坐标
  5. 上层对接:驱动拿到坐标后,可以供给 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. 关键寄存器配置

  1. CONREG 控制寄存器
    • BURST_LENGTH:单次传输比特长度,8 位数据设置为 7
    • PRE_DIVIDER、POST_DIVIDER:两级分频,把模块时钟降到目标 SPI 时钟(例 1MHz)
    • CHANNEL_MODE:设置为主机模式
    • SMC:置 1,写入 TX FIFO 后自动启动 SPI 通信
  2. CONFIGREG 配置寄存器
    • SCLKCTL:配置 CPOL、CPHA,本实验 CPOL=1,CPHA=1
  3. 片选方案:不使用硬件自动片选,CS 引脚复用为 GPIO,软件手动拉高 / 拉低。

3. 代码配置要点

  1. 引脚复用:SCLK/MOSI/MISO 配置为 ECSPI3 外设功能;CS 引脚复用 GPIO 输出,默认高电平。
  2. 高速通信开启高压摆率 SRE=1,让信号边沿更陡,减少波形失真。
  3. 收发流程:写 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,开启全分辨率,量程 ±16g
  • 0x2C BW_RATE:0x08,配置输出速率,正常工作模式
  • 0x2D POWER_CTL:0x08,开启测量模式,传感器开始采集加速度

4. 多轴数据读取与显示

  1. 连续读取寄存器0x32 ~ 0x37,依次是 X、Y、Z 轴低字节、高字节
  2. 数据拼接:(high_byte <<8) | low_byte,存为 16 位有符号 short 类型
  3. 主循环持续读取 XYZ 三轴加速度,输出到 LCD 屏幕;转动传感器,观察数值随姿态变化,验证驱动。

总结

  1. GT9147 电容触控基于 I2C + 中断,重点掌握 I2C 从机地址时序、中断服务函数规范、小端坐标数据拼接;中断内只更新标志,主循环处理业务。
  2. SPI 是高速全双工串行总线,依靠 CS 片选选中设备,CPOL/CPHA 时序必须严格匹配外设手册;全双工带来哑字节读取的特殊写法。
  3. ECSPI 控制器通过两级分频设置波特率,FIFO 队列收发;软件 GPIO 控制 CS 是裸机常用方案。
  4. ADXL345 三轴加速度传感器驱动流程:硬件接线→ID 校验→寄存器初始化→SPI 读取三轴原始数据,最后可以把姿态数据送到 LCD 显示。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询