嵌入式开发基础学习笔记(pwm spi)

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 为例)

  1. IO 初始化:将引脚复用为 ECSPI 功能(如 MOSI, MISO, SCLK),片选引脚通常配置为 GPIO 输出。
  2. 时钟配置:使能 ECSPI 时钟 (CCM)。
  3. 寄存器配置
    • 复位控制器。
    • 设置为 主模式 ,配置 CPOLCPHA(ADXL345 通常为模式 3,即 CPOL=1, CPHA=1)。
    • 设置分频值(例如 60MHz 分频为 1MHz-5MHz 供传感器使用)。
    • 设置突发长度(通常为 8 或 16 位)。
  4. 数据收发
    • 拉低片选 (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 背光调节为例)

  1. IO 初始化:将 GPIO 引脚(如 GPIO1_IO08)复用为 PWM1_OUT 功能。
  2. 时钟配置:使能 PWM 模块时钟。
  3. 寄存器配置
    • 设置频率 :通过 PWMPR 寄存器设置 PWM 频率(例如 1KHz,人眼不易察觉闪烁)。

    • 设置时钟与分频 :在 PWMCR 中选择时钟源(ipg_clk)和分频系数。

    • 设置 FIFO :配置 REPEAT

    • 设置占空比

      • 计算公式: CompareValue=Period×DutyRatioCompareValue=Period×DutyRatio 。
      • 将计算出的比较值写入 PWMSAR 寄存器。
    • 中断处理 (可选)

      • 当 FIFO 数据用完时会产生中断(FE 标志置位)。
      • 在中断服务函数中重新向 PWMSAR 写入新的占空比值,以实现动态调节。
    • D. 应用场景

    • LCD 背光控制:通过按键改变 PWM 占空比,实现屏幕亮度的明暗变化。

    • 电机调速:调节占空比控制电机转速

相关推荐
-To be number.wan2 小时前
算法学习日记 | 模拟
c++·学习·算法
●VON2 小时前
React Native for OpenHarmony:解构 TouchableOpacity 的触摸反馈与事件流控制
javascript·学习·react native·react.js·性能优化·openharmony
charlie1145141912 小时前
malloc 在多线程下为什么慢?——从原理到实测
开发语言·c++·笔记·学习·工程实践
微露清风10 小时前
系统性学习Linux-第二讲-基础开发工具
linux·运维·学习
不会代码的小猴11 小时前
Linux环境编程第六天笔记--system-V IPC
linux·笔记
阳光九叶草LXGZXJ11 小时前
达梦数据库-学习-48-DmDrs控制台命令(同步之Manager、CPT模块)
linux·运维·数据库·sql·学习
乌恩大侠11 小时前
【笔记】USRP 5G 和 6G 参考架构
笔记·5g
biuyyyxxx12 小时前
Python自动化办公学习笔记(一) 工具安装&教程
笔记·python·学习·自动化
舟舟亢亢12 小时前
Java集合笔记总结
java·笔记