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控制器的性能限制:

  1. SPI的最大时钟频率(短板理论)
  2. CPU处理SPI数据的能力
  3. 输出端驱动能力(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 :

SPI 协议学习的更多相关文章

  1. SPI协议及IO模拟

    SPI协议 SPI协议网上资料比较多,但是也比较乱,当初在网上搜集的错误资料导致现在比较混乱. SPI协议资料比较正规的是: 1.SPI的规约协议英文文档,例如<摩托罗拉spi协议规范> ...

  2. TCP/IP协议学习(五) 基于C# Socket的C/S模型

    TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...

  3. FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]

    一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...

  4. [SPI]SPI协议详解

    转自:https://my.oschina.net/freeblues/blog/67400 1.SPI协议简介 1.1.SPI协议概括 SPI,是英语Serial Peripheral interf ...

  5. [SPI&I2C]I2C和SPI协议介绍

    IIC vs SPI 现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身 ...

  6. SPI协议及工作原理分析

    说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...

  7. http协议学习系列

    深入理解HTTP协议(转)  http://www.blogjava.net/zjusuyong/articles/304788.html http协议学习系列   1. 基础概念篇 1.1 介绍 H ...

  8. SPI协议及其工作原理详解

    一.概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控 ...

  9. SPI协议及其工作原理浅析

    转载自:http://bbs.chinaunix.net/thread-1916003-1-1.html一.概述. SPI, Serial Perripheral Interface, 串行外围设备接 ...

  10. BGP协议学习总结

    BGP学习总结 BGP是目前使用的唯一的自治系统间的路由协议,它是一种矢量路由协议,基于TCP的179号端口,它采用单播增量更新的方式更新路由,与其他的路由协议不同的是,BGP只要TCP可达,就可以建 ...

随机推荐

  1. 设置Mysql数据库允许远程连接

    Mysql数据库用户权限设置 1.进入容器 docker exec -it mysql_test /bin/bash 注意:由于我是通过docker安装的数据库,所以在操作之前需要进入容器,直接安装在 ...

  2. 【GUI软件】抖音搜索结果批量采集,支持多个关键词、排序方式、发布时间筛选等!

    目录 一.背景介绍 1.1 爬取目标 1.2 演示视频 1.3 软件说明 二.代码讲解 2.1 爬虫采集模块 2.2 软件界面模块 2.3 日志模块 三.获取源码及软件 一.背景介绍 1.1 爬取目标 ...

  3. 26ObjectStream

    ObjectStream ObjectOutputStream 用于将属性和内容保存到文件中,保存数据类型和值,即序列化,该流为处理流 static和transient修饰的属性无法序列化,切被序列化 ...

  4. 【OpenVINO™】在 C# 中使用OpenVINO™ 部署PP-YOLOE实现物体检测

     前言 OpenVINO C# API 是一个 OpenVINO 的 .Net wrapper,应用最新的 OpenVINO 库开发,通过 OpenVINO C API 实现 .Net 对 OpenV ...

  5. Vue3学习(二十四)- 文档页面功能开发

    写在前面 这部分真的感觉超级难,其实也不能说难,主要是真的想不到这个思路应该这么做,或者说他好厉害,他怎么知道该这么设计实现. 说下难点吧,我觉得后天逻辑还好,主要是前端部分真的需要点花点时间来思考, ...

  6. quartzui 的界面管理

    基于Quartz.NET3.0的定时任务Web可视化管理.docker打包开箱即用.内置SQLite持久化.语言无关.业务代码零污染.支持 RESTful风格接口.傻瓜式配置 quartzuiquar ...

  7. 解读注意力机制原理,教你使用Python实现深度学习模型

    本文分享自华为云社区<使用Python实现深度学习模型:注意力机制(Attention)>,作者:Echo_Wish. 在深度学习的世界里,注意力机制(Attention Mechanis ...

  8. STM32 USB CDC调试记录

    STM32 USB CDC调试 一.前言 最近在做STM32的IAP方案,官方提供的demo是基于USART实现,但是使用USART的话要和电脑通信要么借助USB转TTL工具:要么在板子上加一颗CH3 ...

  9. pandas基础--基本功能

    pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas as pd,另外import numpy ...

  10. Android Media Framework(三)OpenMAX API阅读与分析

    这篇文章我们将聚焦Control API的功能与用法,为实现OMX Core.Component打下坚实的基础. 1.OMX_Core.h OMX Core在OpenMAX IL架构中的位置位于IL ...