IMX6ULL裸机|SPI、LCD、PWM脉冲调制、电容触控屏学习笔记

📝摘要:本文完整梳理IMX6ULL裸机外设知识点:SPI串行外设接口、CPOL/CPHA四种模式;UART/I2C/SPI总线横向对比;ADXL345三轴加速度计;LCD液晶显示原理、像素格式、显存与时序信号;PWM脉冲宽度调制原理、周期/占空比;GT9147/GT1158电容多点触控屏硬件、I2C驱动流程;附带计算公式、代码片段。

🔖标签:#SPI #LCD #PWM #电容触控屏 #IMX6ULL裸机开发


1. SPI总线协议基础

SPI(Serial Peripheral Interface)串行外设接口,同步全双工串行通信 。

SPI四根硬件信号线:

信号 含义 方向
SCLK Serial Clock 串行时钟 主机输出,产生通信时钟
MOSI Master‑Out Slave‑In 主机输出,从机输入 主机→从机
MISO Master‑In Slave‑Out 主机输入,从机输出 从机→主机
CS/SS Chip Select 片选信号 主机输出,选中某一个从机设备

SPI特点:高位先行(MSB优先) ,先传输bit7,最后bit0;写即是读,读即是写 。

同步通信:所有比特由主机SCLK时钟同步,不需要双方协商波特率。

拓扑:一主多从架构 ;多个从机使用独立CS片选线,同一时刻只能选中一个从机。

通信速率范围:1MHz ~ 上百MHz,速度远高于I2C。
IMX6ULL主机可以对SPI外设分频,例如系统时钟60MHz,分频得到1MHz SPI时钟输出。
SPI硬件内部有移位寄存器 shift register;发送和接收同步移位;发送一个bit的同时就会收到一个bit。

TXFIFO发送缓冲区、RXFIFO接收缓冲区,用于缓存数据,降低CPU占用。

2. CPOL时钟极性、CPHA时钟相位、四种SPI模式

两个核心参数 CPOL、CPHA,组合得到4种SPI工作模式。

CPOL Clock Polarity 时钟极性

决定总线空闲状态时SCLK电平

  • CPOL=0:空闲时 SCLK 为低电平
  • CPOL=1:空闲时 SCLK 为高电平

CPHA Clock Phase 时钟相位

决定在哪一个时钟边沿进行数据采样

  • CPHA=0:第一个时钟边沿采样数据
  • CPHA=1:第二个时钟边沿采样数据

SPI四种模式汇总表

模式 CPOL CPHA 空闲SCLK电平 采样边沿 典型器件
Mode0 0 0 低电平 SCLK上升沿采样 ADXL345、OLED
Mode1 0 1 低电平 SCLK下降沿采样
Mode2 1 0 高电平 SCLK下降沿采样
Mode3 1 1 高电平 SCLK上升沿采样

⚠️主机和从机SPI模式必须完全一致,否则通信乱码。

3. UART / I2C / SPI三大串行总线横向对比

对比项 UART I2C SPI
通信模式 异步、串行、全双工 同步、串行、半双工 同步、串行、全双工
信号线 2根:TXD、RXD 2根:SCL、SDA 4根:SCLK、MOSI、MISO、CS
速率 <5MHz 100KHz ~ 3.4MHz 1MHz ~ 100MHz
设备拓扑 点对点 多主多从 一主多从,独立片选CS
比特顺序 低位先行 高位先行 高位先行
同步方式 波特率,无时钟线 SCL同步时钟 SCLK同步时钟

4. SPI读写特性、FIFO、Dummy占位字节

SPI"写即是读":只要主机输出SCLK时钟,MOSI往外发数据的同时,MISO就会同步接收从机的数据。

  1. SPI写操作流程

    主机发送寄存器地址 → 主机发送要写入的数据;SCLK持续输出时钟,MISO返回无效数据直接丢弃。

  2. SPI读操作流程

    SPI读不能单纯只接收,必须发送Dummy占位字节(一般0xFF或0x00)用来产生SCLK时钟。

流程:主机发送寄存器地址 → 发送Dummy占位字节产生时钟,此时MISO线上得到从机返回有效数据。

伪代码软件SPI发送接收示例:

c 复制代码
//SPI发送1字节,同时返回读到的1字节
unsigned char spi_rw_byte(unsigned char dat)
{
    unsigned char i, ret=0;
    for(i=0;i<8;i++)
    {
        //输出MOSI数据
        MOSI = (dat & 0x80) ? 1 : 0;
        dat <<=1;
        SCLK = 1;   //时钟边沿
        ret <<=1;
        if(MISO) ret |= 0x01; //读取MISO
        SCLK = 0;
    }
    return ret;
}

5. SPI实战器件 ADXL345三轴加速度计

ADXL345是SPI接口三轴加速度传感器

  • 分辨率:13bit;数值范围:0 ~ 2^13‑1 = 8191
  • 硬件量程:可配置 ±16g
  • 灵敏度系数:1g对应 32g / 8191 ≈ 0.0039g/LSB

换算公式:

加速度(g)=原始采样值×0.0039加速度(g) = 原始采样值 × 0.0039加速度(g)=原始采样值×0.0039

示例:

复制代码
x轴采样值=123 → ax = 123 * 0.0039 g
y轴采样值=200 → ay = 200 * 0.0039 g
z轴采样值=300 → az = 300 * 0.0039 g

g为重力加速度,1g = 9.8m/s²。

6. LCD液晶屏幕基础概念

分辨率

格式:横向像素 × 纵向像素。

  • 800 × 480:横向800个像素点,纵向480个像素点;
  • 1920 ×1080:1080P高清;
  • 2560 ×1440:2K分辨率。

屏幕物理尺寸

单位英寸 inch ,1英寸 = 2.54 cm;代表屏幕对角线长度。

规律:

  1. 分辨率相同,屏幕尺寸越小 → PPI像素密度越高,画面越细腻清晰;
  2. 屏幕尺寸相同,分辨率越高 → 画面越细腻清晰。

刷新率

单位HZ,代表每秒钟刷新多少帧完整图像,常见60HZ。

显存FrameBuffer

专门用来存放一帧图像像素数据的内存空间,LCD控制器会不断读取显存数据输出到屏幕。

示例:800*480屏幕,每个像素4字节ARGB

显存大小 = 800 * 480 *4 = 1536000 Byte ≈1.5MB

IMX6ULL DDR地址范围 0x80000000 ~ 0xA0000000,显存开辟在DDR内存区域。

7. 像素颜色格式:RGB888 / RGB565 / ARGB

格式 每个像素占用字节 R G B 说明
RGB565 2字节 R(5bit) G(6bit) B(5bit) 16bit,嵌入式LCD最常用,节省显存
RGB888 3字节 R(8bit) G(8bit) B(8bit) 24bit,1670万色彩
ARGB8888 4字节 A(Alpha透明度8bit) R(8bit) G(8bit) B(8bit)
RGB101010 4字节 R(10bit) G(10bit) B(10bit) 高色深,视频剪辑专业面板

Alpha:透明度通道;0完全透明,255完全不透明。

8. 显存与像素点内存映射计算

假设显存起始地址:0x89000000;分辨率800×480,32bit ARGB格式。

  • x:横坐标(列,0~799)
  • y:纵坐标(行,0~479)

像素内存地址计算公式:

复制代码
像素地址 = 显存基地址 + 4 * ( 800 * y + x )

C语言指针访问示例:

c 复制代码
//显存起始地址,ARGB每个像素4字节
unsigned int *fb = (unsigned int *)0x89000000;
//向坐标(x,y)像素点写入颜色0x00FF0000(红色)
fb[ 800 * y + x ] = 0x00FF0000;

fb是unsigned int指针,指针自增自动偏移4字节,不需要手动×4。

9. LCD时序控制信号 PCLK、HSYNC、VSYNC、DE

信号 全称 功能说明
PCLK Pixel Clock 像素时钟 每个PCLK周期输出1个像素点数据
HSYNC Horizontal Sync 行同步信号 同步每一行图像;标志一行的开始
VSYNC Vertical Sync 帧同步信号 同步整帧图像;标志一帧画面开始
DE Data Enable 数据使能 高电平代表当前传输的数据是有效像素

LCD控制器按照时序输出,DE有效期间输出RGB像素数据。

10. IMX6ULL LCD裸机配置步骤

  1. IOMUXC配置引脚复用功能,配置引脚电气属性;
  2. 配置LCD外设时钟(典型31MHZ);
  3. 配置LCD控制器寄存器:分辨率、时序参数、显存起始地址;
  4. 开启LCD控制器,屏幕输出图像。

11. PWM脉冲宽度调制原理

PWM(Pulse‑Width Modulation)脉冲宽度调制,利用计数器输出周期性方波;广泛用于LED亮度调节、电机调速、蜂鸣器。

关键概念:

  1. PWM周期 :一次完整方波循环占用时间;例如PWM频率1KHz,周期 = 1ms。
  2. 占空比:一个周期内高电平时间占整个周期的百分比,例如50%占空比。
  3. 内部计数器:计数器从0向上计数,计数到达比较采样点触发电平翻转;计数到达**回滚点(周期值)**计数器清零重新计数。

示例:计数器时钟源1MHz,计数器每加1代表1us。

简单伪代码逻辑:

c 复制代码
//周期回滚值 1000 → 周期1ms,频率1KHz
uint16_t period = 1000;
uint16_t compare_val = 500; //比较点,占空比50%

12. PWM寄存器:周期寄存器、比较采样寄存器、引脚极性

  1. 周期寄存器:设置计数器回滚点,决定PWM输出周期、输出频率。
  2. 采样/比较寄存器:设置比较点,决定占空比。
  3. 引脚极性配置 :决定引脚默认电平,会改变占空比效果
    • 引脚默认高电平:比较寄存器数值越大 → 高电平时间越长,占空比越大。
    • 引脚默认低电平:比较寄存器数值越大 → 高电平时间越短,占空比越小。

PWM硬件内部自带FIFO,可以存放多组比较值,支持输出复杂波形。

13. 触控屏分类:电阻屏、电容屏

  1. 电阻触控屏:依靠压力按压,需要做屏幕校准;支持硬物、手写笔按压;不支持多点触控。
  2. 电容触控屏:感应人体感应电荷,手指触摸生效,不需要按压;支持多点触控。

开发板常用电容触控芯片:

  • GT1158:I2C设备地址0x14
  • GT9147:I2C设备地址0x5D,最多支持5点多点触控;读取寄存器可以获取触摸点数、X/Y坐标。

14. GT9147电容多点触控I2C裸机驱动完整流程

GT9147使用I2C总线和IMX6ULL通信,有RST复位引脚、INT中断引脚。完整执行步骤:

  1. IOMUXC配置 :配置RST复位引脚、INT中断引脚复用功能与电气属性;
  2. 操作RST引脚,对触控芯片执行硬件复位;
  3. 初始化I2C控制器;
  4. 封装gt9147_read()、gt9147_write()I2C读写函数;
  5. 读取芯片ID寄存器0x8140,确认芯片通信正常;
  6. 配置INT引脚中断触发方式(下降沿触发);
  7. GIC配置:注册GT9147中断服务函数、设置中断优先级、使能GIC该路中断;
  8. 使能内核INT引脚对应的外设中断;
  9. 发生触摸触发INT中断,进入中断服务函数 :
    • 判断实际按下的触摸点数;
    • 读取坐标寄存器0x8158 ~ 0x815B,获取多点触摸X、Y坐标;
  10. 清除中断标志位,退出中断。

寄存器说明:0x804D、0x8056用来配置INT中断触发方式。

c 复制代码
//伪代码,读取GT9147芯片ID
unsigned char id_buf[4];
gt9147_read(0x8140, id_buf, 4);

15. 英文缩写全称对照表

缩写 英文全称 中文释义
SPI Serial Peripheral Interface 串行外设接口
SCLK Serial Clock SPI串行时钟
MOSI Master‑Out Slave‑In 主机输出从机输入信号线
MISO Master‑In Slave‑Out 主机输入从机输出信号线
CS Chip Select 片选信号
CPOL Clock Polarity 时钟极性
CPHA Clock Phase 时钟相位
FIFO First‑In First‑Out 先进先出缓冲区
Dummy Dummy Byte 占位虚字节
ADXL345 Analog‑Devices Accelerometer 345 三轴加速度传感器型号
g gravity 重力加速度单位
LCD Liquid Crystal Display 液晶显示器
PCLK Pixel Clock 像素时钟
HSYNC Horizontal Sync 行同步信号
VSYNC Vertical Sync 帧/垂直同步信号
DE Data Enable 数据使能信号
RGB Red Green Blue 红绿蓝三原色
ARGB Alpha Red Green Blue 带透明度的RGB像素格式
fb Frame Buffer 帧缓存(显存)
HZ Hertz 赫兹,频率单位
PWM Pulse‑Width Modulation 脉冲宽度调制
INT Interrupt 中断引脚
RST Reset 硬件复位引脚

💡复习小结

  1. SPI同步全双工,写即是读;读从机必须发送Dummy字节来产生SCLK时钟;CPOL、CPHA主机从机模式必须匹配。
  2. SPI对比I2C:SPI速度更高;I2C支持多主,SPI一主多从,每个从机需要独立CS片选。
  3. ADXL345加速度:原始值 ×0.0039得到g单位加速度。
  4. LCD显存:fb[y*宽 + x]定位像素;RGB565节省内存,RGB888色彩丰富;PCLK输出像素,HSYNC行同步,VSYNC帧同步,DE有效表示像素数据有效。
  5. PWM由周期寄存器、比较寄存器决定频率与占空比;引脚极性会改变占空比逻辑。
  6. GT9147电容触控使用I2C通信,依靠INT引脚中断上报触摸事件;先硬件复位,再读取ID,中断回调读取多点坐标。
相关推荐
蒸蒸yyyyzwd4 小时前
从后端面经学到的 3 个知识
笔记·学习
17岁的勇气4 小时前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
坤坤子吖4 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
花月mmc5 小时前
【FPGA】神经网络内容简介预告
嵌入式硬件·深度学习·神经网络·fpga开发
en.en..5 小时前
STM32 HAL 库 | 核心知识点整理
单片机·嵌入式硬件
无敌贵点大王6 小时前
从寄存器层面重学STM32(9)——DMA理论
stm32·单片机·嵌入式硬件
路灯上の马陈6 小时前
Java 内部类 学习笔记
笔记·学习
希和20276 小时前
51 单片机入门笔记:江科大课程代码逐行讲解(按键控制 LED 流水灯)
笔记·单片机·mongodb
前进的李工6 小时前
Agent 学习笔记 12:Agent 的工具应该怎么设计
人工智能·笔记·学习·agent·工具调用·skill·工具设计
ever_you_love7 小时前
2026.11.9录屏笔记
笔记