嵌入式开发基础学习笔记(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 占空比,实现屏幕亮度的明暗变化。

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

相关推荐
砚凝霜1 天前
软考网络工程师|第 4 章 移动通信、CDMA 码分多址 完整备考笔记
网络·笔记
编程圈子1 天前
电机驱动开发学习21. R3_2 双相扇区电流采样与第三相重构
驱动开发·学习·重构
chnyi6_ya1 天前
论文阅读笔记 | The Script is All You Need: 对话到电影级视频生成的 Agentic 框架
论文阅读·笔记
听雨入夜1 天前
CMake构建学习笔记-libxml库的构建
笔记·学习
iiiiii111 天前
【论文阅读笔记】Reparameterization Proximal Policy Optimization (RPO):将PPO的稳定性引入可微分强化学习
论文阅读·人工智能·笔记·深度学习·机器学习·机器人·具身智能
for_ever_love__1 天前
iOS: 网络管理单例
学习·ios·objective-c
不在逃避q1 天前
一步一步学习使用LiveBindings()TListView进阶使用(),打造天气预报程序
服务器·数据库·学习
鱼子星_1 天前
【C++】深入剖析list:list及其双向迭代器实现
开发语言·数据结构·c++·笔记·stl·list
知识分享小能手1 天前
高等数学学习教程,从入门到精通,微分中值定理与导数的应用(5)
学习·机器学习·概率论
520拼好饭被践踏1 天前
JAVA+Agent学习day25
java·开发语言·学习