1. ESP32 SPI与片外FLASH基础
第一次接触ESP32的SPI外设时,我被它灵活的配置选项弄得有点懵。作为嵌入式开发者,我们经常需要扩展存储空间,而SPI接口的FLASH芯片是最常见的选择。ESP32内置了4个SPI控制器,其中SPI2和SPI3(也叫HSPI和VSPI)可供用户自由使用,每个控制器最多能驱动3个从设备。
SPI协议本身并不复杂,但ESP-IDF提供的API确实需要花些时间熟悉。我刚开始使用时,最困惑的是三个核心结构体的分工:
- spi_bus_config_t:负责配置GPIO引脚复用
- spi_device_interface_config_t:定义设备通信协议
- spi_transaction_t:描述具体的数据传输
记得第一次调试时,我忘了设置CS信号的保持时间,导致FLASH芯片经常丢失最后一个字节的数据。后来在数据手册中发现,有些FLASH芯片需要CS信号在传输结束后保持几个时钟周期的低电平。
2. SPI控制器初始化实战
2.1 GPIO配置与总线初始化
配置SPI总线的第一步是确定引脚映射。ESP32的SPI2和SPI3有固定的GPIO映射,但也可以通过GPIO矩阵灵活配置。我建议优先使用默认的IOMUX引脚,因为它们能提供更好的信号完整性:
c复制const spi_bus_config_t buscfg = {
.mosi_io_num = GPIO_NUM_23, // SPI3默认MOSI
.miso_io_num = GPIO_NUM_19, // SPI3默认MISO
.sclk_io_num = GPIO_NUM_18, // SPI3默认SCLK
.quadwp_io_num = -1, // 不使用QSPI WP
.quadhd_io_num = -1, // 不使用QSPI HD
.max_transfer_sz = 4096 // 最大传输大小
};
初始化总线时,DMA通道的选择很关键。对于FLASH操作,我推荐使用DMA通道1:
c复制ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOS
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容