Files
2026-08-31 15:05:13 +08:00

79 lines
2.1 KiB
C++

#include "EPD_SPI.h"
static spi_device_handle_t spi_handle;
static const char *TAG = "EPD_SPI";
void EPD_SPI_Init(void) {
esp_err_t ret;
// GPIO Config for DC, RST, CS
gpio_config_t io_conf = {};
io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pin_bit_mask = (1ULL<<EPD_DC_PIN) | (1ULL<<EPD_RST_PIN) | (1ULL<<EPD_CS_PIN);
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
gpio_config(&io_conf);
// GPIO Config for BUSY
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pin_bit_mask = (1ULL<<EPD_BUSY_PIN);
io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
gpio_config(&io_conf);
EPD_W21_CS_1;
// SPI Bus Config
spi_bus_config_t buscfg = {};
buscfg.miso_io_num = -1;
buscfg.mosi_io_num = EPD_MOSI_PIN;
buscfg.sclk_io_num = EPD_SCK_PIN;
buscfg.quadwp_io_num = -1;
buscfg.quadhd_io_num = -1;
buscfg.max_transfer_sz = 32;
// SPI Device Config
spi_device_interface_config_t devcfg = {};
devcfg.clock_speed_hz = 10 * 1000 * 1000; // 10MHz
devcfg.mode = 0; // SPI mode 0
devcfg.spics_io_num = -1; // Use software CS pin
devcfg.queue_size = 7;
ret = spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to initialize SPI bus");
}
ret = spi_bus_add_device(SPI2_HOST, &devcfg, &spi_handle);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to add SPI device");
}
}
void SPI_Write(unsigned char value) {
spi_transaction_t t = {};
t.length = 8;
t.tx_buffer = &value;
spi_device_polling_transmit(spi_handle, &t);
}
void EPD_W21_WriteCMD(unsigned char command) {
EPD_W21_CS_0;
EPD_W21_DC_0;
SPI_Write(command);
EPD_W21_CS_1;
}
void EPD_W21_WriteDATA(unsigned char datas) {
EPD_W21_CS_0;
EPD_W21_DC_1;
SPI_Write(datas);
EPD_W21_CS_1;
}
unsigned char EPD_W21_ReadDATA(void) {
// Basic stub, typically not used for most writes.
// Software SPI for reading is complex and omitted for standard display usage.
return 0;
}