赞
踩
摘要:介绍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时序图的要点:
这个看图的技能是必须要掌握的,因为有些功能模块的说明书可能不会明确告诉你是模式几,而时序图是一定会有的,这时候就需要你根据时序图去选择正确的SPI工作模式,这样才能和设备实现正确的通信。
下面来总结一下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的简单应用。敬请关注!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。