完善资料让更多小伙伴认识你,还能领取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。 |
|
|
|
只有小组成员才能发言,加入小组>>
545浏览 6评论
457浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
437浏览 5评论
441浏览 4评论
411浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:54 , Processed in 0.886735 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号