簡體   English   中英

如何通過 espidf 在 ESP32 上使用 DIO SPI?

[英]How to use the DIO SPI on ESP32 with espidf?

我正在嘗試將 ESP32 上的 DIO SPI 模式與 espidf(版本 4.4)一起使用。 但是我遇到了問題。

我有一個 ram 設備(ref 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): 設置為多線模式和半雙工模式時不兼容

這是否意味着我不能在半雙工模式下使用 SPI 主庫的 DIO?

在我的設置中有什么我應該改變的嗎? 我試圖在 spi_device_interface_config_t 中指定 SPI_DEVICE_HALFDUPLEX 標志。 沒有幫助。

不幸的是,我沒有在 inte.net 上找到任何示例。

謝謝你的提醒!

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 設備允許,請嘗試不使用“多行”地址和命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM