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 测试逻辑:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)
最后
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!
851459088c6af944156ee24.jpg" alt=“img” style=“zoom: 67%;” />
最后
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!