[IMX] 10.串行外围设备接口 - SPI

article/2025/8/1 4:16:38

代码链接:GitHub - maoxiaoxian/imx


参考资料:

https://zhuanlan.zhihu.com/p/290620901

SPI协议详解 - bujidao1128 - 博客园

SPI总线协议及SPI时序图详解 - Ady Lee - 博客园


目录

1.SPI 简介

2.I.MX6U ECSPI 简介

2.1.控制寄存器 1 - ECSPIx_CONREG

2.2.控制寄存器 2 - ECSPIx_CONFIGREG

2.3.采样周期 - ECSPIx_PERIODREG

2.4.SPI 时钟源

2.5.状态寄存器 - ECSPIx_STATREG

2.6.数据寄存器 - ECSPIx_TXDATA & ECSPIx_RXDATA

3.ICM-20608 简介

4.硬件连接


1.SPI 简介

SPI 全称 Serial Perripheral Interface,即串行外围设备接口,是一种高速、全双工的同步通信总线

SPI 以主从方式工作,通常有一个主设备和多个从设备,SPI 一般需要 4 根线,单向传输时也可以只使用 3 根线

标准 4 线 SPI (Quad Serial Peripheral Interface) 包含的通信线如下:

  • CS/SS:Slave Select/Chip Select,片选信号线,选择需要进行通信的从机设备,SPI 主机无需发送从机的设备地址,直接将相应的从机设备片选信号拉低即可;

  • SCLK:Serial Clock,串行时钟,和 I2C 的 SCL 时钟信号线一样,为 SPI 通信提供时钟;

  • MOSI/SDO:Master Out Slave In/Serial Data Output,主出从入信号线,该数据线仅用于主机向从机发送数据,也就是主机输出,从机输入;

  • MISO/SDI:Master In Slave Out/Serial Data Input,主入从出信号线,该数据线仅用于从机向主机发送数据,也就是主机输入,从机输出;

SPI 通信由主机率先发起,主机需要提供时钟信号,主机通过 SPI 连接多个从机设备的结构如下图所示:

SCLK 的时钟信号可配置总线极性 CPOL 和时钟相位 CPHA

CPOL 配置 SPI 总线的极性,CPHA 配置 SPI 总线的相位

极性直接影响 SPI 总线在空闲时的时钟信号为高电平还是低电平:

  • CPOL = 1:表示空闲时为高电平;

  • CPOL = 0:表示空闲时为低电平;

数据传输从跳变沿 (上升沿/下降沿) 开始,如下图所示:

相位决定 SPI 总线从哪个跳变沿开始采样数据:

  • CPHA = 0:表示从第一个跳变沿开始采样;

  • CPHA = 1:表示从第二个跳变沿开始采样;

SPI 总线有四种工作模式,通过串行时钟极性 CPOL 和相位 CPHA 的组合获得:

  • CPOL = 0:串行时钟空闲状态为低电平;

  • CPOL = 1:串行时钟空闲状态为高电平,此时可以通过配置时钟相位 CPHA 选择具体的传输协议;

  • CPHA = 0:串行时钟的第一个跳变沿 (上升沿或下降沿) 采集数据;

  • CPHA = 1:串行时钟的第二个跳变沿 (上升沿或下降沿) 采集数据;

四种工作模式的时钟信号如下图所示:

以 CPOL = 0,CPHA = 0 的工作模式为例,此时 SPI 进行全双工通信的时序如下图所示:

SPI 的时序较为简单,不像 I2C 需要区分写时序和读时序 (SPI 为全双工通信),图中,CS 片选信号先拉低,选中要通信的从设备,然后通过 MOSI 和 MISO 这两根数据线收发数据,MOSI 数据线发出 0xD2 给从设备,同时从设备通过 MISO 数据线向主设备返回 0x66

2.I.MX6U ECSPI 简介

I.MX6U 自带的 SPI 外设称为 ECSPI,全称 Enhanced Configurable Serial Peripheral Interface

ECSPI 有 64*32 个数据接收 FIFO (RXFIFO) 和 64*32 个数据发送 FIFO (TXFIFO),ECSPI 的特性如下:

  • 全双工同步串行通信;

  • 可配置主/从模式;

  • 四个片选信号,支持多从机;

  • 发送和接收都有一个 32x64 的 FIFO;

  • 片选信号 SS/CS,时钟信号 SCLK 的极性可配置;

  • 支持 DMA 传输;

I.MX6U 的 ECSPI 可以工作在主模式或从模式,例程使用主模式

I.MX6U 有 4 个 ECSPI,每个 ECSPI 支持四个硬件片选信号,即一个 ECSPI 可以支持 4 个外设,如果不使用硬件的片选信号则可以支持无数个外设,实验中不使用硬件片选信号,因为硬件片选信号只能使用指定的片选 IO,软件片选可以使用任意的 IO

2.1.控制寄存器 1 - ECSPIx_CONREG

  • BURST_LENGTH[31:24]:突发长度,设置 SPI 突发传输的数据长度,单次 SPI 传输最大可以发送 2^12bit 个数据,可以设置 0x000~0xFFF,对应 1~2^12bit,一般设置突发长度为一个字节 (8-bit);

  • CHANNEL_SELECT[19:18]:SPI 通道选择,一个 ECSPI 有四个硬件片选信号,每个片选信号为一个硬件通道,使用软件片选仍需设置 SPI 通道,可设置为 0~3,对应通道 0~3,I.MX6U-ALPHA 开发板上的 ICM-20608 的片选信号接的是 ECSPI3_SS0,即 ECSPI3 的通道 0,所以实验中设置为 0;

  • DRCTL[17:16]:控制 SPI 的 SPI_RDY 信号,为 0 时忽略 SPI_RDY 信号,为 1 时 SPI_RDY 信号为边沿触发,为 2 时 SPI_DRY 信号为电平触发;

  • PRE_DIVIDER[15:12]:SPI 预分频值,ECSPI 时钟分频包含两部分,该位域设置第一部分,可设置 0~15,对应 1~16 分频;

  • POST_DIVIDER[11:8]:SPI 后分频值,ECSPI 时钟分频的第二部分,分频值为 2^POST_DIVIDER;

  • CHANNEL_MODE[7:4]:SPI 通道主/从模式设置,CHANNEL_MODE[3:0] 分别对应 SPI 通道 3~0,为 0 时设置为从模式,为 1 时设置为主模式,比如设置为 0x01 表示设置通道 0 为主模式;

  • SMC[3]:开始模式控制,该位只在主模式有效,为 0 时通过 XCH 位开启 SPI 突发访问,为 1 时只要向 TXFIFO 写入数据就会开启 SPI 突发访问;

  • XCH[2]:该位只在主模式中有效,SMC 位为 0 时该位控制 SPI 突发访问的开启和关闭;

  • HT[1]:HT 模式使能,I.MX6ULL 不支持;

  • EN[0]:SPI 使能,为 0 关闭 SPI,为 1 使能 SPI;

2.2.控制寄存器 2 - ECSPIx_CONFIGREG

  • HT_LENGTH[28:24]:设置 HT 模式的消息长度,I.MX6ULL 不支持;

  • SCLK_CTL[23:20]:设置 SCLK 信号线空闲状态的电平,SCLK_CTL[3:0] 分别对应通道 3~0,为 0 时 SCLK 空闲状态为低电平,为 1 时 SCLK 空闲状态为高电平;

  • DATA_CTL[19:16]:设置 DATA 信号线空闲状态的电平,DATA_CTL[3:0] 分别对应通道 3~0,为 0 时 DATA 空闲状态为高电平,为 1 时 DATA 空闲状态为低电平;

  • SS_POL[15:12]:设置 SPI 片选信号的极性,SS_POL[3:0] 分别对应通道 3~0,为 0 时片选信号低电平有效,为 1 时片选信号高电平有效;

  • SCLK_POL[7:4]:SPI 时钟信号的极性,即 CPOL,SCLK_POL[3:0] 分别对应通道 3~0,为 0 时 SCLK 高电平有效 (空闲时为低电平),为 1 时 SCLK 低电平有效 (空闲时为高电平);

  • SCLK_PHA[3:0]:SPI 时钟相位,即 CPHA,SCLK_PHA[3:0] 分别对应通道 3~0, 为 0 时串行时钟的第一个跳变沿 (上升沿或下降沿) 采集数据,为 1 时串行时钟的第二个跳变沿 (上升沿或下降沿) 采集数据;

  • 通过 SCLK_POL[7:4] 和 SCLK_PHA[3:0] 设置 SPI 的工作模式;

2.3.采样周期 - ECSPIx_PERIODREG

  • CSD_CTL[21:16]:片选信号延时控制,设置片选信号和第一个 SPI 时钟信号之间的时间间隔,范围为 0~63;

  • CSRC[15]:SPI 时钟源选择,为 0 时选择 SPI CLK 为 SPI 的时钟源,为 1 时选择 32.768KHz 的晶振为 SPI 的时钟源;

  • SAMPLE_PERIO[14:0]:采样周期,可设置为 0~0x7FFF,分别对应 0~32767 个周期;

2.4.SPI 时钟源

SPI 的时钟树节点如下所示:

图中标号部分的含义如下:

  1. 时钟源选择,由寄存器 CSCDR2 的 ECSPI_CLK_SEL 位域控制,为 0 选择 pll3_60m 作为 ECSPI 的时钟源,为 1 选择 osc_clk 作为 ECSPI 的时钟源,实验中选择 pll3_60m 作为 ECSPI 的时钟源;

  2. ECSPI 的时钟分频值,由寄存器 CSCDR2 的 ECSPI_CLK_PODF 位域控制,分频值为 2^ECSPI_CLK_PODF,实验中设置为 0,即 1 分频;

  3. 最终进入 ECSPI 的时钟频率 SPI CLK = 60MHz;

2.5.状态寄存器 - ECSPIx_STATREG

  • TC[7]:传输完成标志,为 0 表示正在传输,为 1 表示传输完成;

  • RO[6]:RXFIFO 溢出标志,为 0 表示 RXFIFO 无溢出,为 1 表示 RXFIFO 溢出;

  • RF[5]:RXFIFO 空标志位,为 0 表示 RXFIFO 不为空,为 1 表示 RXFIFO 为空;

  • RDR[4]:RXFIFO 数据请求标志,为 0 表示 RXFIFO 中的数据不大于 RX_THRESHOLD,为 1 表示 RXFIFO 中的数据大于 RX_THRESHOLD;

  • RR[3]:RXFIFO 就绪标志,为 0 表示 RXFIFO 中没有数据,为 1 表示 RXFIFO 中至少有一个字的数据;

  • TF[2]:TXFIFO 满标志,为 0 表示 TXFIFO 不为满,为 1 表示 TXFIFO 为满;

  • TDR[1]:TXFIFO 数据请求标志,为 0 表示 TXFIFO 中的数据大于 TX_THRESHOLD,为 1 表示 TXFIFO 中的数据不大于 TX_THRESHOLD;

  • TE[0]:TXFIFO 空标志位,为 0 表示 TXFIFO 中至少有一个字的数据,为 1 表示 TXFIFO 为空;

2.6.数据寄存器 - ECSPIx_TXDATA & ECSPIx_RXDATA

Tx 和 Rx 的数据寄存器均为 32-bit 长度,如下所示:

 

3.ICM-20608 简介

ICM-20608 是一款 6 轴 MEMS 传感器,包括 3 轴加速度和 3 轴陀螺仪,其内部有一个 512 字节的 FIFO

陀螺仪的量程范围可编程设置,可选择 ±250,±500,±1000 和 ±2000°/s, 加速度的量程范围也可以编程设置,可选择 ±2g,±4g,±8g 和 ±16g

陀螺仪和加速度计均为 16 位的 ADC,且支持 I2C 和 SPI 两种协议,使用 I2C 接口时通信速度最高可达 400KHz,使用 SPI 接口时通信速度最高可达 8MHz

I.MX6U-ALPHA 开发板上的 ICM-20608 通过 SPI 接口与 SoC 连接,ICM-20608 的特性如下:

  • 陀螺仪支持 X、Y 和 Z 三轴输出,内部集成 16 位 ADC,测量范围可设置:±250,± 500,±1000 和 ±2000°/s;

  • 加速度计支持 X、Y 和 Z 轴输出,内部集成 16 位 ADC,测量范围可设置:±2g,±4g, ±4g,±8g 和 ±16g;

  • 用户可编程中断;

  • 内部包含 512 字节的 FIFO;

  • 内部包含一个数字温度传感器;

  • 耐 10000g 的冲击;

  • 支持快速 I2C,速度可达 400KHz;

  • 支持 SPI,速度可达 8MHz;

ICM-20608 的 3 轴方向如下图所示:

ICM-20608 的结构框图如下图所示:

使用 I2C 接口时 ICM-20608 的 AD0 引脚决定 I2C 设备从地址的最后一位,AD0 为 0 则 ICM-20608 的从设备地址为 0x68,AD0 为 1 则 ICM-20608 的从设备地址为 0x69

实验使用 SPI 接口,ICM-20608 通过读写寄存器进行配置和传感器数据读取,使用 SPI 接口读写寄存器时至少需要 16 个时钟信号或更多 (如果读写操作包括多个字节):

  • 第一个字节包含要读写的寄存器地址,寄存器地址的最高位是读写标志位,读取时最高位为 1,写入时最高位为 0,剩下的 7 位是实际的寄存器地址;

  • 寄存器地址后面跟着的就是要读写的数据;

实验中使用的 ICM-20608 的寄存器和相关位域如下图所示:

4.硬件连接


http://www.hkcw.cn/article/DdxqhKPYWL.shtml

相关文章

评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡

评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡 一、评论功能的核心架构设计 评论功能看似简单,实则涉及复杂的业务逻辑和技术考量。一个完整的评论系统需要支持:内容评论、回复评论、评论点赞、评论排序、敏感词过滤等功能。 …

计算机视觉入门:OpenCV与YOLO目标检测

计算机视觉入门:OpenCV与YOLO目标检测 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 计算机视觉入门:OpenCV与YOLO目标检测摘要引言技术原理对比1. OpenCV:传统图像处理与机器学…

C语言进阶--自定义类型详解(结构体、枚举、联合)

1.结构体 1.1结构体的声明 1.1.1结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.2结构的声明 struct tag {member-list; }variable-list;struct Stu {//学生的属性char name[20];int age; };struct Stu {…

asio之async_result

简介 async_result用来表示异步处理返回类型 async_result 是类模板 type:为类模板中声明的类型,对于不同的类型,可以使用类模板特例化,比如针对use_future

Hash 的工程优势: port range 匹配

昨天和朋友聊到 “如何匹配一个 port range”,觉得挺有意思,简单写篇散文。 回想起十多年前,我移植并优化了 nf-HiPAC,当时还看不上 ipset hash,后来大约七八年前,我又舔 nftables,因为用它可直…

力扣HOT100之动态规划:198. 打家劫舍

这道题之前刷代码随想录的时候做过,这一次直接一遍过了,还是按照动规五部曲: 1.确定dp[i]的含义:将下标为0 ~ i的房子纳入考虑范围时所能取到的最大收益 2.确定递推公式:dp[i] max(dp[i - 2] nums[i], dp[i - 1]); 3.dp数组初始化:dp[0] n…

基于VU37P的高性能采集板卡

基于VU37P的高性能采集板卡是一款最大可提供20路ADC接收通道的高性能采集板卡。每路A/D通道支持1GS/s的采样率,分辨率为14bit,模拟输入带宽可达500MHz,交流耦合,输入阻抗50欧姆。 产品简介 可提供20路ADC接收通道的高性能采集板…

使用ssh-audit扫描ssh过期加密算法配置

使用ssh-audit扫描ssh过期加密算法配置 安装检查ssh的加密算法配置修改ssh的加密算法配置 安装 # pip3安装ssh-audit pip3 instal ssh-audit检查ssh的加密算法配置 # 检查ssh的配置 ssh-audit 192.168.50.149修改ssh的加密算法配置 # 查看ssh加密配置文件是否存在 ls /etc/c…

身份证信息OCR识别提取

要实现Python中的身份证OCR识别,可以采用以下步骤和工具(结合开源库和API服务),以下是两种主流方案: 方案1:使用第三方OCR API(推荐百度/腾讯云) 百度OCR API 示例 注册并获取API …

C++之string的模拟实现

string 手写C字符串类类的基本结构与成员变量一、构造函数与析构函数二、赋值运算符重载三、迭代器支持四、内存管理与扩容机制五、字符串操作函数六、运算符重载总结 手写C字符串类 从零实现一个简易版std::string 类的基本结构与成员变量 namespace zzh { class string { …

Linux的调试器--gbd/cgbd

1.引入 #include <stdio.h> int Sum(int s, int e) {int result 0;for(int i s; i < e; i){result i;}return result; } int main() {int start 1;int end 100;printf("I will begin\n");int n Sum(start, end);printf("running done, result i…

云原生 Cloud Native Build (CNB)使用初体验

云原生 Cloud Native Build&#xff08;CNB&#xff09;使用初体验 引言 当“一切皆可云”成为趋势&#xff0c;传统开发环境正被云原生工具重塑。腾讯云CNB&#xff08;Cloud Native Build&#xff09;作为一站式开发平台&#xff0c;试图解决多环境协作难题。 本文将分享c…

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

目录 1 运算放大电路基础 1.1 概述 1.1.1 基本结构 1.1.2 理想特性 1.2 运算放大分析方法 1.2.1 虚短 1.2.2虚断 1.2.3 叠加定理 2 同向比例运算放大电路 2.1 概述 2.1.1 基本电路结构 2.1.2 电路原理 2.2 仿真分析 2.2.1 电压增益 2.2.2 相位分析 3 反向比例运…

系统思考:经营决策沙盘

今年是我为黄浦区某国有油漆涂料企业提供经营决策沙盘培训的第二年。在这段时间里&#xff0c;我越来越感受到&#xff0c;企业的最大成本往往不在生产环节&#xff0c;而是在决策错误上所带来的长远影响。尤其是在如今这个复杂多变的环境下&#xff0c;企业面临的挑战愈发严峻…

Java线程:并发/并行区别、线程生命周期、乐观锁/悲观锁

并发、并行 进程 正在运行的程序(软件)就是一个独立的进程线程是属于进程的&#xff0c;一个进程中可以同时运行很多个线程进程中的多个线程其实是并发和并行执行的 并发 进程中的线程是由CPU负责调度执行的&#xff0c;但CPU能同时处理线程的数量有限&#xff0c;为了保证…

等保测评-Mysql数据库测评篇

Mysql数据库测评 0x01 前言 "没有网络安全、就没有国家安全" 等保测评是什么&#xff1f; 等保测评&#xff08;网络安全等级保护测评&#xff09;是根据中国《网络安全法》及相关标准&#xff0c;对信息系统安全防护能力进行检测评估的法定流程。其核心依据《信…

mysql的Memory引擎的深入了解

目录 1、Memory引擎介绍 2、Memory内存结构 3、内存表的锁 4、持久化 5、优缺点 6、应用 前言 Memory 存储引擎 是 MySQL 中一种高性能但非持久化的存储方案&#xff0c;适合临时数据存储和缓存场景。其核心优势在于极快的读写速度&#xff0c;需注意数据丢失风险和内存占…

QNAP MEMOS 域名访问 SSL(Lucky)

注意&#xff1a;下述是通过ssh、docker-compose方式安装docker的&#xff0c;不是直接在container station中安装的哈&#xff01;&#xff01;&#xff01; 一、编辑docker-compose.yml文件 用“#”号标识的&#xff0c;在保存文件的时候建议去掉&#xff0c;不然有时候会出…

BioID技术在宿主-病原体相互作用领域的应用

细菌感染是全球公共卫生的重大威胁&#xff0c;而抗生素耐药性的提升使我们迫切需要深入了解宿主 -病原体相互作用。细菌病原体通过分泌效应蛋白&#xff0c;操纵宿主细胞以建立感染。这些效应蛋白通过与宿主蛋白相互作用&#xff0c;改变宿主细胞功能&#xff0c;但传统研究方…

解析楼宇自控系统:分布式结构的核心特点与优势展现

在建筑智能化发展的进程中&#xff0c;楼宇自控系统作为实现建筑高效运行与管理的关键&#xff0c;其系统结构的选择至关重要。传统的集中式楼宇自控系统在面对日益复杂的建筑环境和多样化的管理需求时&#xff0c;逐渐暴露出诸多弊端&#xff0c;如可靠性低、扩展性差、响应速…