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,中断回调读取多点坐标。
相关推荐
Jason_zhao_MR11 小时前
米尔电子参展预告_中国工博会2026-外发版
嵌入式硬件·机器人·工业控制
FakeOccupational15 小时前
【电路笔记 信号】DBPSK 波形查找表+脉冲成形(升余弦+根升余弦滤波)
开发语言·笔记
FPGA小徐16 小时前
STM32五路气敏传感器阵列电路详解:从HHC1000分压到AD8606跟随器和ADC采样
stm32·单片机·嵌入式硬件
Horn Still Sounds18 小时前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
智感子18 小时前
无人值守称重:地磅系统架构与流程
嵌入式硬件
新晨单片机设计20 小时前
S011C-基于STM32智能灯光控制系统(光强、声音、人体)【Proteus仿真+Keil程序+原理图】
stm32·嵌入式硬件·proteus·智能灯光控制系统
有范先生20 小时前
这次户外断粮危机后,我更在意主食能不能扛住极端环境了
笔记
喜欢打篮球的普通人21 小时前
MiniMind 学习笔记(十二):Pretrain 实操——从版本梳理到 8GB 显卡上的真实训练
人工智能·笔记·学习
女神下凡1 天前
芯参谋(26):DDR4_软件设计规范
arm开发·单片机·嵌入式硬件
zd8451015001 天前
DSLogic逻辑分析仪连接失败
嵌入式硬件