[英]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.