我试图在ESP32上使用带有espidf (版本4.4)的DIO模式。但我遇到了问题。
我有一个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):设置为多行模式和半双工模式时不兼容
这是否意味着我不能在SPI主库中以半双工模式使用DIO?
在我的设置中有什么需要我改变的吗?我试图在SPI_DEVICE_HALFDUPLEX中指定spi_device_interface_config_t标志,但没有帮助。
不幸的是,我没有在互联网上找到任何例子。
谢谢你抬头!
发布于 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进行传输(多行)并同时使用它们(全双工)。
将设备设置为半双工以解决问题:
spi_device_interface_config_t devcfg = {
.flags = SPI_DEVICE_HALFDUPLEX,
...
};根据我的经验,SPI_TRANS_MULTILINE_ADDR不起作用,至少在spi_device_transmit中是这样的。如果您的ram设备允许,尝试不使用“多行”地址和命令。
https://stackoverflow.com/questions/73817857
复制相似问题