技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 87|回复: 0
收起左侧

【硬件】SPI串口传输协议

[复制链接]

1024

主题

2270

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17418 个
贡献
34873 次
宅之契约
0 份
在线时间
1656 小时
注册时间
2014-1-26
发表于 2019-2-18 14:12:01 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
SPI(Serial Peripheral Interface)串口传输协议被广泛应用于各种单片机或者集成电路上。它十分简单易懂并且具备较高速度的传输能力,并且具备全双工同时收发数据的能力。和UART相比,它增加了时钟线和片选线,去掉了UART的开始位、结束位和奇偶位的特性。SPI是面向字节的传输协议,每8个bit是一个数据。SPI既可以高位优先顺序发送一个字节,也可以低位优先发送字节。通常是高位优先。

SPI有四根信号线:MOSI,MISO,SCLK,SS。其中,MOSI是Master发送数据、Slave接收数据的信号线,MISO是Master接收数据、Slave发送数据的信号线(注意不是日语的「みそ」、「味噌」的罗马音),SCLK是时钟线并由Master驱动,SS是从选(也叫片选,CS),低电平激活(所以要加上划线)。

这些信号线的名字可以不是上文所说的。
数据线的别名有DI,SDI,DIn,SI,DO,SDO,DOut,SO,SIMO,SOMI,MTSR,MRST,SRMT,STMR等。这些名字里面的M表示Master(主),S表示Slave(从),D表示Data(数据),I表示Input(输入),O表示Output(输出),T表示Transmit(发送),R表示Receive(接收)。
时钟线的别名有SCK、CLK。注意SCLK、SCK的S是Serial。
从选SS信号也有不少别名:SSEL,CS,CS,CE,nSS,/SS,SS#等。

1920px-SPI_single_slave.svg.png
图片来自维基百科

SPI有不同的工作模式,通常用CPOL和CPHA的值表示。CPOL指的是SPI的SCLK信号线的极性,CPHA指的是输入信号线采样的时序和输出信号线设置新值的时机,也就是相位(phase)。
请看下面四张图描述的4种不同的配置情形。

图1:
spi-cpol-0-cpha-0.png
图片来源:DLNWARE

时钟信号SCLK闲置时为低电平,传输开始的时候(SS被拉低)主设备和从设备设置好各自要发送的数据,然后在SCLK的上升沿采样,再在下一个SCLK的下降沿设置数据,再在下一个SCLK的上升沿采样。

图2:
spi-cpol-0-cpha-1.png
图片来源:DLNWARE

CPHA也就是相位为1的时候,主设备和从设备在SCLK的上升沿准备数据,并在SCLK的下降沿采样数据。与图1的区别在于准备数据和采样数据的时机不同。

图3:
spi-cpol-1-cpha-0.png
图片来源:DLNWARE

时序和图1一样,但SCLK的电平相反。在闲置的时候是高电平。传输初始的时候主从都要准备好数据,然后SCLK在下降沿的时候采样、上升沿的时候准备下一个bit的数据。

图4:
spi-cpol-1-cpha-1.png
图片来源:DLNWARE

时序和图2一样,但SCLK的电平相反。主从设备在SCLK的下降沿准备数据,然后在SCLK的上升沿采样数据。

SPI总线可以有多种方式布局,最典型的方式就是一个主设备控制多个从设备的方式。主设备的MOSI口连接所有的从设备的MOSI口,主设备的MISO口连接所有从设备的MISO口,主设备的SCLK口连接所有从设备的SCLK口,然后主设备对每个从设备都有一条单独的SS信号线,用来指定自己收发数据的目标。如下图所示的连接方式就是典型的多Slave设备的SPI总线布局。

350px-SPI_three_slaves.svg.png
图片来自维基百科

这种方式的总线布局钦定了从设备的个数,难以进行动态扩张。因为每个从设备都有一条独享的SS线,这需要占用额外的主设备针脚。因此SPI总线还有另外一种连接方式,叫“菊花链”(Daisy chain)。这种布局把所有的从设备的SS信号线都连接到主机上,这样主机可以不需要通过占用GPIO口来控制多个设备了。主机的MOSI口仅连接第一个从设备,在通讯的时候从设备识别接收到的数据,判断是不是自己的数据,然后处理,并把不是自己的数据通过MISO口输出给下一个菊花链上的从设备的MOSI口上。这样一圈下来,主机就可以收到自己想要的数据了,但主机需要不断地驱动SCLK来保证所有的从设备都在参与通讯。典型的做法是定义一种传输的数据帧的格式,让它里面包含一个设备地址的数据来实现片选功能。下图就是一种典型的菊花链布局。

350px-SPI_three_slaves_daisy_chained.svg.png
图片来自维基百科

典型SPI布局(非Daisy chain方式)的优势是主设备可以控制多个模式不同的从设备,只要对应的SS信号被拉低激活,就可以以对应的模式进行传输。而且主设备可以和波特率不同的从设备通讯。不同的从设备对波特率的要求不同,有的允许很快的传输速度,有的则不行。主设备可以动态改变自身的时钟频率,来适应不同的从设备。

而Daisy chain方式则由于所有的从设备使用同一根SS线,必须在相同的SPI模式下才能正常通讯。并且主设备必须以最慢的那个设备的波特率来驱动SCLK时钟线。因此各有取舍。

参考资料:
https://
en
.wikipedia.org/wiki/Serial_Peripheral_Interface

h
tt
p://dlnware.com/theory/SPI-Transfer-Modes

评分

参与人数 1宅币 +6 收起 理由
watermelon + 6 看不懂,投币。

查看全部评分

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-3-20 23:32 , Processed in 0.106382 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表