文档参考
- ESP32 SDIO AT Guide
- SDIO 硬件接线说明
硬件准备
- 两个 ESP32-DevKit 开发板
10 KHz
电阻- 长度低于
10cm
的杜邦线
管脚 | ESP32 SDIO Host | ESP32 SDIO Slave |
---|---|---|
CLK | 14 | 14 |
CMD | 15 | 15 |
DAT0 | 2 | 2 |
DAT1 | 4 | 4 |
DAT2 | 12 | 12 |
DAT3 | 13 | 13 |
GND | GND | GND |
1-bit SD
模式(默认
): 连接CLK, CMD,DAT0,DAT1
管脚以及GND
4-bit SD
模式: 连接上述全部管脚以及 GND- 无论
1-bit
模式还是4-bit
SD 模式, SDIO slave 的 CMD 和D0-D3
都应该连接一个10K
的上拉电阻,另外需要将VDD_SPI
电压的efuse
烧写为3.3v
,具体注意事项请参考 SD Pullup Requirements
SDIO Slave 准备
使用一个 ESP32-DevKit 开发板作为 SDIO Slave 设备,当使用 SDIO 4 bit
模式时:
- 将 SDIO Slave 设备的 SPI Flash 电压设置为 3.3V
espefuse.py -p COM4 set_flash_voltage 3.3V
-
将 SDIO Slave 的 GPIO2、GPIO4、GPIO12、GPIO13、GPIO15 都用
10KHz
电阻上拉到3V3
管脚 -
将 SDIO Slave 设备下载
esp-at SDIO
的 AT 固件,需要自行编译 esp-at SDK ,将指令传输方式改为 SDIO 的设置即可,如下:
-
注意:
SDIO Slave
要晚于
SDIO Master 上电。
SDIO Host 准备
- 将 SDIO Host 设备下载 esp-at/examples/at_sdio_host/ESP32 例程
- 默认 SDIO 时钟设置为 20MHz ,因 SDIO 通信对硬件要求较高,当使用杜邦线建立 SDIO 连接时,建议将 SDIO 时钟调低,可设置为 10MHz 进行测试。
硬件连接
- 将两个开发板的 SDIO 管脚一一对应连接
- 将开发板上预留的两个 GND 管脚全部连接
测试结果如下
SDIO 通信跑通之后,可以修改 SDIO Host 端的代码,增加 AT 指令传输进行 SDIO AT 的测试。例如修改默认 esp-at/examples/at_sdio_host/ESP32 的代码中的 sdio_task() 任务,增加 AT+GMR 指令测试,如下:
static void sdio_task(void* pvParameters)
{
sdio_err_t err;
int at_uart_len;
printf("Start SDIO test\r\n");
slave_power_on();
// Make sure SDIO slave has been inited
vTaskDelay(1000 / portTICK_PERIOD_MS);
SDIO_LOGI(TAG, "host ready, start initializing slave...");
err = sdio_init();
assert(err == ESP_OK);
//Create the semaphore.
rdySem = xSemaphoreCreateBinary();
uart_driver_install(0, 2048, 8192, 10, &esp_at_uart_queue, 0);
xTaskCreate(uart_task, "uTask", 2048, NULL, 4, NULL);
xTaskCreate(sdio_recv_task, "sdioRecvTask", 2048, NULL, 6, NULL);
// Create a buffer for AT+GMR command
const char* at_gmr_cmd = "AT+GMR\r\n";
size_t at_gmr_len = strlen(at_gmr_cmd);
while (1) {
// wait send state flag
xSemaphoreTake(rdySem, portMAX_DELAY);
// Write AT+GMR command to the buffer
memcpy(send_buffer, at_gmr_cmd, at_gmr_len);
// Read data from UART
at_uart_len = uart_read_bytes(0, (uint8_t*) send_buffer + at_gmr_len, WRITE_BUFFER_LEN - at_gmr_len, 0);
SDIO_LOGD(TAG, "Receive UART len:%d, data:%s", at_uart_len, send_buffer);
vTaskDelay(100);
// Send AT+GMR command
err = sdio_host_send_packet(send_buffer, at_gmr_len);
vTaskDelay(100);
// Send timeout
if (err == ERR_TIMEOUT) {
SDIO_LOGW(TAG, "send timeout");
}
memset(send_buffer, '\0', sizeof(send_buffer));
}
vTaskDelete(NULL);
}
测试结果如下:
AT-SDIO 测试逻辑:
- SDIO Host 发完指令后 ,ESP32 SDIO Slave 接收 AT 指令并触发响应。然后 SDIO Host 把触发的 AT 响应读出来,最后转到 UART0 上打印。
如何提升 SDIO-AT 转 WiFi TCP 的传输速率?
- 硬件上使用 SDIO 4bit 模式
- 增大 SDIO CLK
- 增大 SDIO 数据通信传输 Buffer
- 增大 SDIO 通信任务缓冲 Buffer
- 做一些性能优化,参考:
- 如何提高 ESP-AT 吞吐性能
- 如何提高 Wi-Fi 性能
- AT 固件默认开启了 modem sleep 模式,可以使用
AT+SLEEP=0
指令来关闭睡眠模式