From d8a831e0c44f36899c203c01e26370df21b433b4 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 4 Jul 2023 17:59:11 +0800 Subject: [PATCH] update --- README.md | 1 + src/umain.cpp | 78 +++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index bf5adfb..2c7ef13 100644 --- a/README.md +++ b/README.md @@ -13,5 +13,6 @@ ADC采样问题: 1. ADC芯片和MCU之间总线速率无法大于2M, 否则ADC芯片初始时,会报CRC错误 2. 采样率大于24k时,采集到的数据会出现错误,原因未知 + 3. 单片机采集到语音偶尔会出现噪声(输入源是信号发生器),原因未知 ``` \ No newline at end of file diff --git a/src/umain.cpp b/src/umain.cpp index 9e2f39b..151b7ba 100644 --- a/src/umain.cpp +++ b/src/umain.cpp @@ -30,7 +30,7 @@ struct ad77681_init_param ADC_default_init_param = { // }, /* Configuration */ .power_mode = AD77681_FAST, // power_mode - .mclk_div = AD77681_MCLK_DIV_2, // mclk_div + .mclk_div = AD77681_MCLK_DIV_8, // mclk_div .conv_mode = AD77681_CONV_CONTINUOUS, // conv_mode .diag_mux_sel = AD77681_POSITIVE_FS, // diag_mux_sel .conv_diag_sel = false, // conv_diag_sel @@ -70,37 +70,11 @@ void Main::onTimerCallbackIRQ(STM32_TIM *tim) { } #define PACKET_SIZE 1000 static int32_t voicebuf[PACKET_SIZE + 1]; +static bool s_prepareNextVoice = false; void Main::STM32_GPIO_onIRQ(STM32_GPIO *GPIO_Pin, STM32_GPIO::IrqTypeEvent_t irqevent) { if (GPIO_Pin == &SPI_SLAVE_GPIO) { - /** - * @brief - * - * 由于强制停止SPI传输后之后,SPI的发送BUF中依然会留有一个数据 - * 这会导致下一次传输时,会先发送这个数据,然后再发送新的数据。 - * 目前解决这个问题的方法就是每次传输之前,彻底复位SPI模块,然后重新初始化。 - * - */ - HAL_SPI_DMAStop(&SLAVE_SPI); - HAL_SPI_Abort(&SLAVE_SPI); - HAL_SPI_DeInit(&SLAVE_SPI); - __HAL_RCC_SPI1_FORCE_RESET(); - __HAL_RCC_SPI1_RELEASE_RESET(); - MX_SPI1_Init(); - - memset(voicebuf, 0, sizeof(voicebuf)); - if (m_voiceCacheQueue.numElements() < PACKET_SIZE ) { - /** - * @brief 语音还不足一包 - */ - HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (1) * sizeof(int32_t)); - } else { - voicebuf[0] = PACKET_SIZE * 4; - for (int i = 0; i < PACKET_SIZE; i++) { - m_voiceCacheQueue.pop(&voicebuf[i + 1]); - } - HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (PACKET_SIZE + 1) * 4); - } + s_prepareNextVoice = true; } } // #pragma GCC pop_options @@ -126,12 +100,12 @@ void Main::main(int argc, char const *argv[]) { // 初始化音频采集定时器 STM32_TIM2.initialize(&htim2, STM32_TIM::kTimMode_timer); STM32_TIM2.regListener(this); - STM32_TIM2.startTimerByFreq(24000); + STM32_TIM2.startTimerByFreq(16000); } { // 语音上传接口初始化 - SPI_SLAVE_GPIO.initAsInput(STM32_GPIO::kInput_fallingIrq, false); + SPI_SLAVE_GPIO.initAsInput(STM32_GPIO::kInput_risingIrq, false); SPI_SLAVE_GPIO.regListener(this); } @@ -170,6 +144,48 @@ void Main::main(int argc, char const *argv[]) { if (m_ticket % 3000 == 0) { m_hardware.input_sensors_table_dump(0); } + + if (s_prepareNextVoice) { + /** + * @brief + * + * 由于强制停止SPI传输后之后,SPI的发送BUF中依然会留有一个数据 + * 这会导致下一次传输时,会先发送这个数据,然后再发送新的数据。 + * 目前解决这个问题的方法就是每次传输之前,彻底复位SPI模块,然后重新初始化。 + * + */ + if (SLAVE_SPI.State != HAL_SPI_STATE_READY) { + HAL_SPI_DMAStop(&SLAVE_SPI); + HAL_SPI_Abort(&SLAVE_SPI); + HAL_SPI_DeInit(&SLAVE_SPI); + __HAL_RCC_SPI1_FORCE_RESET(); + __HAL_RCC_SPI1_RELEASE_RESET(); + MX_SPI1_Init(); + } + memset(voicebuf, 0, sizeof(voicebuf)); + int32_t nowvoicecount = 0; + + { + m_hardware.critical_enter(); + nowvoicecount = m_voiceCacheQueue.numElements(); + m_hardware.critical_exit(); + } + + if (nowvoicecount >= PACKET_SIZE) { + voicebuf[0] = PACKET_SIZE * 4; + for (int i = 0; i < PACKET_SIZE; i++) { + m_hardware.critical_enter(); + m_voiceCacheQueue.pop(&voicebuf[i + 1]); + m_hardware.critical_exit(); + } + HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (PACKET_SIZE + 1) * 4); + } else { + // 语音还不足一包 + HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (1) * sizeof(int32_t)); + } + s_prepareNextVoice = false; + } + HAL_IWDG_Refresh(&hiwdg); } }