硬汉嵌入式论坛

 找回密码
 立即注册
查看: 280|回复: 9
收起左侧

[SAI/I2S] IIS 驱动WM8978录音只有噪声

[复制链接]

4

主题

8

回帖

20

积分

新手上路

积分
20
发表于 2025-7-5 20:08:41 | 显示全部楼层 |阅读模式
使用STM32H743IIT6 IIS3 DMA驱动WM8978采集音频,但采集到的只有噪声。IIS配置如下:

wm8978寄存器初始化部分照抄的例程:

        v = wm8978_Init();
  wm8978_SetMicGain(50);
  wm8978_SetLineGain(5);
  wm8978_CfgAudioIF(I2S_STANDARD_PHILIPS, 16);
  wm8978_CfgAudioPath(MIC_LEFT_ON|MIC_RIGHT_ON|LINE_ON | ADC_ON, EAR_LEFT_ON | EAR_RIGHT_ON);
        MX_I2S3_Init();

void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
{
        if(hi2s->Instance == SPI3)
        {
                        if(cnt++ < 5)
                        {
                                HAL_UART_Transmit_IT(&huart5,(uint8_t*)pcm_data[0],8240);
                        }
                        HAL_I2S_Receive_DMA(&hi2s3, pcm_data[0], OLED_PCM_SIZE/2);
        }
}

请问有人知道可能是哪里的问题吗?万分感谢


屏幕截图 2025-07-05 175635.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-6 08:18:14 | 显示全部楼层
1、特别注意MPU Cache问题,先关闭DMA所使用存储空间的Cache。
2、特别注意DMA空间不要分配到DTCM了。
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2025-7-6 13:45:21 | 显示全部楼层
eric2013 发表于 2025-7-6 08:18
1、特别注意MPU Cache问题,先关闭DMA所使用存储空间的Cache。
2、特别注意DMA空间不要分配到DTCM了。

谢谢,我现在把I2S和wm8978的格式改成了PCM_SHORT,8k采样率 16位深 dma每次采8240byte 每次触发中断和理论值0.51一致。我分别试着关闭CACHE和关闭MPU、手动指定变量到AXI SRAM、使用中断代替DMA,但接收到的数据仍然只有噪声。
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2025-7-6 15:17:09 | 显示全部楼层
上川下流 发表于 2025-7-6 13:45
谢谢,我现在把I2S和wm8978的格式改成了PCM_SHORT,8k采样率 16位深 dma每次采8240byte 每次触发中断和理 ...

我用示波器测量IIS几个引脚 PCM_SHORT格式下,mclk 1.024MHz clk是8.12Khz、ws是8.004Khz,和理论值基本一致
uint16_t pcm_single[OLED_PCM_SIZE/4] __attribute((section(".ARM._at_0x24000000")));
/*初始化*/
  v = wm8978_Init();
  wm8978_SetMicGain(50);
  wm8978_SetLineGain(4);
  wm8978_CfgAudioIF(I2S_STANDARD_PCM_SHORT, 16);
  wm8978_CfgAudioPath(LINE_ON| ADC_ON, EAR_LEFT_ON|DAC_ON);
  wm8978_CfgAudioPath(LINE_ON|MIC_LEFT_ON|MIC_RIGHT_ON| ADC_ON, EAR_LEFT_ON | EAR_RIGHT_ON);
  MX_I2S3_Init();
/*callback*/
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
{
        if(hi2s->Instance == SPI3)
        {
                current_buf_flag = pcm_buf_flag;
                pcm_buf_flag = !pcm_buf_flag;
                ok = 1;
                HAL_I2S_Receive_DMA(&hi2s3, pcm_data[pcm_buf_flag], OLED_PCM_SIZE/2);
        }
}
/*main while*/
  while (1)
  {
                if(ok)
                {
                        ok = 0;
                        HAL_UART_Transmit_IT(&huart5,(uint8_t*)pcm_data[current_buf_flag],8240);
                }
}
/*MPU*/
void MPU_Config(void)
{
  HAL_MPU_Disable();
}
请问能看出来哪里可能有问题吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-8 08:45:13 | 显示全部楼层
上川下流 发表于 2025-7-6 15:17
我用示波器测量IIS几个引脚 PCM_SHORT格式下,mclk 1.024MHz clk是8.12Khz、ws是8.004Khz,和理论值基本 ...

你的发送完成标识在那里处理的。
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2025-7-8 13:26:28 | 显示全部楼层
eric2013 发表于 2025-7-8 08:45
你的发送完成标识在那里处理的。

串口的发送完成标识吗?那个没做处理
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-9 09:27:59 | 显示全部楼层
上川下流 发表于 2025-7-8 13:26
串口的发送完成标识吗?那个没做处理

要处理下,否则你上传的数据有问题,必须之前的上传完毕了,才可以发新的。

除非你的串口上传速度远快于I2S速度。可以考虑直接采集100KB数据缓冲,然后停止采集,再串口发送出来看下效果正常不
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2025-7-11 00:04:27 | 显示全部楼层
eric2013 发表于 2025-7-9 09:27
要处理下,否则你上传的数据有问题,必须之前的上传完毕了,才可以发新的。

除非你的串口上传速度远快 ...

请问您有测试过H7系列的I2S吗?我又换了INMP441做录音测试,分别用了我自己打的743IIT6的PCB和买的H750VBT6的开发板,参考的这篇博客做的测试https://blog.csdn.net/qq_15181569/article/details/131224833
打印出来的波形完全不对劲。之前用wm8978时也是,在调试中能看到I2C确实写寄存器成功了,但I2S接收到的数据却完全不对。我手头没有其他系列的开发板,所以没办法进行对比。

屏幕截图 2025-07-10 235732.png
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2025-7-11 05:51:14 | 显示全部楼层
eric2013 发表于 2025-7-9 09:27
要处理下,否则你上传的数据有问题,必须之前的上传完毕了,才可以发新的。

除非你的串口上传速度远快 ...

找到问题了,好像是信号受干扰了。最上面三根绿线分别是ws ck sdi,用这三根线接受数据的时候数据很多时候收到的是0xF8,我换成I2S1的三个空闲的引脚飞线出去,就能接收到正常的数据了,虽然有很大噪音。。。
但好奇怪,i2S的线我走在内层三里,内层1、2同位置没有高频的信号线,只有顶层是芯片的焊盘,为什么会干扰呢?
屏幕截图 2025-07-11 054530.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-11 09:11:32 | 显示全部楼层
上川下流 发表于 2025-7-11 05:51
找到问题了,好像是信号受干扰了。最上面三根绿线分别是ws ck sdi,用这三根线接受数据的时候数据很多时 ...

我们用的SAI接口,布线倒是没遇到问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 03:42 , Processed in 0.086076 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表