文档章节

SPI接口扫盲(转自网络)

a
 afbojd
发布于 2016/12/05 13:36
字数 3014
阅读 123
收藏 0
点赞 0
评论 0

SPI接口扫盲

 

douqingl@gmail.com

 

为何要写这篇文档?
百度上找出来的SPI接口中文描述都说的太过简略,没有一篇文档能够详尽的将SPI介绍清楚的。wikipedia英文版[注释1]中,SPI接口介绍的很好,但是毕竟是英文版,读起来终究不如母语舒服,所以我结合自己的工作经验,对其进行了汉化、整理。

个人SPI接口相关经验:

1. 参与过国产某芯片SPI接口样品验证、SPI接口服务DEMO开发(C语言)。

2. 使用国产某芯片GPIO接口模拟SPI接口(C语言)。

3. 使用STM32芯片的SPI MASTER/SLAVE(C语言)。

 

SPI接口是什么?

SPI ( Serial Peripheral Interface,串行外设接口)是一种同步、串行通讯接口规格,常用于短距离通讯,主要是在嵌入式系统中。此接口由Mototola公司推出,已成为一种事实标准(没有统一的协议规范,但是基于其广泛的使用,根据实际使用中大家通用的习惯形成了一个类似行规的标准)。

SPI典型的应用场景包括SD卡(SD接口中包含SPI接口)和液晶显示。

SPI是一种高速的,全双工,同步的通信总线。分为主(master)、从(slave)两种模式,一个SPI通讯系统需要包含一个(且只能是一个)maser(主设备),一个或多个slave(从设备)。

SPI接口的读写操作,都是由master发起。当存在多个从设备时,通过各自的片选(slave select)信号进行管理。

硬件开发人员设计、提供的SPI接口,其实只是一个数据读写通道 ,具体读写数据所代表的意义需要在应用中定义。不像SD接口那样,对于命令有着明确详细的定义。

 

SPI接口都包含哪些IO线?

除了供电、接地两个模拟连接以外,SPI总线定义四组数字信号:

    - 接口时钟SCLK(Serial Clock,也叫SCK、CLK),master输出至slave的通讯时钟。

    - MOSI( Master Output Slave Input,也叫SIMO、MTSR、DI、DIN、SI)自master输出至slave的数据线。

    - MISO (Master Input Slave Output,也叫SOMI、MRST、DO、DOUT、SO)自slave输出至master的数据线。

    - SS(Slave select,也叫nSS、CS、CSB、CSN、EN、nSS、STE、SYNC)master对slave的片选信号,自master输出至slave,低有效。

注释:

    - 两条数据线与SCLK的时序关系详见下文。

    - SPI接口的片选信号一般都是低有效的,尽管有的地方命名为SS/CS而有的地方命名为nSS/nCS。(当然了,对于一个合格的硬件开发者,低电平有效的信号都应该在命名时加上个_n)

 

SPI接口如何连接?

在master/slave上,都能找到SCLK/MISO/MOSI/SS四个接口。

当只有一个maser、一个slave时,将master与slave上名字相同的4对接口两两互联,即可完成了接口的互联。如下图所示:

注释:

    - 某些芯片产品上,对SPI两条数据线的命名为SDO/SDI。此时需要将master的SDO连接到slave的SDI,将master的SDI连接到slave的SDO。

    - 当系统中只有一个SLAVE时,且SLAVE的SS是低电平有效时,Slave的SS接口直接接地也不影响通讯。当然了,实际应用中,如果要考虑到功耗等因素,处理起来或许就不那么简单了,具体问题具体分析。

    - 有的芯片SPI接口的SS信号,对电平敏感,通讯前确保SS是低电平就好;而有的SPI芯片的SS信号是下降沿敏感的。比如Maxim MAX1242 ADC,开始通讯前,需要SS信号有一个高→低的翻转。 

    - 多数SLAVE的MISO接口有三态输出(高电平、低电平、高阻),当SS无效时,它们的MISO信号输出高阻态(啥都没接的状态)。若SLAVE的MISO接口不支持高阻输出,则无法应用于多SLAVE的SPI系统。

 

当存在一个master、多个slave时(注意,当master上有n个SS时,对应可以连接n个slave),连接方式如下图所示,注意SCLK/MOSI/MISO三个接口采取复用模式连接,不同SS单独连接对应的slave,SS信号绝不可复用:

SPI接口如何进行数据传输?

SPI接口是一种典型的全双工接口,通过同步时钟SCLK的脉冲将数据一位位地传送。所以在开始通讯前,master首先要配置接口时钟(确定其通讯频率是SLAVE可以支持的,通常为数兆赫兹)。

当MASTER片选一个SLAVE时,每向SLAVE发送一个周期的SCLK信号,都会有1bit的数据从MOSI发送至slave,与此同时,slave每收到一个周期的SCLK信号,都会从MISO向master发送1bit的数据。这种全双工通讯,是由硬件保证的(MASTER与HOST中各有一个移位寄存器作为收发数据的缓存)。

 

SPI是一个很开放的接口,指令解析、帧大小、LSB/MSB(Least Significant Bit/Most Significant Bit)等规则并没有一个完善的定义,不同的SPI设备在这些方面的定义会有不同:

不同于SD等接口的严谨的command定义,SPI接口的master与slave之间的命令、数据解析都可以自定义,只要保证master与slave之间采用相同的规则就好。

不同SPI芯片,每次连续传输的数据量的大小(取决于MASTER、SLAVE中缓存最小的那个)常常不同。当一次连续通讯的的数据量超过帧的大小时,会出现数据丢失的现象。所以,每完成1帧的传输后,MASTER会停止接口时钟输出,master、slave读取、处理收到的数据,然后进行下一帧的传输。

在SPI接口协议中,并没有中断的定义,但是实际应用中,我们可以使用接口中断提高接口通讯速度。比如SLAVE是负责数据数据加解密的,MASTER下发一组明文给SLAVE加密,如果此时有个SLAVE输出到MASTER的中断信号,那么MASTER可以清楚的知道何时SLAVE完成了数据处理并读出处理结果,不必通过查询一遍遍的等待结束。

 

SPI接口的变形

以上我们讲的SPI接口,一个时钟周期可以进行全双工的1bit数据通讯。实际应用中,如果对于全双工的需求不高,而且期望提高通讯速度的话,SPI有两种常见变形可供选用:

一、 两线模式的SPI

CLK与SS信号保持不变,MOSI与MISO则变形为DATA_0与DATA_1。

DATA_0与DATA_1是输入输出状态由MASTER配置的数据管脚:当MASTER打算向SLAVE中写数据时,处于输出状态;当MASTER打算从SLAVE读数据时,处于输入状态。

二、 四线模式的SPI

CLK与SS信号保持不变,MOSI与MISO删除,新增四条数据线DATA0~3。

DATA0_~3是输入输出状态由MASTER配置的数据管脚:当MASTER打算向SLAVE中写数据时,处于输出状态;当MASTER打算从SLAVE读数据时,处于输入状态。

这样一来,大大提高了单方向上数据传输的速度,但是增加了接口资源的开销。

 

 

SPI接口时序配置

此部分参考crifan的博客。

SPI的接口时序配置由两个参数决定:

1、 CPOL,clock polarity,译作时钟极性。

2、 CPHA,clock phase,译作时钟相位。

CPOL具体说明:

CPOL用于定义时钟信号在空闲状态下处于高电平还是低电平,为1代表高电平,0为低电平。

知道这些就好,很简单的一个概念 。如果存在疑问,结合下面的时序图理解就好。

CPHA具体说明:

首先,在同步接口中,肯定存在一个接口时钟,用来同步采样接口上数据的。

CPHA就是用来定义数据采样在第几个边沿的。为1代表第二个边沿采样,为0代表第一个边沿采样。

以上两个参数,总共有四种组合:

MODE 0: CPOL=0, CPHA=0 ,CLK限制状态为低电平,第一个边沿采样,所以是上升沿采样。

MODE 1: CPOL=0, CPHA=1,CLK限制状态为低电平,第二个边沿采样,所以是下降沿采样。

MODE 2: CPOL=1, CPHA=0 ,CLK限制状态为高电平,第一个边沿采样,所以是下降沿采样。

MODE 3: CPOL=1, CPHA=1 ,CLK限制状态为高电平,第二个边沿采样,所以是上升沿采样。

具体见下图。

注意,假设是上升沿采样,那么MISO/MOSI就应该上升沿翻转,这样错开半个时钟周期以保证建立时间保持时间。

忘了这个的建议去翻翻数电。

 

 

由于SPI缺乏一个统一的规范,所以在时序描述上存在一定的差异性。CPOL与CPHA的定义,有些芯片DATASHEET中描述与通用的规则是相反的,所以选型时候一定要以DATASHEET中的时序图为准。

另外,某些芯片上,关于SPI接口时序不使用CPOL/CPHA进行定义,而是使用CKP和CKE进行定义,在此不再详细解释这两个概念的意义(比较绕,这些参数看多了特容易混淆),建议直接参考时序图。

 

关于SPI时序的说明,之前我参考了crifan的博客,其中还有个问题待解决:

对于CPOL和CPHA这四种模式,不同的模式之间,相对来说有何优缺点,比如是否哪种模式更稳定,数据更不容易出错等等,还是不清楚。

我这里给出我的思考结果:

首先是CPOL的选择,我们从芯片设计角度开始谈这个问题。首先,如果寄存器赋值时没有特殊要求必须是下降沿触发赋值时,我们会选择上升沿触发,且时钟关闭时固定为低电平。这样一来,保证了时钟关闭时漏电最小(低电平下没有电压差,减小了漏电流IDDQ,同时上升沿触发也保证了来了时钟能够立刻采样信号,快速响应)。当然了,如果要求寄存器下降沿采样,那么时钟关闭时固定为高电平了。

借用此思想,对于CPOL的选择,如果配置可以选择的话,我建议参考MASTER与SLAVE接口IO的配置参数。如果两边都是上拉,那么建议选择CPOL为1,这样一来,当我们配置CPOL时,不会在接口上制造出一个下降沿(单SLAVE的应用场景下,SLAVE的片选有时会直接连接GND,而此时MASTER本不想通讯但是传入了一个下降沿,SLAVE那边区分不出来这是不是有效通讯);而且这样在IO上的漏电也能有效控制(没有电势差,没有电流)。如果一边上拉一边下拉,如果从功耗的角度考虑,建议选择下拉电阻更小(漏电流更大)的IO的上下拉配置进行CPOL赋值。

关于CPHA的选择,我个人更倾向于使用CPHA配置为1的状态。此配置下,第一个时钟沿驱动数据数据输出,第二个时钟沿驱动数据采样,比较符合硬件上的使用习惯。

当然了,这都是纸上谈兵,很多时候时序类型的选择还要结合芯片硬件条件、功能实现需求等问题考虑。

 

 

注释1:维基百科上SPI接口的详细描述http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

© 著作权归作者所有

共有 人打赏支持
a
粉丝 0
博文 2
码字总数 3014
作品 0
Ipsec Openswan 26sec等基础知识扫盲

最近在整理openswan clips,linux netkey等 方面的东西. 理清openswan什么版本支持ipv6,pluto和racoon作用等等知识 . 希望对研究ipsec,vpn方面的朋友有帮助.整理不足之处还请指正. 问题提出:...

ustbgaofan
2016/10/18
38
0
【应用笔记】小白也能玩转RT-Thread之 SPI设备

本应用笔记以驱动SPI接口的OLED显示屏为例,说明了如何添加SPI设备驱动框架及底层硬件驱动,使用SPI设备驱动接口开发应用程序。并给出了在正点原子STM32F4探索者开发板上验证的代码示例。 本...

RTThread物联网操作系统
04/13
0
0
FTDI发布安卓USB主控IC--FT311D

VNC2--USB HOST 安卓USB主控IC--FT311D PDIUSBD12(D12)的替代IC: FT120 提供USB2.0 轉UART, FIFO, SPI, I2C(FT-X系列) 想更快, 更容易讓你的安卓系統連接到USB外设? FTDI最新推出的FT311D是...

黄鑫城
2012/10/24
967
2
SPI (Serial Peripheral Interface)串行外设接口 协议详解+实例

SPI (Serial Peripheral Interface)串行外设接口 协议详解+实例 一、协议简介 SPI协议简介(转) (2008-04-26 16:24) 分类:单片机及硬件相关技术 来自:http://blog.chinaunix.net/space...

FreeBlues
2012/07/16
0
1
windows操作扫盲

1.host文件在C:WindowsSystem32driversetc下面 host的主要用途: 1.转发跳转 一些域名无法在114.114.114.114或者默认的DNS上进行解析的时候, 需要手动指定 对应的ip和域名 例如现在很有名的...

熊猫88
2015/12/22
31
0
pcDuino 书籍_第三章: C语言和pcDuino的Arduino风格IDE (II)

上篇讲到:pcDuino 书籍第三章: C语言和pcDuino的Arduino风格IDE (I) Arduino风格的库和例程解释 UART 参考: 请从Arduino官网上参考Serial Class(http://arduino.cc/en/Reference/Serial)...

pc朵拉
2013/08/09
1K
0
困扰我很久的NFC shield 在pcDuino上的问题,终于解决了!

在pcDuino上调试NFC shield 的问题困扰了我很久,今天把我的调试过程分享给大家:我使用了官方网站上给出的"PN532_SPI"这个库调试,因为pcDuino没有arduino兼容的接口,所以将NFC shield直接...

pc朵拉
2013/08/08
577
0
S3C2440的SPI控制器

S3C2440包含有两个串行外围设备接口(SPI口),每个SPI口都有两个分别用于发送和接收的8位移位寄存器,在一次SPI通信当中数据被同步发送(串行移出)和接收(串行移入)。8位串行数据的速率由...

长平狐
2013/06/03
65
0
单片机软件模拟SPI接口—加深理解SPI总线协议

单片机软件模拟SPI接口—加深理解SPI总线协议 SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器臌控制器和外围扩展芯片之间的串行连...

长平狐
2013/06/03
136
0
【博文汇总】SPI总线学习

【博文汇总】SPI总线学习 【SPI总线协议介绍】 简要的介绍了SPI协议的技术性能、总线结构、接口定义、物理内部结构、时钟极性和时钟相位、传输时序、数据传输以及优缺点。通过该文章能多SPI...

长平狐
2013/06/03
24
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用axios.all处理并发请求

如果我们需用在两个接口同时完成后在执行一些逻辑,我们可以使用axios.all处理并发请求: function getUserAccount() { return axios.get('/user/12345');}function getUserPermissio...

JamesView
24分钟前
0
0
SpringCloud 微服务 (十六) 服务追踪 Zipkin

问题 在服务中,有一个接口,该A接口中又调用了其他服务的B、C、D接口,出现一个请求耗时大的问题,这时候并不知道该B、C、D接口中哪个接口造成的耗时量,然后比如确定C服务接口出现的耗时量大,但...

___大侠
35分钟前
0
0
Java面试基础篇——第八篇:抽象类与接口的区别

1.抽象类 抽象类:如果一个类中包含有抽象方法,或这个类使用abstract关键字修饰,则称这个类是抽象类。 抽象方法是什么呢?抽象方法就是指用abstract关键字修饰的方法。 需要注意的是:抽象...

developlee的潇洒人生
52分钟前
2
0
jsoup 相关资料

1.jsoup 2.Jsoup概述 3.jsoup入门 4.jsoup Java HTML Parser 1.11.3 API

IT追寻者
53分钟前
0
0
JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
今天
0
0
【一】Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
3
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部