diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 02de0938..8cdade93 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -604,16 +604,25 @@ config RECEIVE_CUSTOM_MESSAGE help Enable custom message reception, allow the device to receive custom messages from the server (preferably through the MQTT protocol) -choice I2S_TYPE_TAIJIPI_S3 +menu TAIJIPAI_S3_CONFIG depends on BOARD_TYPE_ESP32S3_Taiji_Pi - prompt "taiji-pi-S3 I2S Type" - default TAIJIPAI_I2S_TYPE_STD + choice I2S_TYPE_TAIJIPI_S3 + depends on BOARD_TYPE_ESP32S3_Taiji_Pi + prompt "taiji-pi-S3 I2S Type" + default TAIJIPAI_I2S_TYPE_STD + help + I2S 类型选择 + config TAIJIPAI_I2S_TYPE_STD + bool "I2S Type STD" + config TAIJIPAI_I2S_TYPE_PDM + bool "I2S Type PDM" + endchoice + + config I2S_USE_2SLOT + bool "Enable Use 2 Slot" + default n help - I2S Type - config TAIJIPAI_I2S_TYPE_STD - bool "I2S Type STD" - config TAIJIPAI_I2S_TYPE_PDM - bool "I2S Type PDM" -endchoice + 启动双声道 +endmenu endmenu diff --git a/main/audio/codecs/no_audio_codec.cc b/main/audio/codecs/no_audio_codec.cc index 92fe3be3..c6f0ed4b 100644 --- a/main/audio/codecs/no_audio_codec.cc +++ b/main/audio/codecs/no_audio_codec.cc @@ -214,6 +214,84 @@ NoAudioCodecSimplex::NoAudioCodecSimplex(int input_sample_rate, int output_sampl ESP_LOGI(TAG, "Simplex channels created"); } +NoAudioCodecSimplexPdm::NoAudioCodecSimplexPdm(int input_sample_rate, int output_sample_rate, gpio_num_t spk_bclk, gpio_num_t spk_ws, gpio_num_t spk_dout, i2s_std_slot_mask_t spk_slot_mask,gpio_num_t mic_sck, gpio_num_t mic_din) { + duplex_ = false; + input_sample_rate_ = input_sample_rate; + output_sample_rate_ = output_sample_rate; + + // Create a new channel for speaker + i2s_chan_config_t tx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG((i2s_port_t)1, I2S_ROLE_MASTER); + tx_chan_cfg.dma_desc_num = AUDIO_CODEC_DMA_DESC_NUM; + tx_chan_cfg.dma_frame_num = AUDIO_CODEC_DMA_FRAME_NUM; + tx_chan_cfg.auto_clear_after_cb = true; + tx_chan_cfg.auto_clear_before_cb = false; + tx_chan_cfg.intr_priority = 0; + ESP_ERROR_CHECK(i2s_new_channel(&tx_chan_cfg, &tx_handle_, NULL)); + + + i2s_std_config_t tx_std_cfg = { + .clk_cfg = { + .sample_rate_hz = (uint32_t)output_sample_rate_, + .clk_src = I2S_CLK_SRC_DEFAULT, + .mclk_multiple = I2S_MCLK_MULTIPLE_256, + #ifdef I2S_HW_VERSION_2 + .ext_clk_freq_hz = 0, + #endif + + }, + .slot_cfg = { + .data_bit_width = I2S_DATA_BIT_WIDTH_32BIT, + .slot_bit_width = I2S_SLOT_BIT_WIDTH_AUTO, + .slot_mode = I2S_SLOT_MODE_MONO, + .slot_mask = spk_slot_mask, + .ws_width = I2S_DATA_BIT_WIDTH_32BIT, + .ws_pol = false, + .bit_shift = true, + #ifdef I2S_HW_VERSION_2 + .left_align = true, + .big_endian = false, + .bit_order_lsb = false + #endif + + }, + .gpio_cfg = { + .mclk = I2S_GPIO_UNUSED, + .bclk = spk_bclk, + .ws = spk_ws, + .dout = spk_dout, + .din = I2S_GPIO_UNUSED, + .invert_flags = { + .mclk_inv = false, + .bclk_inv = false, + .ws_inv = false, + }, + }, + }; + ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle_, &tx_std_cfg)); +#if SOC_I2S_SUPPORTS_PDM_RX + // Create a new channel for MIC in PDM mode + i2s_chan_config_t rx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG((i2s_port_t)0, I2S_ROLE_MASTER); + ESP_ERROR_CHECK(i2s_new_channel(&rx_chan_cfg, NULL, &rx_handle_)); + i2s_pdm_rx_config_t pdm_rx_cfg = { + .clk_cfg = I2S_PDM_RX_CLK_DEFAULT_CONFIG((uint32_t)input_sample_rate_), + /* The data bit-width of PDM mode is fixed to 16 */ + .slot_cfg = I2S_PDM_RX_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO), + .gpio_cfg = { + .clk = mic_sck, + .din = mic_din, + + .invert_flags = { + .clk_inv = false, + }, + }, + }; + ESP_ERROR_CHECK(i2s_channel_init_pdm_rx_mode(rx_handle_, &pdm_rx_cfg)); +#else + ESP_LOGE(TAG, "PDM is not supported"); +#endif + ESP_LOGI(TAG, "Simplex channels created"); +} + NoAudioCodecSimplexPdm::NoAudioCodecSimplexPdm(int input_sample_rate, int output_sample_rate, gpio_num_t spk_bclk, gpio_num_t spk_ws, gpio_num_t spk_dout, gpio_num_t mic_sck, gpio_num_t mic_din) { duplex_ = false; input_sample_rate_ = input_sample_rate; diff --git a/main/audio/codecs/no_audio_codec.h b/main/audio/codecs/no_audio_codec.h index c1eedc6d..098ee001 100644 --- a/main/audio/codecs/no_audio_codec.h +++ b/main/audio/codecs/no_audio_codec.h @@ -32,6 +32,7 @@ public: class NoAudioCodecSimplexPdm : public NoAudioCodec { public: NoAudioCodecSimplexPdm(int input_sample_rate, int output_sample_rate, gpio_num_t spk_bclk, gpio_num_t spk_ws, gpio_num_t spk_dout, gpio_num_t mic_sck, gpio_num_t mic_din); + NoAudioCodecSimplexPdm(int input_sample_rate, int output_sample_rate, gpio_num_t spk_bclk, gpio_num_t spk_ws, gpio_num_t spk_dout, i2s_std_slot_mask_t spk_slot_mask, gpio_num_t mic_sck, gpio_num_t mic_din); int Read(int16_t* dest, int samples); }; diff --git a/main/boards/taiji-pi-s3/README.md b/main/boards/taiji-pi-s3/README.md index f53b64c0..c3e7b2f1 100644 --- a/main/boards/taiji-pi-s3/README.md +++ b/main/boards/taiji-pi-s3/README.md @@ -1,5 +1,7 @@ # 由于原来的麦克风型号停产,2025年7月之后的太极派(JC3636W518)更换了麦克风,并且更换了屏幕玻璃,所以在产品标签上批次号大于2528的用户请选择I2S Type PDM, +# 新增双声道配置 + # 编译配置命令 **配置编译目标为 ESP32S3:** @@ -19,9 +21,16 @@ idf.py menuconfig ``` Xiaozhi Assistant -> Board Type -> 太极小派esp32s3 -Xiaozhi Assistant -> taiji-pi-S3 I2S Type -> I2S Type PDM +Xiaozhi Assistant -> TAIJIPAI_S3_CONFIG -> taiji-pi-S3 I2S Type -> I2S Type PDM ``` +**如果需要选择双声道:** +``` + +Xiaozhi Assistant -> TAIJIPAI_S3_CONFIG -> Enabel use 2 slot +``` + + **修改PSRAM配置:** ``` diff --git a/main/boards/taiji-pi-s3/config.h b/main/boards/taiji-pi-s3/config.h index 6b9f54aa..c07d6200 100644 --- a/main/boards/taiji-pi-s3/config.h +++ b/main/boards/taiji-pi-s3/config.h @@ -23,8 +23,8 @@ #define DISPLAY_WIDTH 360 #define DISPLAY_HEIGHT 360 -#define DISPLAY_MIRROR_X false -#define DISPLAY_MIRROR_Y false +#define DISPLAY_MIRROR_X true +#define DISPLAY_MIRROR_Y true #define DISPLAY_SWAP_XY false #define QSPI_LCD_H_RES (360) diff --git a/main/boards/taiji-pi-s3/taiji_pi_s3.cc b/main/boards/taiji-pi-s3/taiji_pi_s3.cc index b6de62c2..05876c4d 100644 --- a/main/boards/taiji-pi-s3/taiji_pi_s3.cc +++ b/main/boards/taiji-pi-s3/taiji_pi_s3.cc @@ -618,9 +618,17 @@ public: AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, + #ifdef CONFIG_I2S_USE_2SLOT + I2S_STD_SLOT_BOTH, + #endif AUDIO_MIC_SCK_PIN, AUDIO_MIC_WS_PIN, + #ifdef CONFIG_I2S_USE_2SLOT + AUDIO_MIC_SD_PIN, + I2S_STD_SLOT_LEFT + #else AUDIO_MIC_SD_PIN + #endif ); #else static NoAudioCodecSimplexPdm audio_codec( @@ -629,6 +637,9 @@ public: AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, + #ifdef CONFIG_I2S_USE_2SLOT + I2S_STD_SLOT_BOTH, + #endif AUDIO_MIC_WS_PIN, AUDIO_MIC_SD_PIN ); @@ -650,4 +661,4 @@ public: } }; -DECLARE_BOARD(TaijiPiS3Board); \ No newline at end of file +DECLARE_BOARD(TaijiPiS3Board);