#include "spi.h" static const char *TAG = "SPI_2"; spi_device_handle_t lcd_spi; void spi_init() { ESP_LOGI(TAG, "配置GPIO"); // 1. 配置GPIO gpio_config_t io_conf = { .pin_bit_mask = (1ULL << LCD_DS), // LCD_DS .mode = GPIO_MODE_OUTPUT, // 输出模式 .pull_up_en = GPIO_PULLUP_DISABLE, // .pull_down_en = GPIO_PULLDOWN_DISABLE, // .intr_type = GPIO_INTR_DISABLE // 禁用中断 }; // 2. 应用配置 gpio_config(&io_conf); // 3. 设置初始电平 gpio_set_level(LCD_DS, 0); // 输出低电平 // 1. 配置 GPIO 驱动能力 (ESP32-C3 支持) gpio_set_drive_capability(VSPI_MISO, GPIO_DRIVE_CAP_3); // 最大驱动 gpio_set_drive_capability(VSPI_MOSI, GPIO_DRIVE_CAP_3); gpio_set_drive_capability(VSPI_SCLK, GPIO_DRIVE_CAP_3); ESP_LOGI(TAG, "配置GPIO完成"); ESP_LOGI(TAG,"初始化SPI IO总线"); esp_err_t ret; // 1. SPI 总线配置 spi_bus_config_t buscfg = { .miso_io_num = VSPI_MISO, // MISO 引脚 .mosi_io_num = VSPI_MOSI, // MOSI 引脚 .sclk_io_num = VSPI_SCLK, // 时钟引脚 .quadwp_io_num = -1, // 不使用 QWP .quadhd_io_num = -1, // 不使用 QHD .max_transfer_sz = 4096, // 最大传输大小 .flags = SPICOMMON_BUSFLAG_MASTER, }; // 2. 初始化 SPI 总线 ret = spi_bus_initialize(SPI2_HOST, &buscfg,SPI_DMA_CH_AUTO ); if (ret != ESP_OK) { ESP_LOGE(TAG, "SPI2 IO总线初始化失败"); return; } ESP_LOGI(TAG,"SPI IO总线初始化成功"); ESP_LOGI(TAG,"挂载设备片选IO"); spi_device_interface_config_t devcfg = { .mode = 0, // SPI 模式 0 .clock_speed_hz = 80000000, // .spics_io_num = LCD_CS, .queue_size = 7, // 队列深度 .flags = SPI_DEVICE_NO_DUMMY, // 禁用 dummy 周期 }; ret = spi_bus_add_device(SPI2_HOST, &devcfg, &lcd_spi); if (ret != ESP_OK) { ESP_LOGE(TAG, "挂载设备片选IO失败"); return; } } // SPI 写数据 esp_err_t lcd_spi_write8(uint8_t data) { spi_transaction_t trans = { .length = 8, // 数据位数 .tx_buffer = &data, // 发送缓冲区 .rx_buffer = NULL, // 不接收 }; return spi_device_transmit(lcd_spi, &trans); } // SPI 写数据 esp_err_t lcd_spi_write16(uint16_t data) { uint8_t tx_buf[2]; tx_buf[1] = data & 0xFF; tx_buf[0] = (data >> 8) & 0xFF; spi_transaction_t trans = { .length = 16, // 数据位数 .tx_buffer = tx_buf, // 发送缓冲区 .rx_buffer = NULL, // 不接收 }; return spi_device_transmit(lcd_spi, &trans); } // SPI 写命令 esp_err_t lcd_spi_reg(uint8_t data) { esp_err_t err; gpio_set_level(LCD_DS, 0); err=lcd_spi_write8(data); gpio_set_level(LCD_DS, 1); if (err != ESP_OK) { ESP_LOGE(TAG, "命令发送失败"); } return err; } void lcd_ds_test() { esp_err_t err; static uint8_t this_flag=0; if(this_flag) { this_flag=0; err=gpio_set_level(LCD_DS, 0); }else{ this_flag=1; err=gpio_set_level(LCD_DS, 1); } if (err != ESP_OK) { ESP_LOGE(TAG, "GPIO失败"); } }