#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 = 16, // 最大传输大小 .flags = 0, .intr_flags = 0, }; // 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 = 40000000, // .spics_io_num = LCD_CS, .queue_size = 7, // 队列深度 .flags = SPI_DEVICE_NO_DUMMY, // 禁用 dummy 周期 .input_delay_ns = 0, .pre_cb = NULL, .post_cb = NULL, }; ret = spi_bus_add_device(SPI2_HOST, &devcfg, &lcd_spi); if (ret != ESP_OK) { ESP_LOGE(TAG, "挂载设备片选IO失败"); return; } } // 高速数据传输函数 esp_err_t spi_transfer_fast(spi_device_handle_t spi, uint8_t *tx_data, uint8_t *rx_data, size_t len) { spi_transaction_t t = { .flags = 0, .cmd = 0, .addr = 0, .length = 8 * len, .tx_buffer = tx_data, .rx_buffer = rx_data, }; // 使用轮询传输(小数据量更快) return spi_device_polling_transmit(spi, &t); } // 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); return spi_transfer_fast(lcd_spi,&data,NULL,1); } // SPI 写数据 esp_err_t lcd_spi_write16(uint16_t data) { uint8_t tx_buf[2]; tx_buf[1] = data ; tx_buf[0] = (data >> 8) ; // spi_transaction_t trans = { // .length = 16, // 数据位数 // .tx_buffer = tx_buf, // 发送缓冲区 // .rx_buffer = NULL, // 不接收 // }; // return spi_device_transmit(lcd_spi, &trans); return spi_transfer_fast(lcd_spi,tx_buf,NULL,2); } // 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失败"); } }