首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用espidf在ESP32上使用DIO?

如何用espidf在ESP32上使用DIO?
EN

Stack Overflow用户
提问于 2022-09-22 16:18:20
回答 1查看 111关注 0票数 0

我试图在ESP32上使用带有espidf (版本4.4)的DIO模式。但我遇到了问题。

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

单模工作得很好(可以写和读)

双重模式会产生问题。

下面是我如何配置SPI总线(对于单模式或双模式的相同设置)

代码语言:javascript
复制
    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

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

代码语言:javascript
复制
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));

现在,为事务设置:

代码语言:javascript
复制
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_HALFDUPLEX中指定spi_device_interface_config_t标志,但没有帮助。

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

谢谢你抬头!

EN

回答 1

Stack Overflow用户

发布于 2022-10-07 11:20:38

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

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

代码语言:javascript
复制
  spi_device_interface_config_t devcfg = {
      .flags = SPI_DEVICE_HALFDUPLEX,
      ...
  };

根据我的经验,SPI_TRANS_MULTILINE_ADDR不起作用,至少在spi_device_transmit中是这样的。如果您的ram设备允许,尝试不使用“多行”地址和命令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73817857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档