OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 226|回复: 1

STM32H743的SAI的标准I2S下采集音频数据,为什么其他频率下的正弦波信号都可以正常接收并且拼接显示出来,但是唯独96k不行

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2025-1-13
在线时间
4 小时
发表于 2025-2-26 11:03:08 | 显示全部楼层 |阅读模式
/* SAI Block A采样率设置
* 采样率计算公式(以NOMCK=0,OSR=0为前提):
* Fmclk = 256*Fs = sai_x_ker_ck / MCKDIV[5:0]
* Fs = sai_x_ker_ck / (256 * MCKDIV[5:0])
* Fsck = Fmclk * (FRL[7:0]+1) / 256 = Fs * (FRL[7:0] + 1)
* 其中:
* sai_x_ker_ck = (HSE / PLL2DIVM) * (PLL2DIVN + 1) / (PLL2DIVP + 1)
* HSE:一般为25Mhz
* PLL2DIVM     :1~63,表示1~63分频
* PLL2DIVN     :3~511,表示4~512倍频
* PLL2DIVP     :0~127,表示1~128分频
* MCKDIV       :0~63,表示1~63分频,0也是1分频,推荐设置为偶数
* SAI A分频系数表@PLL2DIVM=25,HSE=25Mhz,即vco输入频率为1Mhz
* 表格式:
* 采样率|(PLL2DIVN+1)|(PLL2DIVP+1)|MCKDIV
*/
const uint16_t SAI_PSC_TBL[][5]=
{
    { 800 , 344, 7, 0, 12 },    /* 8Khz采样率 */
    { 1102, 429, 2, 18, 2 },    /* 11.025Khz采样率 */
    { 1600, 344, 7, 0, 6 },     /* 16Khz采样率 */
    { 2205, 429, 2, 18, 1 },    /* 22.05Khz采样率 */
    { 3200, 344, 7, 0, 3 },     /* 32Khz采样率 */
    { 4410, 429, 2, 18, 0 },    /* 44.1Khz采样率 */
    { 4800, 344, 7, 0, 2 },     /* 48Khz采样率 */
    { 8820, 271, 2, 2, 1 },     /* 88.2Khz采样率 */
    { 9600, 344, 7, 0, 1 },     /* 96Khz采样率 */
    { 17640, 271, 2, 2, 0 },    /* 176.4Khz采样率  */
    { 19200, 344, 7, 0, 0 },    /* 192Khz采样率 */
};

/**
* @brief       设置SAIA的采样率(@MCKEN)
* @param       samplerate:采样率, 单位:Hz
* @retval      0,设置成功
*              1,无法设置
*/
uint8_t sai1_samplerate_set(uint32_t samplerate)
{   
    uint8_t i = 0;

    RCC_PeriphCLKInitTypeDef rcc_sai1_sture;  

    for (i = 0; i < (sizeof(SAI_PSC_TBL) / 10); i++)                    /* 看看改采样率是否可以支持 */
    {
        if ((samplerate / 10) == SAI_PSC_TBL[0])
        {
            break;
        }
    }

    if (i == (sizeof(SAI_PSC_TBL) / 10))
    {
        return 1;                       /* 搜遍了也找不到 */
    }

    rcc_sai1_sture.PeriphClockSelection = RCC_PERIPHCLK_SAI1;           /* 外设时钟源选择 */
    rcc_sai1_sture.Sai1ClockSelection = RCC_SAI1CLKSOURCE_PLL2;         /* 设置PLL2 */
    rcc_sai1_sture.PLL2.PLL2M = 25;                                     /* 设置PLL2M */
    rcc_sai1_sture.PLL2.PLL2N = (uint32_t)SAI_PSC_TBL[1];            /* 设置PLL2N */
    rcc_sai1_sture.PLL2.PLL2P = (uint32_t)SAI_PSC_TBL[2];            /* 设置PLL2P */
    HAL_RCCEx_PeriphCLKConfig(&rcc_sai1_sture);                         /* 设置时钟 */

    __HAL_SAI_DISABLE(&g_sai1_a_handle);                                /* 关闭SAI */
    g_sai1_a_handle.Init.AudioFrequency = samplerate;                   /* 设置播放频率 */
    HAL_SAI_Init(&g_sai1_a_handle);                                     /* 初始化SAI */
    sai1_saia_dma_enable();                                             /* 开启SAI的DMA功能 */
    __HAL_SAI_ENABLE(&g_sai1_a_handle);                                 /* 开启SAI */

    return 0;
}暂时怀疑是时钟配置问题,有没有大佬给我点建议

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2025-1-13
在线时间
4 小时
 楼主| 发表于 2025-2-26 11:04:04 | 显示全部楼层
更快的频率都试过了,都可以,就96k不行,为什么呢,想不明白呀
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-2 02:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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