完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
ESP32-S2使用GPIO0与SPI时,如果先初始化GPIO0,再初始化SPI,使用gpio_set_level函数,GPIO0并没有输出。而先初始化SPI,再初始化GPIO0,使用gpio_set_level控制GPIO0有效
这样写GPIO0操作无效 gpio_reset_pin(GPIO_NUM_0); gpio_set_direction(GPIO_NUM_0, GPIO_MODE_OUTPUT); gpio_set_level(GPIO_NUM_0, 1); spi_device_handle_t spi; spi_bus_config_t bus_cfg = { .mosi_io_num = GPIO_NUM_37, .miso_io_num = GPIO_NUM_46, .sclk_io_num = GPIO_NUM_45, .max_transfer_sz = 100, }; spi_bus_initialize(SPI2_HOST, &bus_cfg, SPI_DMA_CH_AUTO); spi_device_interface_config_t dev_cfg = { .clock_speed_hz = 1 * 1000 * 1000, .command_bits = 0, .address_bits = 0, .dummy_bits = 0, .mode = 2, .spics_io_num = -1, .queue_size = 1, }; spi_bus_add_device(SPI2_HOST, &dev_cfg, &spi); while(1) { gpio_set_level(GPIO_NUM_0, 0); gpio_set_level(GPIO_NUM_0, 1); vTaskDelay(pdMS_TO_TICKS(100)); } 这样写GPIO0操作有效Code: Select all gpio_reset_pin(GPIO_NUM_0); gpio_set_direction(GPIO_NUM_0, GPIO_MODE_OUTPUT); gpio_set_level(GPIO_NUM_0, 1); spi_device_handle_t spi; spi_bus_config_t bus_cfg = { .mosi_io_num = GPIO_NUM_37, .miso_io_num = GPIO_NUM_46, .sclk_io_num = GPIO_NUM_45, .max_transfer_sz = 100, }; spi_bus_initialize(SPI2_HOST, &bus_cfg, SPI_DMA_CH_AUTO); spi_device_interface_config_t dev_cfg = { .clock_speed_hz = 1 * 1000 * 1000, .command_bits = 0, .address_bits = 0, .dummy_bits = 0, .mode = 2, .spics_io_num = -1, .queue_size = 1, }; spi_bus_add_device(SPI2_HOST, &dev_cfg, &spi); while(1) { gpio_set_level(GPIO_NUM_0, 0); gpio_set_level(GPIO_NUM_0, 1); vTaskDelay(pdMS_TO_TICKS(100)); } 请问这是什么原因 |
|
相关推荐
2个回答
|
|
|
你好,大概率是因为你 SPI 的配置干扰到了 GPIO0。使用 idf 中 SPI 的 example,先初始化 GPIO0,再初始化 SPI 后是可以正常使用gpio_set_level 控制GPIO0 的。你可以检查一下代码的 SPI 配置在哪里占用了 GPIO0。
|
|
|
|
|
|
这个问题可能是由于GPIO0与SPI共享引脚导致的。在ESP32-S2中,GPIO0与SPI1的CS0引脚共享。当您先初始化GPIO0,然后初始化SPI时,SPI初始化可能会覆盖GPIO0的配置,导致GPIO0的操作失效。
为了解决这个问题,您可以尝试以下步骤: 1. 确保您使用的SPI配置不与GPIO0冲突。检查您的spi_bus_config_t结构体中的引脚配置,确保它们不与GPIO0共享。 2. 在初始化GPIO0之前,先初始化SPI。这样可以确保GPIO0的配置不会被SPI初始化覆盖。 3. 如果您需要在SPI和GPIO0之间切换,可以考虑使用gpio_matrix_out()函数将GPIO0映射到另一个不与SPI共享的引脚。这样,您可以在不干扰SPI通信的情况下控制GPIO0。 4. 在初始化SPI之前,使用gpio_hold_dis()函数释放GPIO0的控制权。这可以确保SPI初始化不会影响GPIO0的配置。 5. 在初始化SPI之后,使用gpio_hold_en()函数重新获取GPIO0的控制权。这样,您可以在SPI通信完成后继续使用GPIO0。 以下是一个示例代码: ```c #include "driver/gpio.h" #include "driver/spi_master.h" void app_main() { // 初始化GPIO0 gpio_reset_pin(GPIO_NUM_0); gpio_set_direction(GPIO_NUM_0, GPIO_MODE_OUTPUT); gpio_set_level(GPIO_NUM_0, 1); // 释放GPIO0的控制权 gpio_hold_dis(GPIO_NUM_0); // 初始化SPI spi_bus_config_t bus_cfg = { .mosi_io_num = GPIO_NUM_37, // ... 其他配置 }; spi_device_handle_t spi; spi_bus_initialize(HSPI_HOST, &bus_cfg, 1); // 重新获取GPIO0的控制权 gpio_hold_en(GPIO_NUM_0); // 使用SPI进行通信 // ... // 完成SPI通信后,继续使用GPIO0 gpio_set_level(GPIO_NUM_0, 0); } ``` 通过以上步骤,您应该可以在初始化SPI之后继续使用GPIO0。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
944 浏览 0 评论
1671 浏览 0 评论
请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
1330 浏览 1 评论
1233 浏览 1 评论
5015 浏览 2 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
1252浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
927浏览 3评论
2336浏览 3评论
ESP-IDF的VScode插件的build按钮点击会报错的原因?
2526浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
1051浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 02:23 , Processed in 0.655192 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
445
