SPI 与 PWM 驱动开发学习笔记
1. SPI (Serial Peripheral Interface)
SPI(串行外设接口)是一种高速、全双工、同步的串行通信总线。I.MX6U 自带的 SPI 外设被称为 ECSPI (Enhanced Configurable Serial Peripheral Interface)。
A. SPI 通信基础
- 物理连接 :
- SCLK (Serial Clock):时钟信号线,由主机产生。
- MOSI (Master Out Slave In):主机发送,从机接收。
- MISO (Master In Slave Out):主机接收,从机发送。
- CS/SS (Chip Select):片选信号,低电平有效,用于选择从机。
- 通信特性 :
- 全双工:数据发送和接收同时进行。
- MSB 先行:高位在前,低位在后。
- 四种模式 :由 CPOL (时钟极性) 和 CPHA (时钟相位) 决定。
- CPOL:空闲时 SCLK 的电平(0=低电平,1=高电平)。
- CPHA:采样时刻(0=第一个跳变沿,1=第二个跳变沿)。
B. I.MX6U ECSPI 寄存器配置
I.MX6U 的 ECSPI 支持主/从模式,本次实验通常使用 主模式。
| 寄存器 | 关键位域 | 说明 |
|---|---|---|
| CONREG | BURST_LENGTH | 突发传输长度 (bit31:20),设置传输位数。 |
| PRE_DIVIDER / POST_DIVIDER | 两步分频设置,ECSPI 时钟源通常为 60MHz。 | |
| CHANNEL_MODE | 通道模式,设置为主模式 (1) 或从模式 (0)。 | |
| EN | SPI 使能位。 | |
| CONFIGREG | SCLK_POL / SCLK_PHA | 设置时钟极性和相位,对应 CPOL 和 CPHA。 |
| STATREG | TC / RF / TF | 状态标志位:传输完成、接收 FIFO 空、发送 FIFO 满。 |
| TXDATA/RXDATA | - | 发送和接收数据寄存器。写入 TXDATA 启动传输,读取 RXDATA 获取数据。 |
C. 驱动流程 (以 ADXL345 为例)
- IO 初始化:将引脚复用为 ECSPI 功能(如 MOSI, MISO, SCLK),片选引脚通常配置为 GPIO 输出。
- 时钟配置:使能 ECSPI 时钟 (CCM)。
- 寄存器配置 :
- 复位控制器。
- 设置为 主模式 ,配置 CPOL 和 CPHA(ADXL345 通常为模式 3,即 CPOL=1, CPHA=1)。
- 设置分频值(例如 60MHz 分频为 1MHz-5MHz 供传感器使用)。
- 设置突发长度(通常为 8 或 16 位)。
- 数据收发 :
- 拉低片选 (CS)。
- 向
TXDATA写入数据,同时从RXDATA读取数据(全双工)。 - 拉高片选 (CS)。
2. PWM (Pulse Width Modulation)
PWM(脉冲宽度调制)本质上是通过数字手段模拟模拟信号的一种技术,常用于控制电机速度、灯光亮度(背光)等。
A. 核心概念
- 频率 (Frequency):1 秒内信号开关的次数。频率越高,人眼或设备越感觉不到闪烁。
- 占空比 (Duty Cycle) :一个周期内,高电平时间与总周期时间的比例。
- 0%:完全关闭。
- 50%:一半时间开启。
- 100%:完全开启。
- 原理:通过调节占空比,改变负载上的平均电压,从而控制亮度或速度。
B. I.MX6U PWM 寄存器配置
I.MX6U 的 PWM 外设结构包含一个 16 位自增计数器和一个 4x16 的 FIFO 队列。
表格
| 寄存器 | 关键位域 | 说明 |
|---|---|---|
| PWMCR | CLKSRC | 时钟源选择,通常选择 ipg_clk (66MHz)。 |
| PRESCALER | 分频值 (0-4095),用于降低计数频率。 | |
| REPEAT | FIFO 重复计数设置,决定 FIFO 中每个数据使用多少次。 | |
| EN | PWM 使能位。 | |
| PWMPR | - | 周期寄存器。决定 PWM 频率。公式: FPWM=FPCLK/(PWMPR+2)FPWM=FPCLK/(PWMPR+2) 。 |
| PWMSR | FE (FIFO Empty) | 状态寄存器。FE 位为 1 表示 FIFO 空,通常用此位触发中断。 |
| PWMSAR | - | 采样寄存器 。写入该寄存器的值即为比较值,决定了占空比。 |
C. 驱动流程 (以 LCD 背光调节为例)
- IO 初始化:将 GPIO 引脚(如 GPIO1_IO08)复用为 PWM1_OUT 功能。
- 时钟配置:使能 PWM 模块时钟。
- 寄存器配置 :
-
设置频率 :通过
PWMPR寄存器设置 PWM 频率(例如 1KHz,人眼不易察觉闪烁)。 -
设置时钟与分频 :在
PWMCR中选择时钟源(ipg_clk)和分频系数。 -
设置 FIFO :配置
REPEAT位 -
设置占空比 :
- 计算公式: CompareValue=Period×DutyRatioCompareValue=Period×DutyRatio 。
- 将计算出的比较值写入
PWMSAR寄存器。
-
中断处理 (可选) :
- 当 FIFO 数据用完时会产生中断(FE 标志置位)。
- 在中断服务函数中重新向
PWMSAR写入新的占空比值,以实现动态调节。
-
D. 应用场景
-
LCD 背光控制:通过按键改变 PWM 占空比,实现屏幕亮度的明暗变化。
-
电机调速:调节占空比控制电机转速
-