乐鑫技术交流
直播中

江左盟

8年用户 1327经验值
擅长:电源/新能源
私信 关注
[问答]

ESP32S2先初始化GPIO0再初始化SPI,GPIO0操作失效的原因?

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)

姜葳

2024-6-11 09:36:22
你好,大概率是因为你 SPI 的配置干扰到了 GPIO0。使用 idf 中 SPI 的 example,先初始化 GPIO0,再初始化 SPI 后是可以正常使用gpio_set_level 控制GPIO0 的。你可以检查一下代码的 SPI 配置在哪里占用了 GPIO0。
举报

张虎豹

2024-6-11 16:46:36
这个问题可能是由于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。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分