I.MX6ULL 裸机开发:SPI 总线与多点触摸屏驱动原理剖析

摘要

本文基于 I.MX6ULL 裸机开发实践,系统梳理了 SPI 串行外设接口的通信协议、ECSPI 控制器配置方法以及 ADXL345 三轴加速度传感器的驱动实现。同时,针对开发板搭载的 GT9147 多点电容触摸控制器,详细分析了其 I2C 通信机制、中断处理流程与坐标数据获取过程。文中涉及的寄存器配置与代码逻辑均以实际工程验证为基础,旨在为嵌入式底层驱动开发提供一份严谨的技术参考。

1. SPI 总线协议及其在 I.MX6ULL 中的实现

1.1 SPI 通信基础

SPI(Serial Peripheral Interface)是由 Motorola 定义的一种高速、全双工、同步串行通信总线。标准四线制 SPI 包含以下信号线:

  • SCLK:串行时钟线,由主机产生,用于同步数据传输;

  • MOSI(Master Out Slave In):主机数据输出,从机数据输入;

  • MISO(Master In Slave Out):主机数据输入,从机数据输出;

  • CS(Chip Select):片选信号,通常低电平有效,用于在多从机环境中选定通信目标。

SPI 的时序由两个关键参数决定:时钟极性(CPOL)与时钟相位(CPHA)。CPOL 定义时钟线空闲状态的电平,CPHA 决定数据采样的边沿位置。四种组合模式必须与从设备的数据手册严格匹配,否则将导致通信失败。

与 I2C 依赖设备地址的寻址方式不同,SPI 通过硬件片选信号选择从机,避免了地址冲突问题,同时全双工特性使其在数据吞吐率上具有明显优势。

1.2 I.MX6ULL 的 ECSPI 控制器

I.MX6ULL 集成了四个增强型可配置 SPI 控制器(ECSPI),每个控制器支持四个硬件片选通道,并配备 64×32 位的发送与接收 FIFO,显著提升了数据传输效率。

时钟源配置 :ECSPI 的时钟源通常选择 pll3_sw_clk(480 MHz),经静态 8 分频后得到 60 MHz 的 ECSPI_CLK_ROOT,再通过 CSCDR2 寄存器中的 ECSPI_CLK_PODF 域进行二次分频。时钟频率计算公式为:

其中 PREDIVPOSTDIV 分别对应 ECSPIx_CONREG 寄存器中的 PRE_DIVIDERPOST_DIVIDER 域。

关键寄存器摘要

寄存器 主要功能
ECSPIx_CONREG 突发长度、通道选择、主从模式、时钟分频、使能控制
ECSPIx_CONFIGREG SCLK 空闲电平、数据线空闲电平、片选极性、CPOL/CPHA 配置
ECSPIx_STATREG 传输完成标志、FIFO 空满状态、数据请求标志
ECSPIx_TXDATA/RXDATA 32 位数据寄存器,发送时写入,接收时读取

状态机驱动设计 :实际驱动中,需通过 ECSPIx_STATREGTC(传输完成)和 RDR(接收数据就绪)位轮询传输状态,确保在向 TXFIFO 写入新数据前,上一次传输已完成。同时,由于全双工特性,每一次写操作都会伴随一次读操作,接收到的数据应妥善保存或丢弃。

2. ADXL345 三轴加速度传感器驱动

2.1 器件特性与接口时序

ADXL345 是一款低功耗、高分辨率(最高 13 位)的三轴 MEMS 加速度计,支持 ±2g 至 ±16g 量程可选。其 SPI 接口兼容模式 3(CPOL=1,CPHA=1),即在时钟空闲时为高电平,数据在第二个边沿(上升沿)采样。

寄存器读写规则

  • 写操作:先发送寄存器地址(最高位为 0),再发送待写入数据;

  • 读操作:先发送寄存器地址(最高位置 1),随后连续读取一个或多个字节。

以读取 0x32(X 轴低字节)为例,应先发送 0xB2(0x32 | 0x80),再发起读取时序。

2.2 驱动封装与数据解析

驱动设计遵循"总线驱动---设备驱动"分层思想:底层 ECSPI 收发函数提供字节级传输能力,上层 ADXL345 模块负责寄存器读写与加速度值换算。

复制代码
/* 典型读寄存器实现 */
uint8_t adxl345_read_reg(uint8_t reg) {
    uint8_t tx_data = reg | 0x80;   // 读命令置位
    uint8_t rx_data;
    ecspi_transfer(&tx_data, &rx_data, 1);  // 发送地址,接收数据
    return rx_data;
}

三轴加速度值以 16 位补码形式分别存放在寄存器 0x32--0x37,读取后需根据当前量程换算为以 g 为单位的物理值。例如,±2g 量程下,分辨率为 3.9 mg/LSB,换算公式为:

3. 多点触摸屏控制器 GT9147 驱动分析

3.1 硬件连接与 I2C 寻址

GT9147 采用 I2C 接口与主控通信,同时提供中断(INT)与复位(RST)引脚。设备地址由复位释放瞬间 INT 引脚的电平决定:

  • 若复位上升沿时 INT 为高电平,设备地址为 0x14

  • 若 INT 为低电平,设备地址为 0x5D

本设计中通过 GPIO 模拟复位时序,并读取 ID 寄存器(0x8140--0x8143)验证通信链路,预期返回 ASCII 码 '9' '1' '1' '7'(或固件版本对应值)。

3.2 中断驱动与坐标读取

GT9147 的坐标数据通过中断引脚通知主控。初始化流程包括:

  1. I2C 控制器初始化:配置引脚复用及 I2C 总线速率;

  2. 复位时序生成:确定设备地址;

  3. 读取中断模式寄存器0x8056):确认 INT 触发方式(上升沿或下降沿);

  4. 配置 GPIO 中断:注册外部中断服务函数,使能 GIC 对应中断通道。

当中断触发时,中断服务函数执行以下操作:

  • 0x814E 读取当前有效触点数量;

  • 0x81500x81580x81600x81680x8170 依次读取各点坐标(每个点 4 字节,低字节在前);

  • 0x814E 写入 0x00 以清除中断标志,避免重复进入中断。

需要注意的是,GT9147 的数据手册存在部分寄存器地址描述错误,实际开发应以硬件实测为准。例如,第一点坐标的起始寄存器经调试确认为 0x8150 而非手册标注的 0x8158

3.3 触摸屏与显示系统的协同

触摸屏作为输入子系统,其坐标数据需与 LCD 显示分辨率匹配。本开发板 LCD 分辨率为 800×480,而 GT9147 上报的原始坐标范围通常与之对应。在实际应用中,可通过校准算法进一步消除线性偏差,但在裸机阶段,直接映射即可满足基础交互需求。

相关推荐
AI人工智能+电脑小能手11 天前
【大白话说Java面试题 第163题】【06_Spring篇】第23题:说说SpringBoot 自动配置原理?
java·自动配置·springboot·spi·条件注解
阿拉斯攀登12 天前
SPI 设备驱动开发
linux·驱动开发·嵌入式硬件·linux内核·嵌入式·linux驱动·spi
牛根生同志1 个月前
SPI数据收发的时候 TXE与RXNE标志位置位的时机
stm32·spi·transfer
大阳1231 个月前
ARM.8(ADC,SPI)
单片机·嵌入式硬件·adc·spi
大阳1232 个月前
ARM6.(时钟设置,EPIT定时器)
单片机·嵌入式硬件·gpt·arm·时钟·imx6ull·epit
proware2 个月前
rk3588适配MCP2515 SPI转CAN
can·spi·3588
W.W.H.3 个月前
嵌入式系统硬件接口全景图
经验分享·uart·iic·gpio·spi
charlie1145141913 个月前
嵌入式Linux驱动开发(8)——内存映射 I/O - 别拿物理地址当指针用
linux·开发语言·驱动开发·c·imx6ull
熬夜有啥好3 个月前
基于IMXULL的SHT3X 温湿度传感器 I2C 驱动开发调试记录
驱动开发·imx6ull·i2c·sht3x温湿度传感器
我在人间贩卖青春3 个月前
SPI总线
stm32·spi