SPI协议详解

SPI协议详解

文章目录

  • SPI协议详解
  • 前言
  • 一、SPI是什么?
  • 二、通信原理
    • SPI 通信的 4 种工作模式
  • 总结


前言

好久没写这种协议了,最近正好需要用到,便详细的复习一下。

一、SPI是什么?

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚至超过10M/bps。

SPI有主、从两种模式,通常由一个主模块和一个或多个从模块组成(SPI不支持多主机但是支持多从机),主模块选择一个从模块进行同步通信,从而完成数据的交换。提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写操作,都是由主设备发起,当存在多个从设备时,通过各自的片选信号进行管理。

SPI通信原理很简单,需要至少4根线,单向传输时3根线,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)和CS/SS(片选):

MISO( Master Input Slave Output):主设备数据输入,从设备数据输出;
MOSI(Master Output Slave Input):主设备数据输出,从设备数据输入;
SCLK(Serial Clock):时钟信号,由主设备产生;
CS/SS(Chip Select/Slave Select):从设备使能信号,由主设备控制,一主多从时,CS/SS是从芯片是否被主芯片选中的控制信号,只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。
 吧。0
在这里插入图片描述
大多数从机设备都有着三态逻辑的特性,因此当设备未被选中时,它们的 MISO 信号线会变成高阻抗状态(电气断开)。没有三态输出的设备则需外接三态缓冲器才能与其他的从机设备共享 SPI 总线。

二、通信原理

SPI主设备和从设备都有一个串行移位寄存器,主设备通过向它的SPI串行寄存器写入一个字节来发起一次传输。
在这里插入图片描述
在这里插入图片描述

SPI数据通信的流程可以分为以下几步:

1、主设备发起信号,将CS/SS拉低,启动通信。

2、主设备通过发送时钟信号,来告诉从设备进行写数据或者读数据操作(采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低),因为SPI有四种模式,后面会讲到),它将立即读取数据线上的信号,这样就得到了一位数据(1bit)。

3、主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(缓存长度不一定,看单片机配置),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。

4、从机(Slave)也将自己的串行移位寄存器(缓存长度不一定,看单片机配置)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
例如,下图示例中简单模拟SPI通信流程,主机拉低NSS片选信号,启动通信,并且产生时钟信号,上升沿触发边沿信号,主机在MOSI线路一位一位发送数据0X53,在MISO线路一位一位接收数据0X46,如下图所示:
在这里插入图片描述
SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。若只进行写操作,主机只需忽略接收到的字节(虚拟数据);反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

SPI 通信的 4 种工作模式

SPI 通信中有 4 种不同的操作模式,不同的从机设备可能在出厂时就被设置好了某种模式,并且无法更改。但是 SPI 通信必须处于同一种模式下才能进行。因此我们应该对自己手里的 SPI 主机设备进行模式的配置,也就是通过 CPOL(时钟极性) 和 CPHA(时钟相位) 来控制 SPI 主设备的通信模式,具体如下:

时钟极性(CPOL) 定义了 SCLK 时钟线空闲状态时的电平:

1.CPOL=0,即SCLK=0,表示 SCLK 时钟信号线在空闲状态时的电平为低电平,因此有效状态为高电平。

2.CPOL=1,即SCLK=1,表示 SCLK 时钟信号线在空闲状态时的电平为高电平,因此有效状态为低电平。

时钟相位(CPHA) 定义了数据位相对于时钟线的时序(即相位):

1.CPHA=0,即表示输出 (out) 端在上一个时钟周期的后沿改变数据,而输入 (in) 端在时钟周期的前沿(或不久之后)捕获数据。输出端保持数据有效直到当前时钟周期的尾部边缘。对于第一个时钟周期来说,第一位的数据必须在时钟前沿之前出现在 MOSI 线上。也就是一个 CPHA=0 的周期包括半个时钟空闲和半个时钟置位的周期。

2.CPHA=1,即表示输出 (out) 端在当前时钟周期的前沿改变数据,而输入 (in) 端在时钟周期的后沿(或不久之后)捕获数据。输出端保持数据有效直到下一个时钟周期的前沿。对于最后一个时钟周期来说,从机设备在片选信号消失之前保持 MISO 信号线有效。也就是一个 CHPA=1 的周期包括半个时钟置位和半个时钟空闲的周期。
在这里插入图片描述
总结一下
SPI 数据的传输是在串行同步时钟信号(Serial Clock,SCK) 的控制下进行的。主机的时钟发生器一方面控制主机的移位寄存器,另一方面通过从机的 SCK 信号线来控制从机的移位寄存器,从而保证主机与从机的数据交换是同步进行的。

SPI 串行同步时钟可以设置为不同的极性(Clock Polarity,CPOL)与相位(Clock Phase,CPHA)。

时钟的极性(CPOL) 用来决定在总线空闲时,同步时钟(SCK)信号线上的电位是高电平还是低电平。当 时钟极性为 0 时(CPOL=0),SCK 信号线在空闲时为低电平 ; 当时钟极性为 1 时(CPOL=1), SCK 信号线在空闲时为高电平;
时钟的相位(CPHA) 用来决定何时进行信号采样。
当时钟相位为 1 时(CPHA=1), 在 SCK 信号线的第二个跳变沿进行采样; 这里的跳变沿究竟是上升沿还是下降沿?取决于时钟的极性。当时钟极性为 0 时,取下降沿;当时钟极性为 1 时,取上升沿;如下图:
在这里插入图片描述
当时钟相位为 0 时(CPHA=O), 在 SCK 信号线的第一个跳变沿进行采样。 跳变沿同样与时钟极性有关:当时钟极性为 0 时,取上升沿;当时钟极性为 1 时,取下降沿;如下图:
在这里插入图片描述

总结

SPI 的优点在于它有着比 I2C 更高的吞吐量,不被最大时钟速度所限制,可实现潜在的高速、极为简单的硬件接口,外围电路使用的上拉电阻是比 I2C 协议更少的,这意味着它比 I2C 的功耗更低、从机的时钟来源来自主机设备,无需新增精密振荡器、从机不需要唯一的地址、相对于并行接口而言,使用的引脚数目大大减少等优点。但同时有着一定的缺点,例如SPI 没有带内寻址、当使用多个不同模式的从机设备时,主机设备切换模式时重新初始化,会使得访问从机设备速度变慢、SPI 从机设备没有硬件流控,只能通过主机自主地延迟下个时钟周期到来的时间、仅能在短距离通信等缺点。但能在避免 SPI 的缺点的方向来应用 SPI 的话,SPI 的优点让它远远优于其他协议。

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

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

相关文章

通过Workstation工具制作CentOS8虚拟机模板

通过Workstation工具制作CentOS8虚拟机模板 1. 需求说明2. 安装模板虚拟机3. 配置模板虚拟机 1. 需求说明 说明:在做集群实验过程中,需要创建多台虚拟机,如果逐台安装虚拟机,很消耗时间,所以最简洁的办法就是通过模板克…

数据结构 | 栈的实现

数据结构 | 栈的实现 文章目录 数据结构 | 栈的实现栈的概念及结构栈的实现 Stack.h初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈 Stack.c 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。…

【Python】【应用】Python应用之一行命令搭建http、ftp服务器

🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:Python应用&…

Pytorch教程(代码逐行解释)

0、配准环境教程 1、开始导入相应的包 import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensortorch是pytorch的简写 torch.utils.data import DataLoader 是用于读取数…

数据结构:反射

基本概念 反射中的四个类 Class类 Java文件在被编译之后,生成了.class文件,JVM此时解读.class文件,将其解析为java.lang.Class 对象,在程序运行时每个java文件就最终变成了Class类对象的一个实例。通过反射机制应用这个 实例就…

C# 异步日志记录类,方便下次使用,不用重复造轮子

先定义接口类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 异常 {internal interface ILog{Task WriteErrorLog(string message);Task WriteInfoLog(string message);Task W…

MySQL索引下推:提升数据库性能的关键优化技术

文章目录 前言索引下推原理MySQL 基础架构传统查询过程ICP 查询过程 使用场景限制参数配置索引下推开启状态查询索引下推开启和关闭 一些问题只有联合索引才能使用索引下推?下面的查询为什么不走索引下推 参考 前言 大家好,我是 Lorin ,今天…

C语言从文件 D://test.txt 读取字符串,将字符串中所有的大写字符改为小写字母并写回到源文件中

完整代码&#xff1a; /*从文件 D://test.txt 读取字符串&#xff0c;将字符串中所有的大写字母改为小写字母并写回 到源文件中*/ #include<stdio.h>//将字符串中所有的大写字母改为小写字母 void func(char *buff){while (*buff!\0){if (*buff>A&&*buff<…

java基础-数据类型

1、变量 变量就是申请内存来存储值。也就是说&#xff0c;当创建变量的时候&#xff0c;需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间&#xff0c;分配的空间只能用来储存该类型数据。 因此&#xff0c;通过定义不同类型的变量&#xff0c;可以在内…

【C#学习】button:只显示图片

第一步&#xff1a;设置按钮背景图片&#xff0c;并且图片随按钮大小变化 第二步&#xff1a;设置按钮使之只显示图片 button1.FlatStyle FlatStyle.Flat;//stylebutton1.ForeColor Color.Transparent;//前景button1.BackColor Color.Transparent;//去背景button1.FlatAppe…

破解tomcat密码并上传webshell

tomcat基础认证爆破 暴力破解 进入vulnhub的tomcat8目录&#xff0c;启动环境 由于tomcat密码默认最大尝试错误次数为5次&#xff0c;需要修改server.xml&#xff0c;修改下面字段 failureCount"10000000000" lockOutTime"0"tomcat默认界面&#xff0c;…

MATLAB仿真通信系统的眼图

eyediagram eyediagram(complex(used_i,used_q),1100)