【问题标题】:How to use the DIO SPI on ESP32 with espidf?如何在 ESP32 上使用 DIO SPI 和 esp idf?
【发布时间】:2022-10-07 20:01:59
【问题描述】:

我正在尝试将 ESP32 上的 DIO SPI 模式与 espidf(4.4 版)一起使用。 但是我遇到了问题。

我有一个 ram 设备(参考 23LC1024),可以通过多种模式(单、双、四)访问。

单一模式完美运行(可以写和回读)

双模式会产生问题。

这是我配置 SPI 总线的方式(单模式或双模式的设置相同)

    memset(&config, 0, sizeof(spi_bus_config_t));
    config.mosi_io_num = MOSI_PIN;
    config.miso_io_num = MISO_PIN;
    config.sclk_io_num = SCLK_PIN;
    config.quadwp_io_num = -1; // -1 not used
    config.quadhd_io_num = -1; // -1 not used
    config.flags = SPICOMMON_BUSFLAG_DUAL | SPICOMMON_BUSFLAG_MASTER;
    spi_bus_initialize(VSPI_HOST, &config, SPI_DMA_DISABLED); // 0 DMA not used

现在设备的设置(单模或双模的设置相同):

spi_device_interface_config_t devcfg = {
            .clock_speed_hz = freq,
            .command_bits = 8,  
            .address_bits = 24, 
            .dummy_bits = 8,    
            .mode = 0,          // SPI MODE 0
            .flags = 0,         
            .spics_io_num = _cs,
            .queue_size = 1, 
            .pre_cb = NULL,  
            .post_cb = NULL};
        ESP_ERROR_CHECK(spi_bus_add_device(VSPI_HOST, &devcfg, &data_Ram));

现在交易的设置:

spi_transaction_t t;
    memset(&t, 0, sizeof(t)); // Zero out the transaction
    t.cmd = WRITE;
    t.tx_buffer = data;
    t.rx_buffer = NULL;
    t.addr = address;
    t.length = size * 8;
    if (USE_DIO)     // configure these flags in case of DIO
        t.flags = SPI_TRANS_MODE_DIO | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MULTILINE_CMD;

    ESP_ERROR_CHECK(spi_device_transmit(data_Ram, &t)); // Transmit!

它在单模式下运行良好,但在双模式下我得到了错误:

E (1618) spi_master: check_trans_valid(699): 设置为多线模式和半双工模式时不兼容

这是否意味着我不能在半双工模式下将 DIO 与 SPI 主库一起使用?

我的设置有什么我应该改变的吗? 我试图在 spi_device_interface_config_t 中指定 SPI_DEVICE_HALFDUPLEX 标志。没有帮助。

不幸的是,我在互联网上没有找到任何示例。

谢谢你的提醒!

【问题讨论】:

    标签: esp32 spi esp-idf


    【解决方案1】:

    E (1618) spi_master: check_trans_valid(699): Incompatible when setting to both multi-line mode and half duplex mode 表示您不能使用 MISO 和 MOSI 进行传输(多行)并同时使用它们(全双工)。

    将您的设备设置为半双工以解决问题:

      spi_device_interface_config_t devcfg = {
          .flags = SPI_DEVICE_HALFDUPLEX,
          ...
      };
    
    

    以我的经验,SPI_TRANS_MULTILINE_ADDR 不起作用,至少对于spi_device_transmit。 如果您的 ram 设备允许,请尝试不使用“多行”地址和命令。

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 2022-06-11
      • 2021-05-25
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多