大话SPI通信--基础巩固篇

3cfd71d29aa83f6d10d94947c368cefb.gif

正文


大家好,我是bug菌~

SPI通信在嵌入式领域是非常常用的一种通信方式了,相比串口、IIC等等,SPI通信是一种高速、高效率的串行接口技术。

然而最近在新项目开发中使用SPI通信却遇到了不少问题,过程中还是有挺多技术细节和知识点需要把握住的,那么今天bug菌就结合最近的使用情况和一直以来在SPI通信上踩过的坑进行总结和记录,一起避坑。

本文为基础巩固篇:

1

通信形式

SPI是一种全双工、同步串行的通信方式,全双工、半双工等,表示某一时刻,数据的流动形式,全双工即可双向同时收发,而半双工则在一个时刻只能收或者发,通常全双工具有两条独立通信线路,而半双工则共用同一条线路。

42681c64a83c085a246ef89cc0ebc3bc.png

从SPI通信接线图可以看出,MOSI用于主机数据输出,从机数据输入,MISO引脚的数据流则刚好与之相反,所以数据流收发是走的两条独立的线路,从而可实现全双工通信模式,当然你也可以用于只用于单向数据传输,比如省略掉MISO仅主机传输从机数据等。

SPI通信有一个SCLK时钟线作为通信的同步信号,用来标定数据在MOSI和MISO引脚上的传输情况,SCLK是由主机来控制提供,从机检测识别,从而同步完成数据传输。

片选信号CS引脚,还记得有一次面试问片选信号CS英文是什么?英文直译即可--Chip Select。

片选信号在大部分数字芯片都有存在,外界给该引脚相应的电平即可选中,相当于一个"总开关",大部分从设备都是低电平被选中(电路图中通常在CS上划线标识),如果一直被选中则直接接地即可;当然也有少部分高电平选中则可直接接到VCC,切记不可悬空,以免异常。

这样看SPI的通信线路非常简单,没有繁杂的线路硬件也省了不少事,但很多朋友包括bug菌曾经因为把主机的MOSI接到从机的MISO而折腾得不轻,都是惯性思维惹的祸,一定要记住是对应引脚相连。

34df5271b7b25becc4f0d6c3deac7ce0.png

2

通信线路

SPI是一种主从通信方式,在SPI通信总线上通常只有一个主机,一切通信的开始都是以主机发起,那如果在一条总线上与多个从设备通信呢?下面以两个从机为例,更多的从机也是类似的。

bd0dc8383cd065f8b9c19ba5773c461e.png

通过不同的片选引脚来选中不同的从设备,从而完成一对多的通信过程。通常多从机的情况都会采用多余的IO口连接从设备的片选引脚,以便分时控制从设备,达到一主多从机的主从控制方式。

当然如果独立的IO口引脚有限,可以采用IO口扩展芯片进行选中,也是比较方便的。

3

通信数据

SPI通信是一种交换数据的形式,主机根据SCLK时钟把数据从MOSI引脚按bit位发送的同时,从机也以相同的速率把数据从MISO引脚传输,其传输数据形式如下:

8328d5789246776dd89f0648a7055789.png

从SPI通信数据流图可以看出其发送与接收形成了一个封闭的环,所要传输的数据像水在一根管道内循环流动,所以其硬件线路上并没有像I2C那样有所谓的应答机制,通信效率上提高不少,但数据可靠性也会有一定的减弱。

前面bug也谈到SPI是一种主从通信机制,那么使得“管子”内数据流涌动的源泉一方面需要SPI的SCLK时钟保持好节奏,另一方面就是需要主机来推动,所以如果master只是想获取slave的数据,也需要发送空数据来使得整个数据流动起来,从而获得从机的数据。

细心的朋友应该注意到上图中MSB和LSB方向了,通常SPI通信都是以MSB来进行发送,但像stm32芯片这样的芯片可以设置是LSB先发送还是MSB先发送。

所以在分析SPI通信数据的时候这些数据都是需要提前了解的。

4

通信电平‍

SPI比较麻烦点的就是时钟极性和时钟相位的确定了,但再怎么麻烦也就确定了4种模式。

如下是4种模式的时序图,其中CPOL(Clock Polarity)表示时钟极性,CPHA(Clock Phase)表示时钟相位。

48412e28274aee751831c0e71a8ae5b0.png

7377175cc64c4af55289c06bb30fea9e.png

从图中我们可以分析得到:

1、CPOL和CPHA共同决定数据的采集方式。

2、CPOL决定了SCLK默认状态,当CPOL=0,时钟空闲时是低电平;当CPOL=1,时钟空闲时为高电平。

3、CPHA决定了数据在第几个跳变沿采集,当CPHA=0,在SCLK第一个跳变沿采集稳定数据;当CPHA=1,在SCLK第二个跳变沿采集稳定数据。

每个bit的数据交换,都是在电平稳定的时候进行数据电平采集,在电平变化的时候进行数据发送,一般从设备像高精度ADC等等,出厂就已经是固定了某种模式,我们需要做的就是通过配置可编程的主机SPI外设在相同的一种频率和模式下通信,否则就是造成数据错乱。

现在比较流行库开发,很多外设使用案例直接可以拿过来用,或者尝试着调整几个参数就可以了,似乎不需要懂太多的原理,但这样的学习终究只是把芯片玩起来了,要做到一通百通还是得从最原始的理论出发,只有把握住这些重点才能在项目开发的过程中直面问题并搞定它。

下一篇进阶避坑篇,我们再更加深入聊聊SPI。

最后

      好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

最后一个bug,bug菌唯一创作平台~

38b71e3b032e2a1f2e6fdded92dcdec8.png

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 cd0e49d7134670f213dfda931134f4f5.gif

☞  嵌入式C语言进阶专辑 e7a9135689828ff904d618ecfd617f56.gif

☞  “bug说”专辑 981955dc4bd70d052887c5b95793114b.gif

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

1040cc13ca8df278591819be171a9de5.gif

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值