1. SPI物理层

SPI通讯需要使用4条线:3条总线和1条片选

SPI遵循主从模式,3条总线分别是SCK、MOSI和MISO,片选线为nSS(低电平有效),SPI协议适用于一主多从的工作场景:

(1) nSS(Slave Select):片选信号线,用于选中SPI从设备。每个从设备独立拥有这条nSS信号线,占据主机的一个引脚。设备的其他总线是并联到SPI主机的,即无论多少个从设备,都共同使用这3条总线。当从设备上的nSS引脚被置拉低时表明该从设备被主机选中。

(2) SCK(Serial Clock):时钟信号线,通讯数据同步用。时钟信号由通讯主机产生,它决定了SPI的通讯速率。我们的主设备能够控制时钟,因为我们的SPI通信并不像UART或者IIC通信那样有专门的通信周期,有专门的通信起始信号,有专门的通信结束信号;所以我们的SPI协议能够通过控制时钟信号线,当没有数据交流的时候我们的时钟线要么是保持高电平要么是保持低电平。

(3) MOSI(Master Ouput Slave Input):主机(数据)输出/从设备(数据)输入引脚,即这条信号线上传输从主机到从机的数据。

(4) MISO(Master Input Slave Ouput):主机(数据)输入/从设备(数据)输出引脚,即这条信号线上传输从机从到主机的数据主从机通过两条信号线来传输数据,那么自然是全双工通讯的了。之前的I2C通讯,数据只在一条SDA线上传输,主从机数据交互只能采用半双工。

SPI是[单主设备( single-master )]通信协议,这意味着总线中的只有一支中心设备能发起通信。当SPI主设备想读/写[从设备]时,它首先拉低[从设备]对应的nSS线(nSS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,[主设备]把信号发到MOSI实现"写",同时可对MISO采样而实现"读"。

 

2. SPI协议层

如上为SPI通讯时序图,nSS、SCK、MOSI信号均由主机产生,MISO信号由从机产生。在nSS为低电平的前提下,MOSI和MISO信号才有效,在每个时钟周期MOSI和MISO传输一位数据。跟I2C通讯类似,SPI通讯也需要通讯的起始/结束信号,有效数据和同步时钟。

 

2.1 通讯的起始/结束信号

图中的nSS信号由高电平变为低电平即为SPI通讯的起始信号,反过来,nSS信号由低电平变为高电平即为SPI通讯的结束信号。这个可比I2C简单得多吧。当从机检测到自身的nSS引脚被拉低时就知道自己被主机选中,准备和主机进行通讯。

 

2.2 有效数据的采集

SPI通讯的数据采集是个相对复杂的环节,先不说其他,以上图为例:

a、图中红色框框即为有效数据被采集的时间点,"CPOL = 0"所在的脉冲信号表示的是用于进行数据同步的SCK,MOSI和MISO线上的数据在每个SCK时钟周期传输一位数据,注意,数据的输入/输出是可以同时进行的。

b、由图可见,在SCK为奇数边沿(在这里该边沿为下降沿)时,数据得到有效采样,也就是说,在这个时刻,MISO和MOSI的数据有效,高电平表示数据1,低电平表示数据0,在其它时刻数据并无效,可以理解为为下一次MISO和MOSI的数据传输做准备。

c、数据在传输中,高位在先还是低位在先,SPI协议并无明确规定,但是数据要在主从机中正确传输,自然双方要先约定好,一般会采用高位在先(MSB)方式传输。

d、这里需要再提及的概念是时钟极性(CPOL)和时钟相位(CPHA)。

时钟极性(CPOL)指通讯设备处于空闲状态(SPI开始通讯前、nSS线无效)时,SCK的状态。

CPOL = 0:SCK在空闲时为低电平

CPOL = 1:SCK在空闲时为高电平

时钟相位(CPHA)指数据的采样时刻位于SCK的偶数边沿采样还是奇数边沿采样。

CPHA = 0:在SCK的奇数边沿采样

CPHA = 1:在SCK的偶数边沿采样

 

那么这样说来,SPI的采样时刻并非由上升沿/下降沿决定的。注意的是,在数据采样时刻,MOSI和MOSI的电平为有效电平,数据不能在这个时刻进行切换。在非采样时刻MOSI和MISO上的信号才能切换。

完整的时序图如下:

 

所以说,SPI有4中工作模式:

它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。每种模式由一对参数刻画,它们称为时钟极(clock polarity)CPOL与时钟期(clock phase)CPHA。

 

[主从设备]必须使用相同的工作参数——SCLK、CPOL 和 CPHA,才能正常工作。如果有多个[从设备],并且它们使用了不同的工作参数,那么[主设备]必须在读写不同[从设备]间重新配置这些参数。但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,从设备SDI接收的数据是主设备的SDO发送过来的,主设备SDI接收的数据是从设备SDO发送过来的,所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,跟从设备SDO发送数据的极性是相同的。

下面这段话是Sychip Wlan8100 Module Spec上说的,充分说明了时钟极性是如何配置的:

The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock.

意思是:主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。因此主设备这边SPI时钟极性应该配置为下降沿有效。

又如,下面这段话是摘自LCD Driver IC SSD1289:

SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.

意思是:从设备SSD1289在时钟的上升沿接收数据,而且是按照从高位到地位的顺序接收数据的。因此主设备的SPI时钟极性同样应该配置为下降沿有效。

时钟极性和相位配置正确后,数据才能够被准确的发送和接收, 因此应该对照从设备的SPI接口时序或者Spec文档说明来正确配置主设备的时钟。

 

SPI不规定最大传输速率,没有地址方案;SPI也没规定通信应答机制,没有规定流控制规则。事实上,SPI[主设备]甚至并不知道指定的[从设备]是否存在。这些通信控制都得通过SPI协议以外自行实现。

SPI协议解析的更多相关文章

  1. 调试备忘录-SWD协议解析

    目录--点击可快速直达 目录 写在前面 1  SWD协议简介 2  SWD物理层协议解析 2.1  SWD通信时序分析 2.2  SWD 寄存器简介 2.2.1  DP寄存器 2.2.2  AP寄存器 ...

  2. SPI协议及IO模拟

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

  3. ts 协议解析

    pes : http://wenku.baidu.com/link?url=KjcA0qXqZ1bWVQTa8i1YOmygofldSQL7Pjj-zGRw1e_6_LFmVLo5DIWF0SNwVn ...

  4. [转]netty对http协议解析原理

    本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...

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

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

  6. [SPI]SPI协议详解

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

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

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

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

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

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

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

随机推荐

  1. 【转载】Cmd Markdown 公式指导手册

    目录 Cmd Markdown 公式指导手册 一.公式使用参考 1.如何插入公式 2.如何输入上下标 3.如何输入括号和分隔符 4.如何输入分数 5.如何输入开方 6.如何输入省略号 7.如何输入矢量 ...

  2. js获取一个页面 是从哪个页面过来的

    document.referrer 获取来源页面的url console.log(document.referrer) if(document.referrer=="http://127.0 ...

  3. Centos7 更新配置为阿里源步骤

    一.yum更换配置源过程 1.备份原有的.repo源文件 首先需要将之前的源进行备份(一般重要的配置文件都需要有备份的意识) # 进入源配置目录 cd /etc/yum.repos.d # 创建备份文 ...

  4. iOS性能优化-内存优化

    https://blog.csdn.net/a184251289/article/details/82589128 2018年09月10日 14:25:31 xingshao1990 阅读数:328 ...

  5. Navicat相关注册码

    用户名和组织随便起. 注册码如下 --Navicat for SQL Server V10.0.10 NAVD-3CG2-6KRN-IEPM NAVL-NIGY-6MYY-XWQE NAVI-C3UU ...

  6. 对C/C++指针问题的彻底理解(复习1)

    理解第一篇 上完大学不是我吹(仅仅说我认识的本学校本专业)估计很明白指针的人绝对不超过百分之50,学校low不low另说(因为问他们讲得断断续续的自己也说不明白,只知道那样可以用) 学链表树形结构.. ...

  7. /dev设备文件命名或符号链接建立

    udev是一个用户空间服务,负责监听内核设备变动事件,从/sysfs---中读取发生变动的设备属性信息,遍历 命名规则文件,进行属性规则的匹配,如果匹配,就进行执行命名自定义动作 udev 的规则和规 ...

  8. IDEA 服务器热部署详解(On Update action/On frame deactivation)

    https://blog.csdn.net/w15321271041/article/details/80597962 场景:一般服务器(比如tomcat,jboss等)启动以后,我们还需要进一步修改 ...

  9. springcloud gateway 项目打包部署运行

    新建一个springboot项目然后做了一个小demo跳转到baidu pom <?xml version="1.0" encoding="UTF-8"? ...

  10. webpack 4 脚手架搭建

    1.在cmd控制台安装环境  npm install express (这是一个本地服务器配置) 2.在src 文件夹下建 mian.js 和 express.js 两个jS文件