0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

i.MX RT600 BCLK受干扰影响WS频率解决方案

恩智浦MCU加油站 来源:周晶晶 作者:周晶晶 2023-09-14 08:55 次阅读
问题描述最近遇到客户发现一个很有意思的问题,客户使用i.MX RT600 I2S产生2通道的I2S波形,配置希望输出I2S波形:

48Khz 采样率,32bit, 2通道, BCLK输出3.072Mhz。

测试发现现象很奇怪,如果BCLK连接的模块阻抗改变,会导致正常应该输出48K的LRCK(WS)频率会变动,有时候变成96Khz,客户的模块是专用的ASIC

wKgZomUCWxKAT6ItAACRwTXfyro267.png

客户反应,这个问题同样可以在NXP MIMXRT685-AUD-EVK板子上复现,因为AUD-EVK FC2P0_14连接到了外部LED驱动电路

wKgZomUCWxOAXoQaAAEwu61d490265.png

如果是官方的代码配置,不会复现问题,如果是使用客户的代码,能够复现问题。

wKgZomUCWxOADW4VAAEcfwe6omk844.png

如果断开R397 1_2的电阻,问题就不会复现,连接之后就会复现。

所谓复现:测试P0_15 LRCK采样率从期望的48Khz变成了96Khz:

wKgZomUCWxSAKooWAAa8UOVqu8E212.png

所谓不复现:测试P0_15 LRCK采样率就是期望的48Khz:

wKgZomUCWxSAde7kAAb5PrW4iEM566.png

从I2S的构架上讲,不应该出现具体I2S IP的配置因为外部的驱动情况导致不同的输出频率,而且官方的代码直接修改接口和引脚也不会出现,那么问题究竟出在哪里呢?

问题分析与解决方案经过查看官方SDK的配置和客户提供的代码,发现差别很简单,在于pinmux.c对于P0_14, P0_15的配置,客户复现问题的配置如下:
const uint32_t port0_pin14_config = (/* Pin is configured as FC2_SCK */
                                          IOPCTL_PIO_FUNC1 |
                                          /* Disable pull-up / pull-down function */
                                          IOPCTL_PIO_PUPD_DI |
                                          /* Enable pull-down function */
                                          IOPCTL_PIO_PULLDOWN_EN |
                                          /* Enables input buffer function */
                                          IOPCTL_PIO_INBUF_EN |
                                          /* Normal mode */
                                          IOPCTL_PIO_SLEW_RATE_NORMAL |
                                          /* Normal drive */
                                         IOPCTL_PIO_FULLDRIVE_DI |
                                          /* Analog mux is disabled */
                                          IOPCTL_PIO_ANAMUX_DI |
                                          /* Pseudo Output Drain is disabled */
                                          IOPCTL_PIO_PSEDRAIN_DI |
                                          /* Input function is not inverted */
                                          IOPCTL_PIO_INV_DI);
     /* PORT0 PIN14 (coords: A3) is configured as FC2_SCK */
     IOPCTL_PinMuxSet(IOPCTL, 0U, 14U, port0_pin14_config);


     const uint32_t port0_pin15_config = (/* Pin is configured as FC2_TXD_SCL_MISO_WS */
                                          IOPCTL_PIO_FUNC1 |
                                          /* Disable pull-up / pull-down function */
                                          IOPCTL_PIO_PUPD_DI |
                                          /* Enable pull-down function */
                                          IOPCTL_PIO_PULLDOWN_EN |
                                          /* Enables input buffer function */
                                          IOPCTL_PIO_INBUF_EN |
                                          /* Normal mode */
                                          IOPCTL_PIO_SLEW_RATE_NORMAL |
                                          /* Normal drive */
                                          IOPCTL_PIO_FULLDRIVE_DI |
                                          /* Analog mux is disabled */
                                          IOPCTL_PIO_ANAMUX_DI |
                                          /* Pseudo Output Drain is disabled */
                                          IOPCTL_PIO_PSEDRAIN_DI |
                                          /* Input function is not inverted */
                                          IOPCTL_PIO_INV_DI);
     /* PORT0 PIN15 (coords: A5) is configured as FC2_TXD_SCL_MISO_WS */
     IOPCTL_PinMuxSet(IOPCTL, 0U, 15U, port0_pin15_config);

官方不复现问题的配置如下:

const uint32_t port0_pin14_config = (/* Pin is configured as FC2_SCK */
                                          IOPCTL_PIO_FUNC1 |
                                          /* Disable pull-up / pull-down function */
                                          IOPCTL_PIO_PUPD_DI |
                                          /* Enable pull-down function */
                                          IOPCTL_PIO_PULLDOWN_EN |
                                          /* Enables input buffer function */
                                          IOPCTL_PIO_INBUF_EN |
                                          /* Normal mode */
                                          IOPCTL_PIO_SLEW_RATE_NORMAL |
                                          /* Normal drive */
                IOPCTL_PIO_FULLDRIVE_EN  |
                                          /* Analog mux is disabled */
                                          IOPCTL_PIO_ANAMUX_DI |
                                          /* Pseudo Output Drain is disabled */
                                          IOPCTL_PIO_PSEDRAIN_DI |
                                          /* Input function is not inverted */
                                          IOPCTL_PIO_INV_DI);
     /* PORT0 PIN14 (coords: A3) is configured as FC2_SCK */
     IOPCTL_PinMuxSet(IOPCTL, 0U, 14U, port0_pin14_config);


     const uint32_t port0_pin15_config = (/* Pin is configured as FC2_TXD_SCL_MISO_WS */
                                          IOPCTL_PIO_FUNC1 |
                                          /* Disable pull-up / pull-down function */
                                          IOPCTL_PIO_PUPD_DI |
                                          /* Enable pull-down function */
                                          IOPCTL_PIO_PULLDOWN_EN |
                                          /* Enables input buffer function */
                                          IOPCTL_PIO_INBUF_EN |
                                          /* Normal mode */
                                          IOPCTL_PIO_SLEW_RATE_NORMAL |
                                          /* Normal drive */
                IOPCTL_PIO_FULLDRIVE_EN  |
                                          /* Analog mux is disabled */
                                          IOPCTL_PIO_ANAMUX_DI |
                                          /* Pseudo Output Drain is disabled */
                                          IOPCTL_PIO_PSEDRAIN_DI |
                                          /* Input function is not inverted */
                                          IOPCTL_PIO_INV_DI);
     /* PORT0 PIN15 (coords: A5) is configured as FC2_TXD_SCL_MISO_WS */
     IOPCTL_PinMuxSet(IOPCTL, 0U, 15U, port0_pin15_config);

实际上,只要BCLK P0_14的引脚配置为FULL drive即可。

wKgZomUCWxWAL0VtAACgGdH0OzA255.png

可以看到,如果配置为Full output driver,驱动能力是normal输出的两倍。所以,问题出在BCLK的引脚驱动能力这块。

然而,推荐客户改变驱动能力的方式,纵然可以输出正确的48Khz采样率波形,客户并不接受,认为高驱动能力也代表着功耗的加大,而他们的产品是对功耗要求极高的,必须要在普通驱动能力下解决问题。所以进一步分析波形,通过使用高采样率的示波器20Gsa/s,2G探头抓取出问题时候的BCLK,可以发现有一些毛刺:

wKgZomUCWxWAKCmCAAF1yvlhwKQ128.png

过内部的沟通,也认为这个BCLK毛刺是导致问题的原因。这里需要注意的是,有些示波器,如果采样率低可能抓不到这个毛刺,还有些探头,阻抗比较小,导致探头加上到BCLK,直接问题消失的情况,所以建议使用高阻抗探头,比如1M欧,1G采样率以上的探头即可抓到。

由于客户不接受驱动能力的改变,所以这里还可以考虑改变斜率,让上升下降变缓,滤掉毛刺区域,改变配置如下:

#define IOPCTL_PIO_SLEW_RATE_SLEW 0X80 
  const uint32_t port0_pin14_config = (/* Pin is configured as FC2_SCK */
                                           IOPCTL_PIO_FUNC1 |
                                           /* Disable pull-up / pull-down function */
                                           IOPCTL_PIO_PUPD_DI |
                                           /* Enable pull-down function */
                                           IOPCTL_PIO_PULLDOWN_EN |
                                           /* Enables input buffer function */
                                           IOPCTL_PIO_INBUF_EN |
                                           /* Normal mode */
                IOPCTL_PIO_SLEW_RATE_SLEW|//0X80|// IOPCTL_PIO_SLEW_RATE_NORMAL |
                                           /* Normal drive */
                                           IOPCTL_PIO_FULLDRIVE_DI |
                                           /* Analog mux is disabled */
                                           IOPCTL_PIO_ANAMUX_DI |
                                           /* Pseudo Output Drain is disabled */
                                           IOPCTL_PIO_PSEDRAIN_DI |
                                           /* Input function is not inverted */
                                           IOPCTL_PIO_INV_DI);
      /* PORT0 PIN14 (coords: A3) is configured as FC2_SCK */
      IOPCTL_PinMuxSet(IOPCTL, 0U, 14U, port0_pin14_config);


      const uint32_t port0_pin15_config = (/* Pin is configured as FC2_TXD_SCL_MISO_WS */
                                           IOPCTL_PIO_FUNC1 |
                                           /* Disable pull-up / pull-down function */
                                           IOPCTL_PIO_PUPD_DI |
                                           /* Enable pull-down function */
                                           IOPCTL_PIO_PULLDOWN_EN |
                                           /* Enables input buffer function */
                                           IOPCTL_PIO_INBUF_EN |
                                           /* Normal mode */
                                           IOPCTL_PIO_SLEW_RATE_NORMAL |
                                           /* Normal drive */
                                           IOPCTL_PIO_FULLDRIVE_DI |
                                           /* Analog mux is disabled */
                                           IOPCTL_PIO_ANAMUX_DI |
                                           /* Pseudo Output Drain is disabled */
                                           IOPCTL_PIO_PSEDRAIN_DI |
                                           /* Input function is not inverted */
                                           IOPCTL_PIO_INV_DI);
      /* PORT0 PIN15 (coords: A5) is configured as FC2_TXD_SCL_MISO_WS */
      IOPCTL_PinMuxSet(IOPCTL, 0U, 15U, port0_pin15_config);

wKgZomUCWxWAEwjIAAE1xlQVdgc471.png测试结果如下:

wKgZomUCWxWAexzrAATDXihEt_s682.png

可以看到波形很光滑,毛刺消失,输出也是稳定的48Khz,满足客户不改变驱动能力的要求。

小结

在使用i.MX RT600 FC2做I2S的时候,为了BCLK不受外部电路影响,从而影响到WS的波形频率,建议引脚配置以下二选一:

1.使用Full output drive,提高驱动能力2.使用慢slewrate,滤掉BCLK上升下降小毛刺

最后,特别感谢NXP 苏州SE团队 James Fan 在该解决方案上提供的大力支持!作者:周晶晶

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17123

    浏览量

    350973
  • 恩智浦
    +关注

    关注

    14

    文章

    5857

    浏览量

    107304
  • WS
    WS
    +关注

    关注

    0

    文章

    3

    浏览量

    9940
  • i.MX
    +关注

    关注

    1

    文章

    47

    浏览量

    35606
  • I2S
    I2S
    +关注

    关注

    1

    文章

    64

    浏览量

    41902

原文标题:i.MX RT600 BCLK受干扰影响WS频率解决方案

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    NXP专为边缘AI打造的i.MX RT700跨界MCU到底强在哪?

    500和i.MX RT600跨界MCU的成功基础上,恩智浦宣布推出i.MX RT700,超低功耗、集成多核和eIQ Neutron神经处理单元 (NPU)。 新一代
    发表于 11-08 09:40 748次阅读
    NXP专为边缘AI打造的<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>700跨界MCU到底强在哪?

    NXP推出基于i.MX RT106F本地人脸识别解决方案

    NXP MCU级别的人脸识别解决方案利用i.MX RT106F来实现,使开发者轻松便捷地将人脸识别功能添加到他们基于MCU的IoT产品中.
    发表于 03-01 10:07 5166次阅读

    i.MX RT500/600应用案例 串行NOR Flash双程序可交替启动设计

    i.MX RTxxx 系列上(RT500/600)也有双程序可交替启动特性,其主体设计逻辑基本上跟i.MX RT1170是差不多的,只是一些
    的头像 发表于 05-05 14:24 2648次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>500/<b class='flag-5'>600</b>应用案例 串行NOR Flash双程序可交替启动设计

    i.MX RT处理器系列

    我对i.MX RT处理器系列很感兴趣,因为它是机器学习研究项目中有吸引力的解决方案。机器学习需要大量的计算能力,而且由于i.MX RT AR
    发表于 07-22 07:53

    i.MX RT600跨界处理器参考资料

    i.MX RT600跨界处理器宣传手册
    发表于 12-12 07:21

    01:i.MX RT的市场应用和参考解决方案

    应用,然后分享现有的硬件/软件/工具/文档,以便全面了解i.MX RT系列。最后,还将介绍i.MX RT的典型参考解决方案,以便更好地了解恩
    的头像 发表于 01-21 07:13 3348次阅读
    01:<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的市场应用和参考<b class='flag-5'>解决方案</b>

    恩智浦i.MX RT600跨界微控制器在功耗、性能和存储器方面有显著特点

    恩智浦半导体近日宣布i.MX RT600跨界微控制器 (MCU) 上市,这是一款面向音频、语音和机器学习等超低功耗、安全边缘应用的理想解决方案
    的头像 发表于 03-15 14:29 2754次阅读

    i.MX RT开发笔记-08 | i.MX RT1062嵌套中断向量控制器NVIC(按键中断检测)

    系列文章目录i.MX RT开发笔记-01 | 初识 i.MX RT1062 跨界MCUi.MX RT
    发表于 12-01 13:51 2次下载
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>开发笔记-08 | <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1062嵌套中断向量控制器NVIC(按键中断检测)

    RT-Thread & NXP 发布 i.MX RT 系列 BSP 新框架

    前言i.MX RT 是 NXP 推出的跨界处理器系列。该系列下又包括 i.MX RT1020、i.MX
    发表于 12-07 13:06 2次下载
    <b class='flag-5'>RT</b>-Thread & NXP 发布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架

    基于i.MX RT单芯片实现的GUI图形显示和语音控制解决方案

    基于优秀的性能指标,i.MX RT可以胜任许多轻量级的AI应用,赋能越来越多的边缘设备。今天这场视频讲座中,恩智浦的专家将向大家展示一款基于i.MX RT单芯片实现的GUI图形显示和语
    的头像 发表于 12-31 09:48 7250次阅读

    适用于i.MX RT500和i.MX RT600 MCU的Xtensa音频框架介绍

    可编程方法,从而提供最大的灵活性,本篇将介绍适用于i.MX RT500和i.MX RT600 MCU的Xtensa音频框架(XAF)。
    的头像 发表于 11-10 09:39 2696次阅读

    基于 NXP i.MX RT1050 的 3D 打印机方案

    MCU-Healer 是基于 NXP i.MX RT1050 做的 3D 打印机方案,该方案主控 MCU i.MX
    的头像 发表于 04-06 15:06 1195次阅读
    基于 NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1050 的 3D 打印机<b class='flag-5'>方案</b>

    i.MX RT的FlexRAM配置问题

    i.MX RT的FlexRAM配置问题
    的头像 发表于 10-24 15:46 805次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的FlexRAM配置问题

    基于NXP i.MX RT117H智能人机界面方案

    基于NXP i.MX RT117H智能人机界面方案
    的头像 发表于 10-30 18:22 662次阅读
    基于NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>117H智能人机界面<b class='flag-5'>方案</b>

    i.MX RT500/600系列上串行NOR Flash双程序可交替启动设计

    i.MX RT500/600系列上串行NOR Flash双程序可交替启动设计
    的头像 发表于 10-27 09:36 471次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>500/<b class='flag-5'>600</b>系列上串行NOR Flash双程序可交替启动设计