Skip to content
C
#include "spi2.h"

#include <stdio.h>

#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "esp_log.h"

static const char *TAG = "spi2";

static spi_device_handle_t spi;

// 初始化 SPI 总线
void spi_device_init(void) {
  spi_bus_config_t buscfg = {
      .miso_io_num = PIN_NUM_MISO,
      .mosi_io_num = PIN_NUM_MOSI,
      .sclk_io_num = PIN_NUM_CLK,
      .quadwp_io_num = -1,     // 不使用 Quad SPI
      .quadhd_io_num = -1,     // 不使用 Quad SPI
      .max_transfer_sz = 4096  // 最大传输字节数
  };

  // 初始化 SPI 总线
  esp_err_t ret = spi_bus_initialize(SPI2_HOST, &buscfg, 1);  // DMA 通道
  if (ret != ESP_OK) {
    ESP_LOGI(TAG, "Failed to initialize SPI bus");
  } else {
    ESP_LOGI(TAG, "SPI bus initialized successfully");
  }

  // 配置 SPI 设备并添加到总线上
  spi_device_interface_config_t devcfg = {
      .clock_speed_hz = 10 * 1000 * 1000,  // 时钟速度 10 MHz
      .mode = 0,                           // SPI 模式 0
      .spics_io_num = PIN_NUM_CS,          // CS 引脚
      .queue_size = 7,                     // 事务队列大小
      .flags = SPI_DEVICE_HALFDUPLEX,      // 半双工模式
  };

  // 将设备添加到总线上
  esp_err_t ret = spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
  if (ret != ESP_OK) {
    ESP_LOGE(TAG, "Failed to add device to SPI bus");
  } else {
    ESP_LOGI(TAG, "SPI device added successfully");
  }
}

// 发送并接收数据
void spi_transaction(spi_device_handle_t spi) {
  // 设置要发送的数据
  uint8_t tx_data[] = {0x9A, 0xBC, 0xDE, 0xF0};
  uint8_t rx_data[sizeof(tx_data)] = {0};

  spi_transaction_t trans = {
      .length = 8 * sizeof(tx_data),  // 数据位长度
      .tx_buffer = tx_data,           // 发送缓冲区
      .rx_buffer = rx_data,           // 接收缓冲区
  };

  // 执行 SPI 事务
  esp_err_t ret = spi_device_transmit(spi, &trans);
  //   esp_err_t ret = spi_device_polling_transmit(spi, &trans);
  if (ret == ESP_OK) {
    ESP_LOGI(TAG, "SPI transaction completed successfully");
    ESP_LOG_BUFFER_HEX("Received", rx_data, sizeof(rx_data));
  } else {
    ESP_LOGE(TAG, "SPI transaction failed");
  }
}

void spi_func_test(void) {
  spi_device_init();
  init_spi_device();
}

Released under the GPL License.