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

  1. SPI2_HOST 是SPI控制器标识符,根据总线配置和设备配置进行收发数据和DMA启动等, SPI1_HOST一般是不使用的,这个控制器一般用来内部flash使用
  2. 不管是spi_bus_config_t总线配置,还是spi_device_interface_config_t设备配置,都是在配置SPI控制器如何收发数据,拆分开成两个配置是为了通用性,总线是一组设备公用的配置,同一个总线上可以有多个设备,而设备配置是和具体设备紧密关联的配置比如片选信由那个GPIO发送
  3. 总线配置是物理层设定(线路怎么接); 设备配置是协议层设定(信号怎么发)