ESP32C3开发——SPI

16 篇文章 2 订阅
13 篇文章 5 订阅


前言

SPI这是本系列要学习和开发的第三种硬件外设,SPI也是一种用于有线连接的通信协议,被称作“串行外设接口”。通过本次学习要掌握SPI协议,并开发以ESP32C3作为SPI主机与SPI从机设备进行数据交互的工程程序。


一、SPI协议

1.SPI简介

SPI(Serial Peripheral Interface)串行外设接口,允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置成主模式,并为外部从设备提供通信时钟(SCK)。接口还能以多主配置方式工作。
SPI接口是Motorola提出的全双工三线同步串行外围接口,它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠通信。

2.接口定义

SPI接口一般有4根线信号线,分别是:串行输出数据线、串行输入数据线、时钟线、片选线(该线可根据需求选择)。
MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
SCK:串口时钟,作为主设备的输出,从设备的输入
NSS(/SS):从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。
SPI主设备与从设备的接线方式如下图:
在这里插入图片描述

3.SPI内部结构

SPI的方框图如下图:
在这里插入图片描述

4.SPI传输时序

在SPI的内部有两个移位寄存器,传输数据为8位,在主设备产生的从设备使能信号和位移脉冲下,按位传输,高位在前,低位在后。SPI没有指定的数据流,没有应答机制确认是否收到数据。
时钟信号的相位和极性
CPOL(时钟极性)位:控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。
CPHA(时钟相位)位:控制数据是在时钟(SCK)的“上升沿”还是“下降沿”被采样。列如:SCK时钟的第二个边沿(CPOL位为0时就是下降沿, CPOL位为’1’时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。如果CPHA位被清’0’,SCK时钟的第一边沿(CPOL位为’0’时就是下降沿, CPOL位为’1’时就是上升沿)进行数据位采样,数据在第一个时钟边沿被锁存。
根据SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系:
在这里插入图片描述在这里插入图片描述
• 模式 0: CPOL = 0, CPHA = 0; SPI 处于空闲模式时, SCK 为 0;数据在 SCK 下降沿变化,在上升沿采样。第一个数据在 SCK 的第一个下降沿之前被移出。
• 模式 1: CPOL = 0, CPHA = 1; SPI 处于空闲模式时, SCK 为 0;数据在 SCK 上升沿变化,在下降沿采样。
• 模式 2: CPOL = 1, CPHA = 0; SPI 处于空闲模式时, SCK 为 1;数据在 SCK 上升沿变化,在下降沿采样。第一个数据在 SCK 的第一个上升沿之前被移出。
• 模式 3: CPOL = 1, CPHA = 1; SPI 处于空闲模式时, SCK 为 1;数据在 SCK 下降沿变化,在上升沿采样。
注意:
• 在改变CPOL/CPHA位之前,必须清除SPE位将SPI禁止。
• 主和从必须配置成相同的时序模式。
• SCK的空闲状态必须和SPI_CR1寄存器指定的极性一致(CPOL为’1’时,空闲时应上拉SCK为
高电平; CPOL为’0’时,空闲时应下拉SCK为低电平)。
• 数据帧格式(8位或16位)由SPI_CR1寄存器的DFF位选择,并且决定发送/接收的数据长度。

二、ESP32C3 GP-SPI

1.简介

ESP32-C3 芯片集成了三个 SPI 控制器:
• SPI0
• SPI1
• 通用 SPI2,即 GP-SPI2
SPI0 和 SPI1 控制器主要供内部使用。
SPI0 和 SPI1 可配置成 SPI 存储器模式, SPI2 可配成通用 SPI 模式。
• SPI 存储器 (SPI Memory) 模式
SPI 存储器模式(SPI0 和 SPI1)用于连接 SPI 接口的存储器。 SPI 存储器模式下数据传输长度以字节为单位,最高支持四线 STR 读写操作。时钟频率可配置, STR 模式下支持的最高时钟频率为 120 MHz。
• SPI2 通用 SPI (GP-SPI) 模式
SPI2 作为通用 SPI 时,既可以配置成主机模式,又可以配置成从机模式。主机模式和从机模式均支持双线全双工和单线、双线或四线半双工通信。通用 SPI 的主机时钟频率可配置;数据传输长度以字节为单位;时钟极性 (CPOL) 和相位 (CPHA) 可配置;可连接 GDMA 通道。
– 在主机模式下,时钟频率最高为 80 MHz,支持 SPI 传输的四种时钟模式。
– 在从机模式下,时钟频率最高为 60 MHz,也支持 SPI 传输的四种时钟模式。

2.引脚关系

SPI 信号与 GPIO 管脚的映射关系:
在这里插入图片描述ESP32-C3 系列芯片和外部 flash :
在这里插入图片描述

3.GP-SPI的特性

具有以下特性:
• 支持主机模式和从机模式
• 支持半双工通信和全双工通信
• 支持 CPU 控制的传输模式以及 DMA 控制的传输模式
• 支持多种数据模式:
– 1-bit SPI 模式
– 2-bit Dual SPI 模式
– 4-bit Quad SPI 模式
– QPI 模式
• 时钟频率可配置:
– 在主机模式下:时钟频率可达80MHZ
– 在从机模式下:时钟频率可达60MHZ
• 数据长度可配置:
– 在主机和从机 CPU 控制的传输模式下:数据长度为 1 ~ 64 B
– 在主机 DMA 控制的单次传输模式下:数据长度为 1 ~ 32 KB
– 在主机 DMA 控制的分段配置传输模式下:数据长度字节数无限制
– 在从机 DMA 控制的单次或连续传输模式下:数据长度字节数无限制
• 数据位的读写顺序可配置
• 为 CPU 控制的传输和 DMA 控制的传输分别提供独立中断
• 时钟极性和相位可配置
• 四种 SPI 时钟模式:模式 0 ~ 模式 3
• 在主机模式下,提供六条 CS 线: CS0 ~ CS5
• 支持访问 SPI 接口的传感器、显示屏控制器、 flash 或 RAM 芯片

4.架构概览

在这里插入图片描述
功能块图:
在这里插入图片描述
• Master FSM: GP-SPI2 的主机状态机。主机模式下支持的所有功能,均由该状态机与寄存器共同控制。
• SPI Buffer: SPI_W0_REG ~ SPI_W15_REG,见图 26-2。 CPU 控制模式下传输的数据在 SPI buffer 中准备。
• 时序模块 (Timing Module):捕获 FSPI 总线上的数据。
• spi_mst/slv_din/dout_ctrl:用于将 TX/RX 数据转换成字节。
• spi_rx_afifo:暂存接收到的数据。
• buf_tx_afifo:暂存待发送的数据。
• dma_tx_afifo:暂存来自 GDMA 的数据。
• clk_spi_mst: GP-SPI2 模块时钟,由 PLL_CLK 分频所得。在 GP-SPI2 主机模式下用于生成数据传输以及从机所需的 SPI_CLK 信号。
• SPI_CLK 生成器 (SPI_CLK Generator):对 clk_spi_mst 进行分频生成 SPI_CLK 信号。分频系数由 SPI_CLKCNT_N和 SPI_CLKDIV_PRE 共同决定。
• SPI_CLK_out Mode Control:发送数据传输以及从机所需的 SPI_CLK 信号。
• SPI_CLK_in Mode Control:当 GP-SPI2 用作从机时,用于捕获 SPI 主机发出的 SPI_CLK 信号。
GP-SPI2 与从机使用全双工通信
连接方式见下图:
在这里插入图片描述

三、工程例程

使用乐鑫官方例程,看看ESP32C3的SPI是怎么使用的。
打开vscode软件,按“ctrl+shift+P”打开选择栏,选择“ESP-IDF:Show Examples Projects”
在这里插入图片描述
选择“hd_eeprom”创建工程例程
在这里插入图片描述
工程结构分析:
在这里插入图片描述
添加外部组价的方法:按“ctrl+shift+P”打开选择栏,选择“ESP-IDF:Create new ESP-IDF Component”
在这里插入图片描述
输入组件的名称,按“enter”
在这里插入图片描述
通过这种方式添加的组件,main文件夹的main函数所在的文件会自己引,不需要修改CMakeLists.txt文件。
代码分析
在这里插入图片描述
在这里插入图片描述
spi_eeprom.c文件实现的是eeprom的驱动程序,有兴趣的朋友可以看一下。
在这里插入图片描述

四、总结

本次主要讲的是SPI的相关知识和ESP32C3 SPI的一般开发,也基本可以满足大部分的SPI设备的数据交互。不同的设备SPI的协议都是一样的,区别在于设备的功能不同驱动程序就需要重新编写。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值