SPI 协议学习
SPI 协议学习
背景
2年之前学过SPI,但是因为现在太久没用、基础知识不牢靠(对自己的面试表现不满意);所以重新整理了一遍。
SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。
介绍
SPI是串行外设接口(Serial Peripheral Interface)的缩写;是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。
作为嵌入式工程师的老朋友,SPI与I2C一样,都可以用在对各类芯片通信上(实现对芯片的配置)。
一些比较好的配置芯片运行同时支持I2C、SPI或者其他总线协议。
通常,SPI是一种4线制的全双工总线协议;它们分别是:
- SDI(数据输入):(主)设备数据输入;因为这里的 输入指的是主机的输入,那么对于对端来说,就是从机输出;所以通常被称为MISO。
- SDO(数据输出):主设备数据输出,从设备数据输入,即MOSI。
- SCLK(时钟):时钟信号,由主设备产生。通信时一直变化,没有通信时保持固定电平。
- CS(片选):从设备使能信号,由主设备控制。一般每一个从设备的CS都不一样。
如果只需要单向接收,那么可以省去一个IO。
结合框图理解一下:
当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。
SPI 通信速度
SPI 通信速率:一般情况下,SPI模块的最大时钟频率为系统时钟频率的1/2。
不比I2C,SPI的通信速率主要看主从器件SPI控制器的性能限制:
- SPI的最大时钟频率(短板理论)
- CPU处理SPI数据的能力
- 输出端驱动能力(PCB所允许的最大信号传输速率)
SPI的最大时钟频率
一般情况下,SPI模块的最大时钟频率为系统时钟频率的1/2。虽然SPI的传输速率主要受限于CPU处理SPI数据的能力,但在同另一个非高速率的SPI设备通讯时,其SPI的最大时钟频率将有可能制约其传输速率。
短板效应:盛水的木桶是由许多块木板箍成的,盛水量也是由这些木板共同决定的。若其中一块木板很短,则盛水量就被短板所限制。这块短板就成了木桶盛水量的“限制因素”(或称“短板效应”)。
CPU处理SPI数据的能力
通常情况下,考虑到系统中CPU有可能需要处理其他任务,以及对所接收SPI数据的具体运算处理方法,CPU处理SPI数据的能力将影响到整体的传输速率。
例如,系统在收到SPI数据后只是作简单的累加。如果当前SPI模块的时钟频率是1/2系统时钟频率,接收每一个SPI byte将需要16个系统时钟周期。那么在下一笔SPI数据接收到之前CPU有足够的时间来处理当前数据,此时SPI的最大传输速率即为系统时钟的1/2。
接下来考虑另外一种情形,假设CPU有50%的时间用于处理其他任务,同时对所接收到的每byte SPI数据,需要100个系统时钟周期来作运算处理。每接收1 byte SPI数据,CPU需要100个时钟周期来作处理,同时需要100个时钟周期来处理其他任务,因此总共需要消耗200个系统时钟周期。用公式表达如下:
200 *Tsysclk = 8 * Tspiclk;
spiclk = sysclk/25;
因此,在这个例子中,我们可以看出SPI的最大传输速率由CPU处理SPI数据的能力所决定。
输出端驱动能力
最后要考虑的因素是输出节点的驱动力。PCB上的微量电容和器件引脚的输出阻抗相结合,将会形成一个低通滤波器,限制设备间信号的传输速度。通常该滤波器的截止频率可以近似为:
Fmax = 1 /(2 × π × Rdrive * Ctrace)
其中Rdrive是所驱动的最大阻抗值,Ctrace表示输出节点所驱动的所有微量电容的总和。
在固定阻抗条件下,电路的微量电容将成为制约SPI传输速率的因素。系统中如果设备间的距离非常短(Ctrace较小值),那么CPU的处理能力或SPI的时钟频率将是主要限制因素。如果系统中总线上有多个SPI设备,同时设备间的连线很长(Ctrace较大值),那么输出驱动能力将制约SPI的传输速率。
SPI模式
在SPI协议中,使用SPI通信时,需要注意两个概念,这两个概念共同决定了SPI通信的属性。
时钟极性CPOL,规定了时钟的有效电平(高或低):配置SCLK的电平处于哪种状态时是空闲态或者有效态:
- 若CPOL = 1,串行同步时钟的空闲状态为高电平(常高电平时不工作);
- 若CPOL = 0,串行同步时钟的空闲状态为低电平(常低电平时不工作);
时钟相位CPHA ,规定了数据的采样时刻(奇或偶):是用来配置数据采样是 在串行同步时钟的 奇或偶 个 跳变沿(上升或下降)数据将被采样:
- 若CPHA = 0,在串行同步时钟SCLK的第一个跳变沿(上升或下降)数据将被采样;
- 若CPHA = 1,在串行同步时钟SCLK的第二个跳变沿(上升或下降)数据将被采样;
- 时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样
根据CPOL(时钟极性)和CPHA(时钟相位)的不同,市面上的总线协议共有4种模式:
- Mode0:CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样(读取)是在上升沿,数据发送是在下降沿。
- Mode1:CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样(读取)是在下降沿,数据发送是在上升沿。
- Mode2:CPOL=1,CPHA=0 :此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集(读取)是在下降沿,数据发送是在上升沿。
- Mode3:CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集(读取)是在上升沿,数据发送是在下降沿。
不同的从设备的SPI模式一般是不能改变的;而为了达到通信的目的,双方的SPI模式必须匹配;因此,有时候需要修改主机的通信模式。
SPI 通信过程
SPI以主从方式工作:主机主动发起通信,按MSB或LSB的顺序一位一位传输数据;从机被动接收、处理主机发送的数据。
不光是数据,甚至,时钟、片选使能信号也是主机提供的。
SPI能够实现发送时按位接收从设备的数据。
下面以CPHA=0为例讲解SPI时序。
发起通信
主设备拉起片选NSS(N代表低电平有效),选中对应的从设备。
同时,主设备开始驱动CLK时钟产生信号。
假设下面的8位寄存器装的是待发送的数据1010 1010(0XAA),上升沿发送、下降沿接收、高位先发送(MSB)。
发送后,从机对应的寄存器的buff存放了0101 0101(0X55)。
那么第一个上升沿来的时候 数据将会是SDO=1;寄存器=0101010x(X代表不确定,因为没有从从设备读回数据)。下降沿到来的时候,将SDI上的电平保存为二进制值,那么这时寄存器=0101 010 BIT[SDI] ;SCLK时钟再接下来的7个脉冲以后,主从中的两个寄存器的内容便互相交换一次。这样就完成里一个SPI时序。
举例:
假设主机和从机初始化就绪:并且主机的sbuff=0xaa(1010 1010),从机的sbuff=0x55(0101 0101),下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据
加粗的地方代表需要重点留意;高量的地方代表已经储存的值。
SCLK脉冲 | 主机buff | 从机buff | MISO(sdi) | MOSI(sdo) |
---|---|---|---|---|
低电平 | 1010 1010 | 0101 0101 | X | X |
第1个 | 0101 010X | 1010101X | X | 1 |
第1个 | 0101 010 0 | 10101011 | 0 | X |
第2个 | 1010 100X | 0101 011X | X | 0 |
第2个 | 1010 1001 | 0101 0110 | 1 | X |
第3个 | 0101 001X | 1010 110X | X | 1 |
第3个 | 0101 0010 | 1010 1101 | 0 | X |
第4个 | 1010 010X | 0101 101X | X | 0 |
第4个 | 1010 0101 | 0101 1010 | 1 | X |
第5个 | 010 0101X | 1011 010X | X | 1 |
第5个 | 0100 1010 | 1011 0101 | 0 | X |
第6个 | 1001 010X | 0110 101X | X | 0 |
第6个 | 1001 0101 | 0110 1010 | 1 | X |
第7个 | 0010 101X | 110 1010X | X | 1 |
第7个 | 0010 1010 | 1101 0101 | 0 | X |
第8个 | 010 1010X | 1010 101X | X | 0 |
第8个 | 0101 0101 | 1010 101X | 1 | X |
这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。
根据以上分析,一个完整的传送周期是16位,即两个字节:因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。
附录:SPI模式有关理解框图
附录:SPI 内部机制
SSPSR: SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以及 Channel-Width 所决定。
ref :
- https://www.cnblogs.com/deng-tao/p/6004280.html
- https://blog.csdn.net/wordwarwordwar/article/details/79776140
- https://blog.csdn.net/weiqifa0/article/details/82765892
SPI 协议学习的更多相关文章
- SPI协议及IO模拟
SPI协议 SPI协议网上资料比较多,但是也比较乱,当初在网上搜集的错误资料导致现在比较混乱. SPI协议资料比较正规的是: 1.SPI的规约协议英文文档,例如<摩托罗拉spi协议规范> ...
- TCP/IP协议学习(五) 基于C# Socket的C/S模型
TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]
一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...
- [SPI]SPI协议详解
转自:https://my.oschina.net/freeblues/blog/67400 1.SPI协议简介 1.1.SPI协议概括 SPI,是英语Serial Peripheral interf ...
- [SPI&I2C]I2C和SPI协议介绍
IIC vs SPI 现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身 ...
- SPI协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...
- http协议学习系列
深入理解HTTP协议(转) http://www.blogjava.net/zjusuyong/articles/304788.html http协议学习系列 1. 基础概念篇 1.1 介绍 H ...
- SPI协议及其工作原理详解
一.概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控 ...
- SPI协议及其工作原理浅析
转载自:http://bbs.chinaunix.net/thread-1916003-1-1.html一.概述. SPI, Serial Perripheral Interface, 串行外围设备接 ...
- BGP协议学习总结
BGP学习总结 BGP是目前使用的唯一的自治系统间的路由协议,它是一种矢量路由协议,基于TCP的179号端口,它采用单播增量更新的方式更新路由,与其他的路由协议不同的是,BGP只要TCP可达,就可以建 ...
随机推荐
- C++ lambda的重载
先说结论,lambda是不能重载的(至少到c++23依旧如此,以后会怎么样没人知道).而且即使代码完全一样的两个lambda也会有完全不同的类型. 但虽然不能直接实现lambda重载,我们有办法去模拟 ...
- 解决:Failed to get D-Bus connection: Operation not permitted
docker中安装完httpd服务后,使用命令systemctl start httpd.service,发现报错,错误信息:Failed to get D-Bus connection: Opera ...
- 适合IT团队的在线文档私人分享工具——showdoc部署
转载文章: https://www.lixian.fun/3617.html
- jpype-python调用java的方法
环境准备: 部署环境准备: sed -i.ori '$a export JAVA_HOME=/opt/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bi ...
- PHP常用排序算法01——冒泡、插入
对于排序算法,相信学计算机的同学都不会陌生.今天我们就来复习下常见的两个排序,适合小规模数据的排序算法:冒泡(bubbleSort)和插入(insertionSort). PS:对排序等算法还不太了解 ...
- Java中获取类声明泛型的Class对象(WEB开发Dao层的抽取)
在WEB开发中,用到三层架构中经常会遇到代码抽取的情况,例如在dao层中,我们需要对数据库的基本操作进行抽取例如这样,在抽取之前我们需要定义抽取类的接口: public interface BaseD ...
- Vue 组件生命周期:探索钩子
title: Vue 组件生命周期:探索钩子 date: 2024/5/27 18:42:38 updated: 2024/5/27 18:42:38 categories: 前端开发 tags: 生 ...
- itest(爱测试) 开源接口测试,敏捷测试管理平台10.0.1
一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ...
- k8s——api
api概述 api是k8s系统的重要部分,组件之间的所有操作和通信均由apiserver处理的rest api调用,大多数情况下,api定义和实现都符合标准的http rest格式,可以通过kubct ...
- rhcsa练习题容易错的地方
rhcsa练习题容易错的地方 yum仓库的配置 注意 配置yum仓库的时候,baseurl的路径不要写错 dnf clean all && dnf makecache //检查错误 s ...