STM32基础篇:SPI通信协议

SPI总线简介

SPI是Serial Peripheral Interface的缩写,翻译成汉语就是串行外设接口,一种同步、全双工通信协议。这种总线结构特别适用于高速双向的数据传输场景。

例如摄像头模块,因为要传输图像,所以数据通讯的量比较大,一般都会选择使用SPI总线跟单片机建立连接。再比如外接Flash模块,因为我们既要向Flash模块写入数据,又要从它里面读取数据,所以数据通信方向是双向的,且传输速度比较快,因此这种模块适用SPI总线与单片机通信。

SPI总线结构

单片机可以通过SPI总线和大量的模块建立连接 。SPI总线由4条线组成,分别为:

MOSI主机发送,从机接收
MISO主机输入,从机发送
SCK串行时钟线,一个时钟周期传输一位数据
NSS从机选择(低电压有效),主机向对应的NSS发送低电平,就可以选中从机

【注意】其数据传输的规则均为高电平表示1,低电平表示0;并且时钟频率决定了数据传输的快慢,频率越快,传输速度越快。

其接线如下:


对比I2C

对于I2C,无论是软件还是硬件电路,设计上都是比较复杂的。硬件上要配置为开漏+上拉的模式,软件上也有许多要求。通过这些复杂的设计和配置,使得I2C通信的性价比很高,能够在消耗最低硬件资源的情况下,实现最多功能。

但由于上拉+开漏的模式,使得通信数据线高电平的驱动能力比较弱,从而导致通信线由低电平到高电平变化时,上升沿耗时会比较长,这就会限制I2C的最大通信速度。所以I2C标准模式只有100KHz的时钟频率,快速模式也只有400KHz时钟频率。

虽然现在I2C模式通过更改电路,设计出了3.4MHz的高速模式,但目前普及程度不高,一般情况下认为I2C时钟速度最多就是400KHz,这个速度相比于SPI慢了很多。


SPI的五个参数

1、波特率

波特率就相当于每秒钟传输高低电平的数量,可以看出,波特率越大,数据传输速度就越快。

SPI总线没有规定波特率的取值范围,一般取几兆到几十兆bps,在实际项目中,波特率的选取主要考虑以下三个原则:

1、选择允许的最大值
2、考虑设备所能承受的极限
3、考虑电路板所能承受的极限

例如,对于Flash模块,通过查询手册可知其所能承受的最高波特率为80兆bps,面包板与杜邦线所能承受的最高波特率为10兆bps,综合以上因素,选择的最高波特率就是10兆bps。


2、比特位传输顺序

计算机使用二进制来传输数字,比如一个无符号8位整数来说,它由8个比特位组成(比特0~比特7),其中比特0为LSB(最低有效位)、比特7为MSB(最高有效位)。

如此便有了两种传输顺序,以传输99为例,如下图所示:


3、数据位的长度

可分为8bit和16bit,对于8bit,其8位一组,每组1字节;对于16bit,16位一组,每组1个16位整数。

假设需要发送数据为0xb51f,且先传最高有效位(MSB),则传输过程分别如下图所示:

一般情况下,无特殊说明的话,就选择8bit的传输方式。


4、时钟的极性

时钟极性代表了总线空闲状态时的高低电平。当时钟极性为低时,空闲状态就是低电平;时钟极性为高时,空闲状态为高电平。如下图所示:

由此引申出两个概念:第1边沿第2边沿,低极性时,上升沿为第1边沿,下降沿为第2边沿;高极性与之相反。


5、时钟的相位

主机通过SCK向从机发送时钟信号,并且在时钟信号高低电平转换(上升/下降沿)时采集数据。由此时钟的相位有两种,分别是第1边沿采集第2边沿采集,即在第1边沿(或第2边沿)采集信号。

由时钟的极性和相位,可引申出4种时钟模式,如下:


字节交换※

SPI的基本收发电路,就是使用了下图所示的一个移位的模型:

左边的SPI主机,里面有一个8位的移位寄存器;右边是SPI从机,里面也有一个8位的移位寄存器。移位寄存器有一个时钟输入端,每来一个时钟,移位寄存器就会向左(高位)进行移位

其时钟源由主机提供,叫做波特率发生器,它产生的时钟驱动移位寄存器进行移位。

字节交换:对于主机的移位寄存器,左移出的一位数据通过MOSI引脚,输入到从机移位寄存器的右边;从机移位寄存器左边一出去的数据,通过MISO引脚输入到主机移位寄存器的右边,这样就组成了一个圈。

规定:波特率发生器的时钟上升沿,所有移位寄存器向左移动一位,移出去的位放到引脚上;时钟下降沿时,引脚上的位采样进入移位寄存器的最低位。

以上图为例,其交换数据过程如下:

【注意】若主机只想接收数据,则发送给从机的数据不会被从机理会(一般会发生0x00或0xFF,无实际意义);同样,若主机只想发送数据,则移位寄存器接收到的数据也不会被主机理会。


SPI时序

1、起始和终止

起始条件:NSS从高电平切换到低电平;终止条件:NSS从低电平切换到高电平。


2、数据传输

数据传输建立在"字节交换"基础上,并且什么时候开始移位?、上升沿移位还是下降沿移位?SPI并没有限定死,而是给了我们可配置的选择,如下表:

CPOLCPHA说明
模式000

CPOL为0,代表空闲时SCK为低电平;CPOL为1,代表空闲时SCK为高电平。

CPHA为0,代表SCK第一边沿采样数据,第二边沿移出数据;CPHA为1反之。

模式101
模式210
模式311

【注意】模式0下,SCK第一个边沿为采集数据,但数据没有移出又如何采集呢?因此在NSS由空闲转忙碌时,移位寄存器就开始移出数据了。(如下图所示)


从机指令集

对于I2C,其规定有效数据流第一个字节是寄存器地址,之后依次是读写的数据,其使用的读写寄存器的模型

而在SPI中,通常采用的是指令码+读写数据的模型,其过程为:SPI起始后,第一交换给从机的数据一般叫做指令码,在从机中有一个指令集,能够指导从机完成相对应功能。(不同的指令有不同的数据个数)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值