|
|
@ -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); |
|
|
|
} |
|
|
|
} |