diff --git a/README.md b/README.md index 25d362f..382dc33 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,16 @@ -``` -ADC采样问题: -96K采样率 ---> 10us采样一帧数据 -SPI通信BYTE与YTE之间的间隙至少2.5us,一帧数据就是10us,这还不考虑SPI通信本身消耗的时间 +``` + V1.0 + ADCSampleRate 24k + ADCbit 24bit + SPIRate 2M +``` -采样一帧数据需要5Byte数据量 -->2M 50K -->4M 100K -->8M 200K -计算器 -96K +``` +ADC采样问题: -10us->采样一帧 -1000000 /8 /40 = 25k -2M 50K -4M 100K -8M 200K + 1. ADC芯片和MCU之间总线速率无法大于2M, 否则ADC芯片初始时,会报CRC错误 ``` \ No newline at end of file diff --git a/app/Core/Inc/stm32f1xx_it.h b/app/Core/Inc/stm32f1xx_it.h index 8789548..c5e760f 100644 --- a/app/Core/Inc/stm32f1xx_it.h +++ b/app/Core/Inc/stm32f1xx_it.h @@ -64,6 +64,8 @@ void USB_LP_CAN1_RX0_IRQHandler(void); void CAN1_RX1_IRQHandler(void); void CAN1_SCE_IRQHandler(void); void TIM2_IRQHandler(void); +void SPI1_IRQHandler(void); +void SPI2_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/app/Core/Src/spi.c b/app/Core/Src/spi.c index b9bc239..6c96a8d 100644 --- a/app/Core/Src/spi.c +++ b/app/Core/Src/spi.c @@ -156,6 +156,9 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx); + /* SPI1 interrupt Init */ + HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(SPI1_IRQn); /* USER CODE BEGIN SPI1_MspInit 1 */ /* USER CODE END SPI1_MspInit 1 */ @@ -217,6 +220,9 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi2_rx); + /* SPI2 interrupt Init */ + HAL_NVIC_SetPriority(SPI2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(SPI2_IRQn); /* USER CODE BEGIN SPI2_MspInit 1 */ /* USER CODE END SPI2_MspInit 1 */ @@ -244,6 +250,9 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) /* SPI1 DMA DeInit */ HAL_DMA_DeInit(spiHandle->hdmarx); HAL_DMA_DeInit(spiHandle->hdmatx); + + /* SPI1 interrupt Deinit */ + HAL_NVIC_DisableIRQ(SPI1_IRQn); /* USER CODE BEGIN SPI1_MspDeInit 1 */ /* USER CODE END SPI1_MspDeInit 1 */ @@ -266,6 +275,9 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) /* SPI2 DMA DeInit */ HAL_DMA_DeInit(spiHandle->hdmatx); HAL_DMA_DeInit(spiHandle->hdmarx); + + /* SPI2 interrupt Deinit */ + HAL_NVIC_DisableIRQ(SPI2_IRQn); /* USER CODE BEGIN SPI2_MspDeInit 1 */ /* USER CODE END SPI2_MspDeInit 1 */ diff --git a/app/Core/Src/stm32f1xx_it.c b/app/Core/Src/stm32f1xx_it.c index 63cc005..7fee835 100644 --- a/app/Core/Src/stm32f1xx_it.c +++ b/app/Core/Src/stm32f1xx_it.c @@ -60,6 +60,8 @@ extern DMA_HandleTypeDef hdma_spi1_rx; extern DMA_HandleTypeDef hdma_spi1_tx; extern DMA_HandleTypeDef hdma_spi2_tx; extern DMA_HandleTypeDef hdma_spi2_rx; +extern SPI_HandleTypeDef hspi1; +extern SPI_HandleTypeDef hspi2; extern TIM_HandleTypeDef htim2; /* USER CODE BEGIN EV */ @@ -329,6 +331,34 @@ void TIM2_IRQHandler(void) /* USER CODE END TIM2_IRQn 1 */ } +/** + * @brief This function handles SPI1 global interrupt. + */ +void SPI1_IRQHandler(void) +{ + /* USER CODE BEGIN SPI1_IRQn 0 */ + + /* USER CODE END SPI1_IRQn 0 */ + HAL_SPI_IRQHandler(&hspi1); + /* USER CODE BEGIN SPI1_IRQn 1 */ + + /* USER CODE END SPI1_IRQn 1 */ +} + +/** + * @brief This function handles SPI2 global interrupt. + */ +void SPI2_IRQHandler(void) +{ + /* USER CODE BEGIN SPI2_IRQn 0 */ + + /* USER CODE END SPI2_IRQn 0 */ + HAL_SPI_IRQHandler(&hspi2); + /* USER CODE BEGIN SPI2_IRQn 1 */ + + /* USER CODE END SPI2_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/app/MDK-ARM/startup_stm32f103xb.s b/app/MDK-ARM/startup_stm32f103xb.s index a8b7d3b..0acaae5 100644 --- a/app/MDK-ARM/startup_stm32f103xb.s +++ b/app/MDK-ARM/startup_stm32f103xb.s @@ -40,7 +40,7 @@ __initial_sp ; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; -Heap_Size EQU 0x2000 +Heap_Size EQU 0x2A00 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base diff --git a/app/app.ioc b/app/app.ioc index 38c5944..15851fd 100644 --- a/app/app.ioc +++ b/app/app.ioc @@ -122,6 +122,8 @@ NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SPI1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.SPI2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true diff --git a/dep/libiflytop_micro b/dep/libiflytop_micro index 586139d..292e352 160000 --- a/dep/libiflytop_micro +++ b/dep/libiflytop_micro @@ -1 +1 @@ -Subproject commit 586139d8aa82da8d71663836d31df2bb56a577cc +Subproject commit 292e3521d70c7daecfeeef31027b0105e4bf9fe5 diff --git a/src/umain.cpp b/src/umain.cpp index 83339f5..9e2f39b 100644 --- a/src/umain.cpp +++ b/src/umain.cpp @@ -61,31 +61,45 @@ void Main::generateScheduleTicket() { } } -void Main::adcslaveinit() {} +void Main::adcslaveinit() {} // #pragma GCC push_options // #pragma GCC optimize("Ofast") -void Main::onTimerCallbackIRQ(STM32_TIM *tim) { +void Main::onTimerCallbackIRQ(STM32_TIM *tim) { int32_t voice = m_ad77681.triggerOnceAdcReadAndReadLastResult(); m_voiceCacheQueue.push(&voice); } +#define PACKET_SIZE 1000 +static int32_t voicebuf[PACKET_SIZE + 1]; void Main::STM32_GPIO_onIRQ(STM32_GPIO *GPIO_Pin, STM32_GPIO::IrqTypeEvent_t irqevent) { if (GPIO_Pin == &SPI_SLAVE_GPIO) { - // SPI SLAVE 片选信号触发 - static int32_t voicebuf[100 + 1]; + /** + * @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() < 100) { + if (m_voiceCacheQueue.numElements() < PACKET_SIZE ) { /** * @brief 语音还不足一包 */ - HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, 101 * sizeof(int32_t)); + HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (1) * sizeof(int32_t)); } else { - voicebuf[0] = 100; - for (int i = 0; i < 100; i++) { + 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, 101 * sizeof(int32_t)); + HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (PACKET_SIZE + 1) * 4); } } } @@ -101,11 +115,11 @@ void Main::main(int argc, char const *argv[]) { { // 初始化语音队列 - m_voiceCacheQueue.initialize(1000); + m_voiceCacheQueue.initialize(2100); // 初始化ad77681 传感器 PB12.initAsOutput(true); - HAL_Delay(1000); + HAL_Delay(1500); m_ad77681.initialize("ad77681", &m_hardware, &hspi2, &PB12, ADC_default_init_param); m_ad77681.startAdcDmaRead(); @@ -156,7 +170,6 @@ void Main::main(int argc, char const *argv[]) { if (m_ticket % 3000 == 0) { m_hardware.input_sensors_table_dump(0); } - HAL_IWDG_Refresh(&hiwdg); } }