我正在使用 MEMS PDM 麦克风并使用 I2S 读取它。在我的 I2S 和 PDM 配置中设置了以下参数。
- hi2s3.Instance = SPI3;
- hi2s3.Init.Mode = I2S_MODE_MASTER_RX;
- hi2s3.Init.Standard = I2S_STANDARD_MSB;
- hi2s3.Init.DataFormat = I2S_DATAFORMAT_24B;
- hi2s3.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
- hi2s3.Init.AudioFreq = I2S_AUDIOFREQ_48K;
- hi2s3.Init.CPOL = I2S_CPOL_LOW;
- hi2s3.Init.ClockSource = I2S_CLOCK_PLL;
- hi2s3.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE;
PDM2PCM 抽取因子是 64。我以 2Mbaud 的速度从 uart 发送数据,但我的数据中出现损坏值的间隙。这是因为我发送的速度不够快吗?如果是这样,我怎样才能更好地缓冲它以解决这个问题?
感谢您的帮助,我的代码也在这里,还有我绘制的音频图像。
- HAL_I2S_Receive_DMA(&hi2s3, &pdmRxBuf[0],64);
- HAL_UART_Transmit_DMA(&huart2, (uint8_t *)txBuf, 256);
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- if (rxstate==1) {
- PDM_Filter(&pdmRxBuf[0],&MidBuffer[0], &PDM1_filter_handler);
- for (int i=0; i<16;i++)
- {
- //MidBuffer = j++;
- FifoWrite(MidBuffer);
- //j %= 65535;
- }
- if (fifo_w_ptr-fifo_r_ptr > 128) fifo_read_enabled=1;
- rxstate=0;
- }
- if (rxstate==2) {
- PDM_Filter(&pdmRxBuf[64],&MidBuffer[0], &PDM1_filter_handler);
- for (int i=0; i<16;i++)
- {
- //MidBuffer = j++;
- FifoWrite(MidBuffer);
- //j %= 65535;
- }
- rxstate=0;
- }
- if (txstate==1) {
- if (fifo_read_enabled==1) {
- for (int i=0; i<64;i=i+1) {
- uint16_t data = FifoRead();
- txBuf = data;
- //txBuf[i+2] = data;
- }
- }
- txstate=0;
- }
- if (txstate==2) {
- if (fifo_read_enabled==1) {
- for (int i=64; i<128;i=i+1) {
- uint16_t data = FifoRead();
- txBuf = data;
- // txBuf[i+2] = data;
- }
- }
- txstate=0;
- }
- void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
- {
- txstate = 1;
- }
- void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
- {
- txstate = 2;
- }
- void HAL_I2S_RxHalfCpltCallback (I2S_HandleTypeDef *hi2s) {
- rxstate = 1;
- }
- void HAL_I2S_RxCpltCallback (I2S_HandleTypeDef *hi2s) {
- rxstate = 2;
- }