【ESP32 IDF】SPI层次结构SPI协议与SPI控制器结构
@TOC
前言
SPI(Serial Peripheral Interface)是一种常见的串行通信协议,用于在微控制器和外部设备之间进行快速、全双工的通信。在 ESP32 IDF(Espressif IoT Development Framework)中,SPI 接口被广泛应用于连接各种外设,如传感器、存储器和显示屏等,为开发者提供了一种可靠而高效的数据传输方式。
本文将探讨 ESP32 IDF 中 SPI 的层次结构、SPI 协议以及 SPI 控制器的结构,以帮助开发者更好地理解和利用 ESP32 中的 SPI 接口。
一、SPI 程序层次
1.1 硬件原理图
以 SPI 接口的 Flash 为例,它跟主控的连接图如下:
其中DI为SPI设备发给主控的。SCK为时钟(所以SPI协议是一种同步协议)
主控发出。DO为主控发送给SPI设备的,CS为片选引脚,我们可以通过CS片选引脚来选中不同的SPI设备,可以实现一主多从。
1.2 硬件框图
我们会编写程序通过SPI控制器来操作Flash,SPI来帮我们传递数据。
1.3 软件层次
要操作 Flash,涉及这几个层次的程序:
① 应用程序:我来决定“在哪个位置、读写什么数据”
② Flash 驱动:我知道发送什么格式的 SPI 数据才能读、写、擦除 Flash
③ SPI 控制器驱动(HAL):我可以发送 SPI 数据
二、SPI协议
2.1 硬件连线
SPI(Serial Peripheral Interface,串行外设接口)是由摩托罗拉(Motorola)在
1980 前后提出的一种全双工同步串行通信接口,它用于 MCU 与各种外围设备以串行方式进
行通信以交换信息,通信速度最高可达 25MHz 以上。
SPI 接口主要应用在 EEPROM、FLASH、实时时钟、网络控制器、OLED 显示驱动器、AD
转换器,数字信号处理器、数字信号解码器等设备之间。
SPI 通常由四条线组成,一条主设备输出与从设备输入(Master Output Slave Input,
MOSI),一条主设备输入与从设备输出(Master Input Slave Output,MISO),一条时钟信
号(Serial Clock,SCLK),一条从设备使能选择(Chip Select,CS)。
SPI 可以一个主机连接单个或多个从机,每个从机都使用一个引脚进行片选,物理连
接示意图如图所示:
我们可以通过把SCLK时钟,输入和输出所有从机共用一根线,通过CS引脚(片选引脚)来区分发送和接收哪个设备。
这样就可以使用I2C的一主多从
2.2 如何访问SPI设备
首先,使能片选引脚,在片选引脚有用的期间再去访问
那怎么发数据和读数据呢?
假设主控要发送0x56(二进制:0101 0110
)给Flash,时序如下:
首先发送CS片选信号,选中他,在每个时钟周期传输一位。第一个时钟周期传递最高位。然后其他的位就接着传输。
在一开始的时候,这个SCK是高电平还是低电平?
这是可以设置的。(CPOL)
传输数据时,是在第一个跳边缘("跳边缘"通常指的是在数字信号中的变化,特别是从低电平到高电平或从高电平到低电平的变化。
)传输数据还是在第二个跳边缘传输数据?
这也是可以设置的(CPHA)
通过上面的CPOL和CPHA的组合,可以组合成4个SPI不同的模式
比如说我们可以组合成下面这个时钟时序图:
当CPHA为1时在第二个跳边缘传输数据
当CPHA为1,CPOL不同时,可以观察到,他们的初始电平分别为高电平和低电平
无论哪种模式,我们都可以同时发送和同时接收8位数据
2.3 SPI 框图
在我们实际编程中我们是不需要这样去控制引脚的
我们编写的程序将会通过内部的SPI控制器去访问外部的SPI设备,这个SPI控制器帮我们实现时序,进行读写。
SPI控制器框图:
- 当我们要操作SPI的时候,我们要去设置他的模式:时钟平时是什么电平,在第几个跳边缘传输数据
- 我们需要设置时钟的频率
- 我们可以去写数据了
比如上面的框图,他有SPI控制寄存器2,控制寄存器1,我们可以设置控制寄存器1的时钟平时是什么电平,在第几个跳边缘传输数据:
然后我们就可以通过写/读缓冲区来得到数据了
总结
在 ESP32 IDF 中,SPI 提供了一种强大而灵活的接口,使开发者能够轻松地与外部设备进行高速、全双工的通信。通过了解 SPI 的层次结构、协议和控制器结构,开发者可以更好地利用 ESP32 的硬件特性,实现与外部设备的可靠连接,并构建各种复杂的嵌入式系统。熟悉 ESP32 IDF 提供的 SPI 接口,将有助于开发者更快速、更有效地完成各种项目,从而推动物联网和嵌入式系统的发展。
- 点赞
- 收藏
- 关注作者
评论(0)