当前位置:   article > 正文

一起玩儿物联网人工智能小车(ESP32)——58. SPI总线协议初探(二)_esp32 三线spi

esp32 三线spi

摘要:介绍SPI总线的基本知识

在前边一篇文章中,介绍了SPI总线的基本知识,最后讲到了SPI总线的4种模式,今天继续阐述一下这四种模式,作为一个开发人员,看时序图是必须要掌握的一项技能,下面就通过时序图来加深一下对SPI总线的4种工作模式的理解。

模式0(CPOL=0,CPHA=0):

当CPOL=0、CPHA=0时,在上图中可以看到,当CS信号无效(高电平)时,时钟信号SCK是低电平的。CPHA=0则标识数据采样在第一个时钟上升沿,这时应保证数据的稳定,而数据的输出在时钟的下降沿。

模式1(CPOL=0,CPHA=1):

当CPOL=0、CPHA=1时,在上图可以看到,当CS信号无效时,时钟信号SCK是低电平的。这与前一种情况是相同的,而不同点在于,当CPHA=1时,下降沿为数据采样时刻,此时应保持数据稳定,而上升沿是数据输出时刻,可以根据需要改变输出数据的电平。

当CPOL为1时,SCK时钟信号在CS无效的时候是高电平的,这是与之前两种情况有区别的地方,CPHA=0表示在第一个变化沿,也就是下降沿的时候进行数据采样,那么上升沿就是数据输出时刻,可以改变输出数据的电平。

这个应该就不用再解释了。按照前边的说明,应该很容易的就可以看懂了。现在总结一下看SPI时序图的要点:

  1. 首先看最左端当CS无效时SCK的状态。如果SCK为高电平,那么就说明CPOL为1,如果SCK为低电平,那么CPOL为低。
  2. 判断CPHA的时候,需要看SCK的第几个脉冲沿对应着数据线(MOSI和MISO)的稳定状态(平行状态)。如果是SCK的第一个跳变沿,对应数据线的稳定状态,那么CPHA就是0,如果是第二个跳变沿对应数据的稳定状态,那么CPHA就是1。

这个看图的技能是必须要掌握的,因为有些功能模块的说明书可能不会明确告诉你是模式几,而时序图是一定会有的,这时候就需要你根据时序图去选择正确的SPI工作模式,这样才能和设备实现正确的通信。

下面来总结一下SPI总线的优缺点:

  1. 在点对点的通信中,SPI总线不需要进行寻址操作,并且是全双工通信,简单且高效。
  2. 在与多个从设备通信时,每个从设备需要有独立的片选信号,因此在硬件上比IIC复杂,占用的GPIO引脚要多。特别是有比较多的从设备时,需要很多的片选信号。
  3. SPI总线和IIC总线一样,没有流控机制。
  4. SPI总线协议没有应答确认是否收到数据,如果需要相应的确认功能,则需要从软件上想办法。

下面来了解一下ESP32芯片中的SPI通信设备的情况。ESP32芯片一共有4个SPI设备。其中SPI0和SPI1是专有SPI,SPI0是私有的SPI设备,被用于系统主flash操作,不对用户开放。SPI1只能用于主机模式,引脚与SPI0共用,用于操作系统主flash。SPI0与SPI1共用同一个总线判决器。SPI2和SPI3是通用SPI,给用户使用,可以用于驱动外部设备。SPI2也叫做HSPI,SPI3也叫做VSPI。SPI2和SPI3的引脚可以任意安排。并且每个SPI可以使用三个片选线。意味着每个SPI外设可以同时驱动三组设备。

ESP32的SPI支持三线SPI、四线标准SPI、Dual SPI和Quad SPI等工作模式。三线SPI是把MISO和MOSI总线进行了合并。同一时间只能进行单方向的读或者写。是半双工的通讯。Dual SPI是四线半双工的SPI通讯。Quad SPI是六线半双工的SPI通讯。现阶段,没有特殊声明的都是四线标准SPI,其他的等用到的时候再做详细的介绍。

Arduino也提供了标准的SPI类来进行SPI通信,现在就来看一下该如何使用这个SPI类。 1. 因为SPI是一个单独的类,首先需要引入头文件“SPI.h”,具体代码如下所示:

#include <SPI.h>

2. 接着就是SPI对象的初始化了。同其他很多对象一样,就是调用其begin()方法。在这个方法中,会自动将SCK、MOSI和SS设置为输出状态,并且将SCK和MOSI设置为低电平,SS设置为高电平。

3. 如果需要修改SPI通信的默认参数,可以使用其beginTransaction()方法,这个方法需要传递一个SPISettings对象,在SPISettings对象中可以定义SPI通信的最大传输速率、串行化顺序(高位在前还是低位在前)、还有具体使用哪一种传输模式。

注意,这个方法要在初始化begin()方法之后执行。

4. 接下来,就可以使用transfer()方法进行收发数据了。这个方法的参数为要发送的数据,而返回值为接收到的数据。也就是说,收发数据都是使用这一个方法。

5. endTransaction()这个方法用来释放SPI总线,该方法通常在将片选信号置为无效后使用。

在这里需要提醒的是,当工作在主机模式时,片选信号是需要单独控制的,在收发数据之前或之后,可以改变片选引脚的输出状态。

好了,关于SPI的基本知识就介绍到这里了,接下来的几篇文章,会介绍一下SPI的简单应用。敬请关注!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/801140
推荐阅读
相关标签
  

闽ICP备14008679号