添加太极派双声道配置 (#1235)

* Add Guition Boards

* Add Product Links

* 适配新版太极派

* 适配新版太极派

* 添加太极派双声道配置

* 添加太极派双声道配置

* 添加太极派双声道配置

* 太极派添加双声道输出配置
This commit is contained in:
DeepStart
2025-09-26 05:04:12 +08:00
committed by GitHub
parent d3e7fee828
commit e329fcc6b8
6 changed files with 121 additions and 13 deletions

View File

@@ -604,16 +604,25 @@ config RECEIVE_CUSTOM_MESSAGE
help help
Enable custom message reception, allow the device to receive custom messages from the server (preferably through the MQTT protocol) 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 depends on BOARD_TYPE_ESP32S3_Taiji_Pi
prompt "taiji-pi-S3 I2S Type" choice I2S_TYPE_TAIJIPI_S3
default TAIJIPAI_I2S_TYPE_STD 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 help
I2S Type 启动双声道
config TAIJIPAI_I2S_TYPE_STD endmenu
bool "I2S Type STD"
config TAIJIPAI_I2S_TYPE_PDM
bool "I2S Type PDM"
endchoice
endmenu endmenu

View File

@@ -214,6 +214,84 @@ NoAudioCodecSimplex::NoAudioCodecSimplex(int input_sample_rate, int output_sampl
ESP_LOGI(TAG, "Simplex channels created"); 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) { 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; duplex_ = false;
input_sample_rate_ = input_sample_rate; input_sample_rate_ = input_sample_rate;

View File

@@ -32,6 +32,7 @@ public:
class NoAudioCodecSimplexPdm : public NoAudioCodec { class NoAudioCodecSimplexPdm : public NoAudioCodec {
public: 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, 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); int Read(int16_t* dest, int samples);
}; };

View File

@@ -1,5 +1,7 @@
# 由于原来的麦克风型号停产2025年7月之后的太极派JC3636W518更换了麦克风并且更换了屏幕玻璃所以在产品标签上批次号大于2528的用户请选择I2S Type PDM, # 由于原来的麦克风型号停产2025年7月之后的太极派JC3636W518更换了麦克风并且更换了屏幕玻璃所以在产品标签上批次号大于2528的用户请选择I2S Type PDM,
# 新增双声道配置
# 编译配置命令 # 编译配置命令
**配置编译目标为 ESP32S3** **配置编译目标为 ESP32S3**
@@ -19,9 +21,16 @@ idf.py menuconfig
``` ```
Xiaozhi Assistant -> Board Type -> 太极小派esp32s3 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配置** **修改PSRAM配置**
``` ```

View File

@@ -23,8 +23,8 @@
#define DISPLAY_WIDTH 360 #define DISPLAY_WIDTH 360
#define DISPLAY_HEIGHT 360 #define DISPLAY_HEIGHT 360
#define DISPLAY_MIRROR_X false #define DISPLAY_MIRROR_X true
#define DISPLAY_MIRROR_Y false #define DISPLAY_MIRROR_Y true
#define DISPLAY_SWAP_XY false #define DISPLAY_SWAP_XY false
#define QSPI_LCD_H_RES (360) #define QSPI_LCD_H_RES (360)

View File

@@ -618,9 +618,17 @@ public:
AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_BCLK,
AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_WS,
AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DOUT,
#ifdef CONFIG_I2S_USE_2SLOT
I2S_STD_SLOT_BOTH,
#endif
AUDIO_MIC_SCK_PIN, AUDIO_MIC_SCK_PIN,
AUDIO_MIC_WS_PIN, AUDIO_MIC_WS_PIN,
#ifdef CONFIG_I2S_USE_2SLOT
AUDIO_MIC_SD_PIN,
I2S_STD_SLOT_LEFT
#else
AUDIO_MIC_SD_PIN AUDIO_MIC_SD_PIN
#endif
); );
#else #else
static NoAudioCodecSimplexPdm audio_codec( static NoAudioCodecSimplexPdm audio_codec(
@@ -629,6 +637,9 @@ public:
AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_BCLK,
AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_WS,
AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DOUT,
#ifdef CONFIG_I2S_USE_2SLOT
I2S_STD_SLOT_BOTH,
#endif
AUDIO_MIC_WS_PIN, AUDIO_MIC_WS_PIN,
AUDIO_MIC_SD_PIN AUDIO_MIC_SD_PIN
); );
@@ -650,4 +661,4 @@ public:
} }
}; };
DECLARE_BOARD(TaijiPiS3Board); DECLARE_BOARD(TaijiPiS3Board);