📝摘要:本文完整梳理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就会同步接收从机的数据。
SPI写操作流程
主机发送寄存器地址 → 主机发送要写入的数据;SCLK持续输出时钟,MISO返回无效数据直接丢弃。SPI读操作流程
SPI读不能单纯只接收,必须发送Dummy占位字节(一般0xFF或0x00)用来产生SCLK时钟。
流程:主机发送寄存器地址 → 发送Dummy占位字节产生时钟,此时MISO线上得到从机返回有效数据。
伪代码软件SPI发送接收示例:
//SPI发送1字节,同时返回读到的1字节unsignedcharspi_rw_byte(unsignedchardat){unsignedchari,ret=0;for(i=0;i<8;i++){//输出MOSI数据MOSI=(dat&0x80)?1:0;dat<<=1;SCLK=1;//时钟边沿ret<<=1;if(MISO)ret|=0x01;//读取MISOSCLK=0;}returnret;}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 gg为重力加速度,
1g = 9.8m/s²。
6. LCD液晶屏幕基础概念
分辨率
格式:横向像素 × 纵向像素。
800 × 480:横向800个像素点,纵向480个像素点;1920 ×1080:1080P高清;2560 ×1440:2K分辨率。
屏幕物理尺寸
单位英寸 inch,1英寸 =2.54 cm;代表屏幕对角线长度。
规律:
- 分辨率相同,屏幕尺寸越小 → PPI像素密度越高,画面越细腻清晰;
- 屏幕尺寸相同,分辨率越高 → 画面越细腻清晰。
刷新率
单位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语言指针访问示例:
//显存起始地址,ARGB每个像素4字节unsignedint*fb=(unsignedint*)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裸机配置步骤
- IOMUXC配置引脚复用功能,配置引脚电气属性;
- 配置LCD外设时钟(典型31MHZ);
- 配置LCD控制器寄存器:分辨率、时序参数、显存起始地址;
- 开启LCD控制器,屏幕输出图像。
11. PWM脉冲宽度调制原理
PWM(Pulse‑Width Modulation)脉冲宽度调制,利用计数器输出周期性方波;广泛用于LED亮度调节、电机调速、蜂鸣器。
关键概念:
- PWM周期:一次完整方波循环占用时间;例如PWM频率1KHz,周期 =
1ms。 - 占空比:一个周期内高电平时间占整个周期的百分比,例如50%占空比。
- 内部计数器:计数器从0向上计数,计数到达比较采样点触发电平翻转;计数到达**回滚点(周期值)**计数器清零重新计数。
示例:计数器时钟源1MHz,计数器每加1代表1us。
简单伪代码逻辑:
//周期回滚值 1000 → 周期1ms,频率1KHzuint16_tperiod=1000;uint16_tcompare_val=500;//比较点,占空比50%12. PWM寄存器:周期寄存器、比较采样寄存器、引脚极性
- 周期寄存器:设置计数器回滚点,决定PWM输出周期、输出频率。
- 采样/比较寄存器:设置比较点,决定占空比。
- 引脚极性配置:决定引脚默认电平,会改变占空比效果
- 引脚默认高电平:比较寄存器数值越大 → 高电平时间越长,占空比越大。
- 引脚默认低电平:比较寄存器数值越大 → 高电平时间越短,占空比越小。
PWM硬件内部自带FIFO,可以存放多组比较值,支持输出复杂波形。
13. 触控屏分类:电阻屏、电容屏
- 电阻触控屏:依靠压力按压,需要做屏幕校准;支持硬物、手写笔按压;不支持多点触控。
- 电容触控屏:感应人体感应电荷,手指触摸生效,不需要按压;支持多点触控。
开发板常用电容触控芯片:
- GT1158:I2C设备地址
0x14 - GT9147:I2C设备地址
0x5D,最多支持5点多点触控;读取寄存器可以获取触摸点数、X/Y坐标。
14. GT9147电容多点触控I2C裸机驱动完整流程
GT9147使用I2C总线和IMX6ULL通信,有RST复位引脚、INT中断引脚。完整执行步骤:
- IOMUXC配置:配置
RST复位引脚、INT中断引脚复用功能与电气属性; - 操作RST引脚,对触控芯片执行硬件复位;
- 初始化I2C控制器;
- 封装
gt9147_read()、gt9147_write()I2C读写函数; - 读取芯片ID寄存器
0x8140,确认芯片通信正常; - 配置INT引脚中断触发方式(下降沿触发);
- GIC配置:注册GT9147中断服务函数、设置中断优先级、使能GIC该路中断;
- 使能内核INT引脚对应的外设中断;
- 发生触摸触发INT中断,进入中断服务函数:
- 判断实际按下的触摸点数;
- 读取坐标寄存器
0x8158 ~ 0x815B,获取多点触摸X、Y坐标;
- 清除中断标志位,退出中断。
寄存器说明:
0x804D、0x8056用来配置INT中断触发方式。
//伪代码,读取GT9147芯片IDunsignedcharid_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 | 硬件复位引脚 |
💡复习小结
- SPI同步全双工,写即是读;读从机必须发送Dummy字节来产生SCLK时钟;CPOL、CPHA主机从机模式必须匹配。
- SPI对比I2C:SPI速度更高;I2C支持多主,SPI一主多从,每个从机需要独立CS片选。
- ADXL345加速度:原始值 ×0.0039得到g单位加速度。
- LCD显存:
fb[y*宽 + x]定位像素;RGB565节省内存,RGB888色彩丰富;PCLK输出像素,HSYNC行同步,VSYNC帧同步,DE有效表示像素数据有效。- PWM由周期寄存器、比较寄存器决定频率与占空比;引脚极性会改变占空比逻辑。
- GT9147电容触控使用I2C通信,依靠INT引脚中断上报触摸事件;先硬件复位,再读取ID,中断回调读取多点坐标。