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

代码链接: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.pswp.cn/news/907598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Docker和YARN的大数据环境部署实践最新版

基于Docker和YARN的大数据环境部署实践 目的 本操作手册旨在指导用户通过Docker容器技术,快速搭建一个完整的大数据环境。该环境包含以下核心组件: Hadoop HDFS/YARN(分布式存储与资源调度)Spark on YARN(分布式计算…

Java设计模式之中介者模式详解

Java设计模式之中介者模式详解 一、中介者模式核心思想 核心目标:通过中介对象封装一组对象间的交互,将网状的对象关系转变为星型结构。如同机场控制塔协调所有飞机的起降,避免飞机之间直接通信导致的混乱。 二、中介者模式类图(…

ArcGIS应用指南:基于网格与OD成本矩阵的交通可达性分析

随着城市化进程的加速,交通系统的效率和公平性日益成为影响居民生活质量的关键因素之一。在这一背景下,如何科学评估城市区域内的交通可达性,成为了城市规划、交通管理和公共政策制定中的重要议题。作为中国东南沿海的重要港口城市,厦门以其独特的地理优势和快速的城市发展…

基于NXP例程学习CAN UDS刷写流程

文章目录 前言1.概述1.1 诊断报文 2.协议数据单元(N_PDU)2.1 寻址信息(N_AI)2.1.1 物理寻址2.1.2 功能寻址2.1.3 常规寻址(Normal addressing)2.1.4 常规固定寻址(Normal fixed addressing)2.1.5 扩展寻址&…

近期手上的一个基于Function Grap(类AWS的Lambda)小项目的改造引发的思考

函数式Function是云计算里最近几年流行起来的新的架构和模式,因为它不依赖云主机,非常轻量,按需使用,甚至是免费使用,特别适合哪种数据同步,数据转发,本身不需要保存数据的业务场景,…

什么是 SQL 注入?如何防范?

什么是 SQL 注入?如何防范? 1. SQL 注入概述 1.1 基本定义 SQL 注入(SQL Injection)是一种通过将恶意SQL 语句插入到应用程序的输入参数中,从而欺骗服务器执行非预期SQL命令的攻击技术。攻击者可以利用此漏洞绕过认证、窃取数据甚至破坏数据库。 关键结论:SQL 注入是O…

高德地图应用OceanBase单元化构建下一代在线地图服务

IEEE International Conference on Data Engineering (ICDE) 是数据库和数据工程领域的顶级学术会议之一(与SIGMOD、VLDB并成为数据库三大顶会),自1984年首次举办以来,每年举办一次。ICDE涵盖广泛的主题,包括数据库系统…

Vue3中Element-Plus中el-input及el-select 边框样式

如果不需要显示下边框&#xff0c;纯无边框直接将 【border-bottom: 1px solid #C0C4CC; 】注掉或去掉即可。 正常引用组件使用即可&#xff0c;无须自定义样式&#xff0c;最终效果CSS样式。 <style scoped> /* 输入框的样式 */ :deep(.el-input__wrapper) { box-sha…

如何做好一份技术文档:从信息孤岛到知识图谱的进阶之路

如何做好一份技术文档&#xff1a;从信息孤岛到知识图谱的进阶之路 在软件开发的漫长征程中&#xff0c;技术文档如同隐藏在代码丛林中的路标&#xff0c;不仅指引着开发团队的前行方向&#xff0c;更在产品迭代的岁月里构筑起知识传承的桥梁。一份优质的技术文档&#xff0c;既…

Docker Compose使用自定义用户名密码启动Redis

通常我们使用下面的命令来启动 redis 容器&#xff0c;此时连接 Redis 的时候是不需要用户认证的 sudo docker run -d --name my-redis -p 6379:6379 redis此时我们可以使用 redis-server --requirepass "mypassword" 来指定默认用户&#xff08;default&#xff09…

1.什么是node.js、npm、vue

一、Node.js 是什么&#xff1f; &#x1f63a; 定义&#xff1a; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;让你可以在浏览器之外运行 JavaScript 代码&#xff0c;主要用于服务端开发。 &#x1f63a;从计算机底层说&#xff1a;什么是“运…

如何在 Vue.js 中集成 Three.js —— 创建一个旋转的 3D 立方体

在这篇文章中&#xff0c;我将向大家展示如何将 Three.js 与 Vue.js 结合&#xff0c;创建一个简单的 3D 场景&#xff0c;并展示一个旋转的立方体。通过这个简单的示例&#xff0c;你将学习到如何在 Vue 项目中集成 Three.js&#xff0c;以及如何创建动态的 3D 内容。 1. 安装…

DeepSeek‑R1-0528 重磅升级:蚂蚁百宝箱免费、无限量调用

DeepSeek‑R1-0528 重磅升级&#xff1a;蚂蚁百宝箱免费、无限量调用 端午假期前一天&#xff0c;DeepSeek‑R1 更新到了 0528 版本&#xff01; 官方说明&#xff1a;0528 版本在深度思考与推理能力方面显著增强——在数学、编程与通用逻辑等多项基准测评中&#xff0c;表现已…

RS232转Profinet网关在检漏仪与西门子PLC里的应用

RS232转Profinet网关在检漏仪与西门子PLC里的应用 在工业自动化和控制领域&#xff0c;设备间的高效通信至关重要。RS232转Profinet网关作为一种关键的转换工具&#xff0c;能够将传统的RS232接口设备接入现代化的Profinet网络&#xff0c;从而实现数据的无缝传输和设备的远程…

jenkins-jenkins简介

一、简介 jenkins是一个可扩展的持续集成引擎。持续集成&#xff0c;也就是通常所说的CI&#xff08;Continues Integration&#xff09;&#xff0c;可以说是现代软件技术开发的基础。持续集成是一种软件开发实践&#xff0c; 即团队开发成员经常集成他们的工作&#xff0c;通…

vue发版html 生成打包到docker镜像进行发版

将Vue项目打包成Docker镜像部署主要分为以下几个步骤&#xff1a; 1. Vue项目打包‌ 执行npm run build生成dist文件夹&#xff0c;包含静态资源文件 注意检查index.html中资源引用路径是否正确&#xff08;避免绝对路径问题&#xff09; 2. 编写Dockerfile Copy Code FROM…

扫地机器人苦寻新引擎,大疆们却已攻入腹地

原创 科技新知 前沿科技组 作者丨江篱 编辑丨樱木、九黎 竞争激烈的扫地机器人赛道&#xff0c;迎来了新玩家。 据近日相关报道&#xff0c;大疆扫地机器人产品已开始量产&#xff0c;预计将于6月份发布。消息称大疆研发扫地机器人已超过四年&#xff0c;即将上市的产品是扫…

【C++】22. 红黑树封装实现Mymap和Myset

上一章节我们实现了红黑树&#xff0c;这一章节我们就用红黑树封装来实现一个我们自己的map和set 1. 源码及框架分析 SGI-STL 3.0版本的源代码中&#xff0c;map和set的实现主要分布在若干头文件中&#xff0c;这些头文件构成了这两个容器的完整实现架构&#xff1a; 核心头文…

02_redis分布式锁原理

文章目录 一、redis如何实现分布式锁1. 使用 SETNX 命令2. 设置过期时间3. 释放锁4. 注意事项5. 示例代码二、Java中分布式锁如何设置超时时间1. Redis分布式锁2. 基于Zookeeper的分布式锁3. 基于数据库的分布式锁注意事项一、redis如何实现分布式锁 Redis 实现分布式锁是一种…

酷派Cool20/20S/30/40手机安装Play商店-谷歌三件套-GMS方法

酷派Cool系列主打低端市场&#xff0c;系统无任何GMS程序&#xff0c;也不支持直接开启或者安装谷歌服务等功能&#xff0c;对于国内部分经常使用谷歌服务商店的小伙伴非常不友好。涉及机型有酷派Cool20/Cool20S /30/40/50/60等旗下多个设备。好在这些机型运行的系统都是安卓11…