@felmue Thank you for the pointer! Looks like perhaps it's fixed for the Arduino implementation? It does not seem fixed for the ESP-IDF version quite yet. Your workaround combined with the pre_cb and post_cb callbacks worked! Here's a snippet/summary of what I did:

#ifdef CONFIG_M5CORES3_SPI_CONFLICT_FIX #define M5CORES3_SPI_CONFIG_FIX_MISO_PIN 35 void sx127x_spi_pre_transfer_m5cores3_fix_callback(spi_transaction_t* t) { // before a SPI transaction is started, we need to change the driving direction // of the DC pin in the CoreS3 (the CoreS3 uses the MISO pin as the DC pin and // configures it as an output ping which conflicts with other SPI devices on the bus) // set gpio direction for MISO pin to input gpio_set_direction(M5CORES3_SPI_CONFIG_FIX_MISO_PIN, GPIO_MODE_INPUT); } void sx127x_spi_post_transfer_m5cores3_fix_callback(spi_transaction_t* t) { // undo pin direction change after SPI transaction is done // set gpio direction for MISO pin back to output gpio_set_direction(M5CORES3_SPI_CONFIG_FIX_MISO_PIN, GPIO_MODE_OUTPUT); } #endif sx127x_handle_t sx127x_init(const sx127x_modem_config_t* modem_config) { // ... // Configure SPI device spi_device_interface_config_t spi_dev_cfg = { .clock_speed_hz = 9000000, // 9MHz .mode = 0, .spics_io_num = modem_config->cs_gpio, .queue_size = 7, .flags = 0, #ifdef CONFIG_M5CORES3_SPI_CONFLICT_FIX .pre_cb = sx127x_spi_pre_transfer_m5cores3_fix_callback, .post_cb = sx127x_spi_post_transfer_m5cores3_fix_callback #endif }; ret = spi_bus_add_device(spi_host, &spi_dev_cfg, &device->spi); if (ret != ESP_OK) { ESP_LOGE(TAG, "Failed to add SPI device"); vSemaphoreDelete(device->spi_mutex); free(device); return NULL; } // ... }

I can now use both the display and the sx1276 at the same time on the M5Stack CoreS3.

Thanks again for your assistance!