This commit is contained in:
2026-03-17 20:59:27 +08:00
parent 49d615f63a
commit 3e405f1f29
8 changed files with 210 additions and 54 deletions
+2 -2
View File
@@ -3,8 +3,8 @@
"idf.openOcdConfigs": [
"board/esp32s3-builtin.cfg"
],
"idf.portWin": "COM10",
"idf.currentSetup": "C:\\Users\\wuwen\\esp\\v5.5.1\\esp-idf",
"idf.portWin": "COM9",
"idf.currentSetup": "C:\\Users\\wuwen\\esp\\v5.5.2\\esp-idf",
"idf.customExtraVars": {
"OPENOCD_SCRIPTS": "C:\\Espressif\\tools\\openocd-esp32\\v0.11.0-esp32-20220411/openocd-esp32/share/openocd/scripts",
"IDF_CCACHE_ENABLE": "1",
+26 -48
View File
@@ -1,53 +1,31 @@
| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-H21 | ESP32-H4 | ESP32-P4 | ESP32-S2 | ESP32-S3 | Linux |
| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | --------- | -------- | -------- | -------- | -------- | ----- |
# 工程备注
# Hello World Example
## SPI 接口配置
Starts a FreeRTOS task to print "Hello World".
### 1. 核心 IO 引脚
| 引脚名称 | 引脚编号 |
|----------|----------|
| SCK | 36 |
| MOSI | 33 |
| MISO | 47 |
(See the README.md file in the upper level 'examples' directory for more information about examples.)
### 2. 外接设备引脚(SPI 从设备)
#### 2.1 E-Paper(电子纸)
| 引脚名称 | 引脚编号 |
|----------|----------|
| DC | 35 |
| SC | 34 |
| BUSY | 37 |
## How to use example
#### 2.2 Lora 模块
| 引脚名称 | 引脚编号 |
|----------|----------|
| CS | 3 |
| BUSY | 6 |
| RST | 4 |
| INT | 5 |
Follow detailed instructions provided specifically for this example.
Select the instructions depending on Espressif chip installed on your development board:
- [ESP32 Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/stable/get-started/index.html)
- [ESP32-S2 Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/get-started/index.html)
## Example folder contents
The project **hello_world** contains one source file in C language [hello_world_main.c](main/hello_world_main.c). The file is located in folder [main](main).
ESP-IDF projects are built using CMake. The project build configuration is contained in `CMakeLists.txt` files that provide set of directives and instructions describing the project's source files and targets (executable, library, or both).
Below is short explanation of remaining files in the project folder.
```
├── CMakeLists.txt
├── pytest_hello_world.py Python script used for automated testing
├── main
│ ├── CMakeLists.txt
│ └── hello_world_main.c
└── README.md This is the file you are currently reading
```
For more information on structure and contents of ESP-IDF projects, please refer to Section [Build System](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html) of the ESP-IDF Programming Guide.
## Troubleshooting
* Program upload failure
* Hardware connection is not correct: run `idf.py -p PORT monitor`, and reboot your board to see if there are any output logs.
* The baud rate for downloading is too high: lower your baud rate in the `menuconfig` menu, and try again.
## Technical support and feedback
Please use the following feedback channels:
* For technical queries, go to the [esp32.com](https://esp32.com/) forum
* For a feature request or bug report, create a [GitHub issue](https://github.com/espressif/esp-idf/issues)
We will get back to you as soon as possible.
#### 2.3 SD-CardSD 卡)
| 引脚名称 | 引脚编号 |
|----------|----------|
| CS | 48 |
+35
View File
@@ -0,0 +1,35 @@
#include "epaper.h"
static const char *TAG = "E-PAPER";
void epd_gpio_init(void)
{
// 1. 配置CS/DC为输出模式
gpio_config_t io_conf = {0};
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pin_bit_mask = (1ULL << EPD_CS_PIN) | (1ULL << EPD_DC_PIN);
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
io_conf.intr_type = GPIO_INTR_DISABLE;
gpio_config(&io_conf);
// 2. 配置BUSY为输入模式(上拉,防止电平飘移)
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pin_bit_mask = (1ULL << EPD_BUSY_PIN);
io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
gpio_config(&io_conf);
// 3. 初始化引脚默认电平
gpio_set_level(EPD_CS_PIN, 1); // CS默认拉高(未选中)
gpio_set_level(EPD_DC_PIN, 0); // DC默认拉低(指令模式)
ESP_LOGI(TAG, "EPD GPIO init success (CS:%d, DC:%d)",
EPD_CS_PIN, EPD_DC_PIN);
}
void epd_init()
{
ESP_LOGI(TAG, "init_GPIO");
epd_gpio_init();
}
+20
View File
@@ -0,0 +1,20 @@
#ifndef EPAPER_H
#define EPAPER_H
#include <stdio.h>
#include <inttypes.h>
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_system.h"
#include "spi.h"
#define EPD_CS_PIN 34
#define EPD_DC_PIN 35
#define EPD_BUSY_PIN 37
void epd_init();
#endif
+5 -1
View File
@@ -18,7 +18,8 @@
#include "esp_timer.h"
#include "spiffs.h"
#include "spi.h"
#include "epaper.h"
static const char *TAG = "SYS";
@@ -66,6 +67,9 @@ void app_main(void)
ESP_LOGI(TAG,"PSRAM 总大小:%u KB,可用:%u KB\n", psram_total/1024, psram_free/1024);
spi_init();
epd_init();
// 1. 初始化 SPIFFS
const char *spiffs_base_path = "/spiffs";
+97
View File
@@ -0,0 +1,97 @@
#include "spi.h"
#define USE_SPI_HOST SPI2_HOST
static const char *TAG = "SPI_2";
spi_device_handle_t spi2;
void spi_init()
{
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 = 0,
// .intr_flags = 0,
};
// 2. 初始化 SPI 总线
ret = spi_bus_initialize(USE_SPI_HOST, &buscfg, SPI_DMA_DISABLED);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "IO总线初始化失败");
return;
}
ESP_LOGI(TAG, "SPI IO总线初始化成功");
ESP_LOGI(TAG, "SPI 设备配置");
spi_device_interface_config_t devcfg = {
.command_bits = 0, // 无命令位
.address_bits = 0, // 无地址位
.dummy_bits = 0,
.mode = 0, // SPI 模式 0
.clock_speed_hz = 80000000, //
.spics_io_num = -1,
.queue_size = 1, // 队列深度,因为有几个设备共用了这个SPI,而有的设备有busy信号,准备整个专门的线程去控制如果有busy信号先跳过这次传输
.flags = SPI_DEVICE_NO_DUMMY, // 禁用 dummy 周期
.input_delay_ns = 0,
.pre_cb = NULL,
.post_cb = NULL,
};
ret = spi_bus_add_device(USE_SPI_HOST, &devcfg, &spi2);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "SPI 设备配置失败");
return;
}
}
/**
* @brief 同步SPI全双工传输函数(无队列,直接硬件收发)
* @param tx_data: 待发送数据缓冲区(NULL则仅接收)
* @param rx_data: 接收数据缓冲区(NULL则仅发送)
* @param len: 传输长度(字节数,收发长度一致)
* @return esp_err_t: 传输结果
* @note 全双工模式下,发送和接收同时进行,len需匹配收发数据长度
*/
esp_err_t epd_spi_send_sync_fullduplex(const uint8_t *tx_data, uint8_t *rx_data, size_t len)
{
// 入参校验:长度为0 或 收发缓冲区同时为NULL
if (len == 0 || (tx_data == NULL && rx_data == NULL)) {
ESP_LOGE(TAG, "Invalid args: len=%d, tx=%p, rx=%p", len, tx_data, rx_data);
return ESP_ERR_INVALID_ARG;
}
// 1. 初始化SPI传输结构体(全双工配置核心)
spi_transaction_t t = {
.length = len * 8, // 传输位数(1字节=8位,收发长度一致)
.tx_buffer = tx_data, // 发送缓冲区(NULL则发送0x00
.rx_buffer = rx_data, // 接收缓冲区(NULL则丢弃接收数据)
.flags = SPI_TRANS_USE_TXDATA | SPI_TRANS_USE_RXDATA, // 强制使用本地缓冲区
// 全双工关键:无需额外flag,只要同时配置tx/rx_buffer即启用全双工
};
// 2. 同步传输(无队列,阻塞等待硬件完成)
esp_err_t ret = spi_device_transmit(spi2, &t);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "SPI full duplex transmit failed: %s", esp_err_to_name(ret));
} else {
ESP_LOGD(TAG, "SPI full duplex transmit success, len=%d", len);
}
return ret;
}
+22
View File
@@ -0,0 +1,22 @@
#ifndef SPI_H
#define SPI_H
#include <stdio.h>
#include <inttypes.h>
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "esp_log.h"
#include "esp_system.h"
#define VSPI_MISO 47
#define VSPI_MOSI 33
#define VSPI_SCLK 36
void spi_init();
extern spi_device_handle_t spi2;
#endif /* SPI_H */
+3 -3
View File
@@ -1,6 +1,6 @@
#
# Automatically generated file. DO NOT EDIT.
# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration
# Espressif IoT Development Framework (ESP-IDF) 5.5.2 Project Configuration
#
CONFIG_SOC_ADC_SUPPORTED=y
CONFIG_SOC_UART_SUPPORTED=y
@@ -124,7 +124,6 @@ CONFIG_SOC_GPIO_OUT_RANGE_MAX=48
CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000
CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y
CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3
CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y
CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8
CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8
CONFIG_SOC_DEDIC_GPIO_OUT_AUTO_ENABLE=y
@@ -185,7 +184,7 @@ CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8
CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48
CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y
CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y
CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y
CONFIG_SOC_RMT_SUPPORT_ASYNC_STOP=y
CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y
CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y
CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y
@@ -856,6 +855,7 @@ CONFIG_SPIRAM_BOOT_HW_INIT=y
CONFIG_SPIRAM_BOOT_INIT=y
CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION=y
# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set
# CONFIG_SPIRAM_USE_MEMMAP is not set
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
CONFIG_SPIRAM_USE_MALLOC=y
CONFIG_SPIRAM_MEMTEST=y