SPI协议

文章目录

  • 前言
  • 一、简介
    • 1、通信模式
    • 2、总线定义
    • 3、SPI通信结构
    • 4、SPI通讯时序
    • 5、SPI数据交互过程
  • 二、多从机模式
    • 1、多NSS
    • 2、菊花链
    • 3、SPI通信优缺点
    • 4、UART、IIC、SPI 区别
  • 三、总结
  • 四、参考资料


前言

SPI协议是我们的重要通信协议之一,我们需要掌握牢靠。


一、简介

1、通信模式

SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步串行通信所需的完整UART要简单得多,并且更加便宜;

2、总线定义

MISO:Master input slave output 主机输入,从机输出(数据来自从机);

MOSI:Master output slave input 主机输出,从机输入(数据来自主机);

SCLK : Serial Clock 串行时钟信号,由主机产生发送给从机;

SS:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。

  • 需要注意的是不同的厂家定义不同:

MISO也可以是SIMO,DOUT,DO,SDO或SO(在主机端);
MOSI也可以是SOMI,DIN,DI,SDI或SI(在主机端);
NSS也可以是CE,CS或SSEL;
SCLK也可以是SCK;

3、SPI通信结构

在这里插入图片描述

上图为了更好的区分,实际上无论是在主机传输到从机还是从机传输到主机两条线都在传输数据。传输过程:主机首先会将NSS信号拉低来表示选择那个从机进行通信当接收端检测到时钟的边沿信号立即读取数据线的信号,时钟信号只能由主机产生。

在这里插入图片描述

SSPBUF:Synchronous Serial Port Buffer, 泛指 SPI 设备里面的内部缓冲区, 一般在物理上是以 FIFO 的形式, 保存传输过程中的临时数据;
SSPSR:Synchronous Serial Port Register, 泛指 SPI 设备里面的移位寄存器(Shift Regitser), 它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;
Controller:泛指 SPI 设备里面的控制寄存器, 可以通过配置它们来设置 SPI 总线的传输模式。

需要注意的是:在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。

4、SPI通讯时序

时钟极性 CKP/Clock Polarity:

根据芯片的级型要求决定我们的空闲状态是高电平还是低电平

  • CKP = 0:时钟空闲IDLE为低电平 0
  • CKP = 1:时钟空闲IDLE为高电平1

时钟相位 CKE /Clock Phase (Edge):

除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKECPHA;顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;

  • CKE = 0:在时钟信号SCK的第一个跳变沿采样;
  • CKE = 1:在时钟信号SCK的第二个跳变沿采样;
    我们根据上面这两个极性与相位来确定我们的传输模式,不同的模式传输的时序不同。
  • 01
    在这里插入图片描述
  • 10

在这里插入图片描述

  • 00
    在这里插入图片描述
  • 11
    在这里插入图片描述
  • 汇总图:
    在这里插入图片描述

5、SPI数据交互过程

下面解释的数据交互过程采用00的模式进行传输
在这里插入图片描述

上表中时钟信号 1 代表时钟上升沿,0 代表下降沿。我们采用的时 SPI 通信模式 0,所以第一个时钟上升沿到来时完成数据采样,主机将自己要发送的数据最高位放到 MOSI(主机输出从机输入数据线)上,而从机也将自己要发送的数据最高位放到 MISO(从机输出主机输入数据线)上,当第一个时钟的下降沿到来时主机的 SSPSR 把 MISO 上的数据存入 SSPBUF,而从机的 SSPSR 则把 MOSI 上的数据存入自己的SSPBUF,这样主机从机就完成了 1bit 数据的交互。

二、多从机模式

1、多NSS

  1. 通常,每个从机都需要一条单独的SS线。
  2. 如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平。
    在这里插入图片描述

2、菊花链

定义:在设备信号以串行的方式从一个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式称为菊花链。

由于串行传输,我们需要一级一级的查找,如果在更高优先级的设备发送故障,那么下面优先级较低的就不会得到服务,一般的解决方法是使用超时处理,超过我们设定的时间直接跳过该从机(短路)。
在这里插入图片描述

3、SPI通信优缺点

优点:

1、全双工通信

2、高速数据传输速率

3、极其灵活的数据传输、不限于8位、可以是任意大小的字

4、非常简单的硬件结构:从站不需要唯一地址、从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

缺点:

1、没有主从机的应答信号:主机可能在不知情的情况下无处发送

2、通常仅支持一个主设备

3、需要更多的引脚(与I2C不同)

4、没有定义硬件级别的错误检查协议

5、与RS-232和CAN总线相比,只支持非常短的距离

4、UART、IIC、SPI 区别

1、对于信号线数目:
UART为3根,RX、TX、GND ,SPI为4根,SDO、SDI、SCLK、SS,IIC为2根,SDA、SCLK
2、设备主从关系
UART无从属关系,SPI存在主从设备,通过片选信号选择从机 ,而IIC同样也存在主从设备,不过是通过地址选择从机。
3、通信方式
UART无从属关系,SPI存在主从设备,通过片选信号选择从机 ,而IIC同样也存在主从设备,不过是通过地址选择从机。
4、传输速度
UART传输速度较慢 ,SPI比I2C总线要快,速度可达到几Mbps。
5、应用场景
UART常用于控制计算机与串行设备的芯片,也就是我们经常所说的串口,基本都用于调试。
SPI主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间 。
I2C一般是用在同一个板子上的2个IC之间的通信 ,它可以替代标准的并行总线,连接各种集成电路和功能模块
6、传输距离
IIC弱于UART和SPI,因为I2C需要有双向IO的支持,而且使用上拉电阻(为了实现线与),抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信
7、通信特征
UART:异步,一帧可以传5/6/7/8位,低位先发送
SPI: 同步,SPI允许数据一位一位的传送,甚至允许暂停。从最高位开始传
IIC:同步,电平信号,一次连续8bit。从最高位开始传
8、协议复杂度
UART:结构比较复杂
SPI:实现要比UART简单,UART需要固定的波特率,也就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。
IIC:协议比SPI复杂,但是连线比标准的SPI要少


三、总结

稍微将SPI的资料进行了一个整理,这里非常感谢下面参考的博主,写的非常详细,一文读懂!

四、参考资料

SPI协议详解(图文并茂+超详细)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69518.shtml

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

相关文章

postgis数据库导出csv表再导入postgis

1、导出csv表 from settings_Address import * from sqlalchemy import create_engine, MetaData import pandas as pd def create_conn(Postgis_user,Postgis_password,Postgis_host,Postgis_port,dbname_PG):# return create_engine(PostgispyPostgis://{}:{}{}:{}/{}.forma…

Mysql 流程控制

简介 我们可以在存储过程和函数中实现比较复杂的业务逻辑,但是需要对应的流程控制语句来控制,就像Java中分支和循环语句一样,在MySQL中也提供了对应的语句,接下来就详细的介绍下。 1.分支结构 1.1 IF语句 IF 表达式1 THEN 操作1…

Android MQTT:实现设备信息上报与远程控制

Android MQTT:实现设备信息上报与远程控制 1. 介绍 1.1 MQTT是什么? MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,最初由IBM开发,用于连接远程设备与服务器之间的通信。它在物…

尚硅谷SpringMVC (9-13)

九、HttpMessageConverter HttpMessageConverter ,报文信息转换器,将请求报文转换为 Java 对象,或将 Java 对象转换为响应报文 HttpMessageConverter提供了两个注解和两个类型: RequestBody , ResponseBody &#xff…

手写Mybatis:第20章-Mybatis 框架源码10种设计模式分析

文章目录 一、类型:创建型模式1.1 工厂模式1.2 单例模式1.3 建造者模式 二、类型:结构型模式2.1 适配器模式2.2 代理模式2.3 组合模式2.4 装饰器模式 三、类型:行为型模式3.1 模板模式3.2 策略模式3.3 迭代器模式 一、类型:创建型…

HashMap源码分析(JDK1.8)

概述 JDK 1.8 对 HashMap 进行了比较大的优化,底层实现由之前的 “数组链表” 改为 “数组链表红黑树”,本文就 HashMap 的几个常用的重要方法和 JDK 1.8 之前的死循环问题展开学习讨论。 JDK 1.8 的 HashMap 的数据结构如下图所示,当链表节…

Elasticsearch Head的使用

目录 概述一、安装 Elasticsearch Head二、解压文件三、安装Elasticsearch Head依赖四、启动 Elasticsearch Head五、修改Elasticsearch Head启动端口号六、使用 Elasticsearch Head注意事项 概述 Elasticsearch Head 是一个用于管理和监控 Elasticsearch 集群的 Web 界面工具…

【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】

【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】 文章目录 【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】一、安装Anaconda虚拟环境管理器二、创建虚拟环境并激活三、安装Pytorch四、测试pytorchReference 一、安装Anaconda虚拟环境管理器 首先进入…

Ubuntu18.04系统下通过ROS控制Kinova真实机械臂-多种实现方式

所用测试工作空间test_ws:包含官网最原始的功能包 一、使用Kinova官方Development center控制真实机械臂 0.在ubuntu系统安装Kinova机械臂的Development center,这一步自行安装,很简单。 1.使用USB连接机械臂和电脑 2.Development center…

typescript删除array中的空值

使用.flat() 可以看到,调用之后空值被清清除了,如果本身就是1维数组就无所谓,但如果本身是多维数组,又不想数组维度被改变的话就需要传入0,才不会导致数据维度改变

Webpack5入门到原理

Webpack5学习 尚硅谷Webpack5新版视频教程 B站直达:https://www.bilibili.com/video/BV14T4y1z7sw 百度网盘:https://pan.baidu.com/s/114lJRGua2uHBdLq_iVLOOQ 提取码:yyds 阿里云盘:https://www.aliyundrive.com/s/UMkmCzdWsGh&…

[数据集][目标检测]裸土识别裸土未覆盖目标检测数据集VOC格式857张2类别

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):857 标注数量(xml文件个数):857 标注类别数:2 标注类别名称:["luotu","n…

【小沐学Unity3d】3ds Max 骨骼动画制作(CAT、Character Studio、Biped、骨骼对象)

文章目录 1、简介2、 CAT2.1 加载 CATRig 预设库2.2 从头开始创建 CATRig 3、character studio3.1 基本描述3.2 Biped3.3 Physique 4、骨骼系统4.1 创建方法4.2 简单示例 结语 1、简介 官网地址: https://help.autodesk.com/view/3DSMAX/2018/CHS https://help.aut…

2021年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:双端队列 定义一个双端队列,进队操作与普通队列一样,从队尾进入。出队操作既可以从队头,也可以从队尾。编程实现这个数据结构。 时间限制:1000 内存限制:65535 输入 第一行输入一个整数t,代表测试数据的组数。 每组数据的第一…

【广州华锐互动】煤矿设备AR远程巡检系统实现对井下作业的远程监控和管理

煤矿井下作业环境复杂,安全隐患较多。传统的巡检方式存在诸多弊端,如巡检人员难以全面了解井下情况,巡检效率低下,安全隐患难以及时发现和整改等。为了解决这些问题,提高煤矿安全生产水平,越来越多的企业开…

DAY01_瑞吉外卖——软件开发整体介绍瑞吉外卖项目介绍开发环境搭建后台系统登录功能后台系统退出功能

目录 1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 瑞吉外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型2.4 功能架构2.5 角色 3. 开发环境搭建3.1 数据库环境搭建3.1.1 创建数据库3.1.2 数据库表导入3.1.3 数据库表介绍 3.2 Maven项目搭建3.2.1 创建ma…

Elsaticsearch倒排索引

搜索引擎应该具有什么要求? 查询快 高效的压缩算法 快速的编码和解码速度 结果准确 BM25 TF-IDF 检索结果丰富 召回率 面向海量数据,如何达到搜索引擎级别的查询效率? 索引 帮助快速检索以数据结构为载体以文件形式落地 倒排…

Ubuntu18.04安装docker-io

1. 安装docker 1.1 网上一搜,全是更新仓库、下载依赖、添加docker的gpg密钥、添加docker仓库、安装docker-ce的步骤,但是在安装docker-ce时却提示“package "docker-ce" has no installation candidate”,就很迷。 1.2 安装docke…

webpack打包常用配置项

webpack打包配置项 参考链接 文件结构:最基础版 先安装 npm i webpack webpack-cli --dev 运行命令:npx webpack 进行打包 1. 配置webpack.config.js文件: const path require(path); module.exports {mode: development, // 开发环境 …

Python 实现单例模式的五种写法!

单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的…