乐鑫技术交流
直播中

杨福林

7年用户 1424经验值
私信 关注
[问答]

ESP32S3为什么无法使用GPIO32/31/30初始化SPI2总线?

芯片型号为ESP32S3FN,我使用了SPICLK(GPIO30)、SPIQ(GPIO31)、SPID(GPIO32)等IO连接了一个1GBit WINBOND NAND FLASH,当我调用spi_bus_initialize()初始化SPI2总线时,程序卡死了,我的初始化设置如下:
    spi_bus_config_t cfg_bus = {0};
    cfg_bus.mosi_io_num = 32;
    cfg_bus.miso_io_num = 31;
    cfg_bus.sclk_io_num = 30;
    cfg_bus.quadwp_io_num = -1;
    cfg_bus.quadhd_io_num = -1;
    cfg_bus.data3_io_num = -1;
    cfg_bus.data4_io_num = -1;
    cfg_bus.data5_io_num = -1;
    cfg_bus.data6_io_num = -1;
    cfg_bus.data7_io_num = -1;
    cfg_bus.max_transfer_sz = 64;
    cfg_bus.flags = SPICOMMON_BUSFLAG_MASTER|SPICOMMON_BUSFLAG_SCLK|SPICOMMON_BUSFLAG_MISO|SPICOMMON_BUSFLAG_MOSI|SPICOMMON_BUSFLAG_GPIO_PINS;
    cfg_bus.intr_flags = 0;
    if(ESP_OK != spi_bus_initialize(SPI2_HOST, &cfg_bus, SPI_DMA_CH_AUTO))
    {
        printf("spi bus init failed!rn");
        return -1;
    }
以上代码将不会返回并打印信息。然后我尝试使用SPI1总线,但是提示我总线已经初始化。
所以我推测是SPI1总线已经占用了以上IO,导致SPI2无法使用这几个IO初始化,这样的猜想是否正确?

之后我尝试跳过spi_bus_initialize()并使用spi_bus_add_device()在SPI1总线挂载SPI Device,初始化配置如下:
    spi_device_interface_config_t cfg_dev = {0};
    cfg_dev.command_bits = 0;
    cfg_dev.address_bits = 0;
    cfg_dev.dummy_bits = 0;
    cfg_dev.mode = 0;
    cfg_dev.duty_cycle_pos = 128;
    cfg_dev.cs_ena_pretrans = 3;
    cfg_dev.cs_ena_posttrans = 3;
    cfg_dev.clock_speed_hz = SPI_MASTER_FREQ_10M;
    cfg_dev.input_delay_ns = 0;
    cfg_dev.spics_io_num = 26;
    cfg_dev.flags = SPI_DEVICE_NO_DUMMY;
    cfg_dev.queue_size = 7;
    cfg_dev.pre_cb = NULL;
    cfg_dev.post_cb = NULL;
    if(ESP_OK != spi_bus_add_device(SPI1_HOST, &cfg_dev, &handle->hspi))
    {
        printf("spi dev add failed!rn");
        return -1;
    }
以上代码打印信息为 invalid host。
之后我了解到同一个总线上不能同时挂载flash和device,所以我推测是SPI1总线已经有了flash(内部)被挂载,所以造成无法挂载SPI Device?

然后我尝试使用spi_bus_add_flash_device()在SPI1总线上挂载flash,配置如下:
    esp_flash_spi_device_config_t cfg_fdev = {0};
    cfg_fdev.host_id = SPI1_HOST;
    cfg_fdev.cs_io_num = 26;
    cfg_fdev.io_mode = SPI_FLASH_DIO;
    cfg_fdev.speed = ESP_FLASH_10MHZ;
    cfg_fdev.input_delay_ns = 0;
    cfg_fdev.cs_id = 1;
    cfg_fdev.freq_mhz = ESP_FLASH_80MHZ;
    if(ESP_OK != spi_bus_add_flash_device(&hfspi, &cfg_fdev))
    {
        printf("spi flash add failed!rn");
        return -1;
    }

    if(ESP_OK != esp_flash_init(hfspi))
    {
        printf("spi flash init failed!rn");
        return -1;
    }
以上代码会返回:
I (10602) spi_flash: detected chip: generic
W (10602) spi_flash: Detected flash size > 16 MB, but access beyond 16 MB is not supported for this flash model yet.
I (10612) spi_flash: flash io: dio
之后我了解到ESP32并不支持NAND FLASH,这样的信息是否表示SPI FLASH驱动已经正确运行并检测到了NAND FLASH?

所以根据以上测试,是否说明,SPICLK(GPIO30)、SPIQ(GPIO31)、SPID(GPIO32)这三个IO并不适合连接NAND FLASH,如果要连接NAND FLASH,应该使用其他IO并使用SPI2/3总线,这样的结论是否正确?是否有其他办法在SPI1总线上使用NAND FLASH?
                    

回帖(1)

手托初梦

2024-6-12 16:34:30
根据ESP32-S3的技术手册,这些GPIO可能不适用于SPI2总线。以下是一些可能的原因:

1. GPIO分配冲突:ESP32-S3的某些GPIO已经被分配给其他功能,例如UART、I2C、ADC等。在这种情况下,您需要选择其他可用的GPIO进行SPI总线配置。

2. 芯片型号限制:不同的ESP32-S3芯片型号可能具有不同的GPIO配置。您提到的ESP32S3FN型号可能在GPIO32、GPIO31和GPIO30上存在限制,导致无法使用这些GPIO初始化SPI2总线。

3. 配置错误:在您的代码中,您可能没有正确配置spi_bus_config_t结构体。例如,您可能需要设置其他参数,如max_transfer_sz、flags等。

为了解决这个问题,您可以尝试以下步骤:

1. 查阅ESP32-S3的技术手册,了解不同GPIO在不同SPI总线上的可用性。

2. 尝试使用其他可用的GPIO进行SPI2总线的配置。例如,您可以尝试使用GPIO34、GPIO35和GPIO33进行SPI2总线的配置。

3. 确保您的spi_bus_config_t结构体中的所有参数都已正确设置。例如,您可以设置max_transfer_sz为适当的值,以确保SPI传输不会超出预期的缓冲区大小。


举报

更多回帖

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