spi使用步骤#
1.配置总线#
#include "driver/spi_master.h"
// 1. 配置总线参数
spi_bus_config_t buscfg = {
.mosi_io_num = 13, // MOSI 引脚
.miso_io_num = 12, // MISO 引脚
.sclk_io_num = 14, // SCLK 引脚
.quadwp_io_num = -1, // 未使用(保留 -1)
.quadhd_io_num = -1, // 未使用(保留 -1)
.max_transfer_sz = 4096 // 最大传输字节数
};
// 初始化 SPI 总线(如 SPI2_HOST)
ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO));
2.添加设备到总线#
spi_device_interface_config_t devcfg = {
.clock_speed_hz = 10 * 1000 * 1000, // 时钟频率 (10 MHz)
.mode = 0, // SPI 模式 0
.spics_io_num = 15, // 片选引脚 (CS)
.queue_size = 7, // 传输队列大小
};
spi_device_handle_t spi; // 设备句柄
ESP_ERROR_CHECK(spi_bus_add_device(SPI2_HOST, &devcfg, &spi));
3.传输数据#
uint8_t send_buf[4] = {0x01, 0x02, 0x03, 0x04};
uint8_t recv_buf[4] = {0}; // 接收缓冲区
spi_transaction_t t = {
.tx_buffer = send_buf, // 发送数据指针
.rx_buffer = recv_buf, // 接收数据指针
.length = 32, // 总位数 (4字节 * 8 = 32位)
};
// 执行传输(阻塞模式)
ESP_ERROR_CHECK(spi_device_transmit(spi, &t));
4.释放资源(不使用spi后)#
spi_bus_remove_device(spi); // 移除设备
spi_bus_free(SPI2_HOST); // 释放总线
理解SPI#
- SPI2_HOST 是SPI控制器标识符,根据总线配置和设备配置进行收发数据和DMA启动等, SPI1_HOST一般是不使用的,这个控制器一般用来内部flash使用
- 不管是
spi_bus_config_t
总线配置,还是spi_device_interface_config_t
设备配置,都是在配置SPI控制器如何收发数据,拆分开成两个配置是为了通用性,总线是一组设备公用的配置,同一个总线上可以有多个设备,而设备配置是和具体设备紧密关联的配置比如片选信由那个GPIO发送 - 总线配置是物理层设定(线路怎么接); 设备配置是协议层设定(信号怎么发)