ESP32-S3学习笔记<5>:SPI的应用
1. 头文件包含
#include "driver/spi_common.h"
#include "driver/spi_master.h"
2. SPI的配置
SPI配置,分两步进行。第一步是配置外设。第二步是添加挂载在SPI总线上的片外设备(如外部ADC等)。ESP32-S3有4个SPI外设,但是SPI0和SPI1保留给Flash或者PSRAM使用。因此一般可用的是SPI2和SPI3。
SPI设备是点对点传输的。但是通过多个CS片选线,可以将一条SPI总线应用在多个外围设备上。不同的外围设备受控于不同的SPI CS片选控制线,并且可能需要不同的速率。因此,第一步配置外设时,主要是设定SPI总线的SCLK、MOSI和MISO线,因为不论外围有几个设备, 这几个信号线是不变的。第二步配置时,则可以在该SPI外设上添加多个设备,该步骤则可指定CS控制线、速率等,并生成一个专用于该外围设备的句柄。
2.1 配置SPI外设
通过以下函数配置SPI外设:
esp_err_t spi_bus_initialize(spi_host_device_t host_id, const spi_bus_config_t *bus_config, spi_dma_chan_t dma_chan);
其中各个参数释义如下:
2.1.1 host_id/选择外设
host_id 设置要使用芯片的哪一个SPI外设。可用的选项有:
typedef enum {
//SPI1 can be used as GPSPI only on ESP32
SPI1_HOST=0, ///< SPI1
SPI2_HOST=1, ///< SPI2
#if SOC_SPI_PERIPH_NUM > 2
SPI3_HOST=2, ///< SPI3
#endif
SPI_HOST_MAX, ///< invalid host value
} spi_host_device_t;
可以看到,SPI0是完全选择不了的。SPI1可能是受限使用,应用中最好使用SPI2和SPI3。
2.1.2 spi_bus_config_t/外设部分参数
spi_bus_config_t 设定外设的几个参数。其定义如下:
typedef struct {
union {
int mosi_io_num; ///< GPIO pin for Master Out Slave In (=spi_d) signal, or -1 if not used.
int data0_io_num; ///< GPIO pin for spi data0 signal in quad/octal mode, or -1 if not used.
};
union {
int miso_io_num; ///< GPIO pin for Master In Slave Out (=spi_q) signal, or -1 if not used.
int data1_io_num; ///< GPIO pin for spi data1 signal in quad/octal mode, or -1 if not used.
};
int sclk_io_num; ///< GPIO pin for SPI Clock signal, or -1 if not used.
union {
int quadwp_io_num; ///< GPIO pin for WP (Write Protect) signal, or -1 if not used.
int data2_io_num; ///< GPIO pin for spi data2 signal in quad/octal mode, or -1 if not used.
};
union {
int quadhd_io_num; ///< GPIO pin for HD (Hold) signal, or -1 if not used.
int data3_io_num; ///< GPIO pin for spi data3 signal in quad/octal mode, or -1 if not used.
};
int data4_io_num; ///< GPIO pin for spi data4 signal in octal mode, or -1 if not used.
int data5_io_num; ///< GPIO pin for spi data5 signal in octal mode, or -1 if not used.
int data6_io_num; ///< GPIO pin for spi data6 signal in octal mode, or -1 if not used.
int data7_io_num; ///< GPIO pin for spi data7 signal in octal mode, or -1 if not used.
int max_transfer_sz; ///< Maximum transfer size, in bytes. Defaults to 4092 if 0 when DMA enabled, or to `SOC_SPI_MAXIMUM_BUFFER_SIZE` if DMA is disabled.
uint32_t flags; ///< Abilities of bus to be checked by the driver. Or-ed value of ``SPICOMMON_BUSFLAG_*`` flags.
esp_intr_cpu_affinity_t isr_cpu_id; ///< Select cpu core to register SPI ISR.
int intr_flags; /**< Interrupt flag for the bus to set the priority, and IRAM attribute, see
* ``esp_intr_alloc.h``. Note that the EDGE, INTRDISABLED attribute are ignored
* by the driver. Note that if ESP_INTR_FLAG_IRAM is set, ALL the callbacks of
* the driver, and their callee functions, should be put in the IRAM.
*/
} spi_bus_config_t;
- mosi_io_num:指定MOSI的GPIO。由于SPI外设最多支持8数据线线模式,所以也可能是data0_io_num。对于一般的4线SPI,则只有MOSI线和MISO线。以下相同。
- miso_io_num:指定MISO的GPIO。
- sclk_io_num:指定SCLK的GPIO。
- quadwp_io_num:HOLD信号。一般SPI总线中不需要这个,则设置为-1。一些Flash(如25Q Flash)带有这个引脚。
- quadhd_io_num:同上,不需要时设置为-1。
- data4_io_num、data5_io_num、data6_io_num、data7_io_num:在8数据线时使用。4线SPI,均设置为-1。
- max_transfer_sz:设置最大传输大小。
- flags:指定驱动的一些特殊功能,定义在文件 spi_common.h 文件中,以前缀 SPICOMMON_BUSFLAG_ 开头。
- isr_cpu_id:指定中断服务程序注册到哪个CPU核心。一般设置为 ESP_INTR_CPU_AFFINITY_AUTO。不过如果带有WIFI应用等,则可能需要按情况考虑。
- intr_flags:指定中断优先级等。
2.1.3 dma_chan/是否使能DMA功能,以及DMA通道信息
可用的选项有:
typedef enum {
SPI_DMA_DISABLED = 0, ///< Do not enable DMA for SPI
#

最低0.47元/天 解锁文章
1794

被折叠的 条评论
为什么被折叠?



