问题描述最近遇到客户发现一个很有意思的问题,客户使用i.mx rt600 i2s产生2通道的i2s波形,配置希望输出i2s波形:
48khz 采样率,32bit, 2通道, bclk输出3.072mhz。 测试发现现象很奇怪,如果bclk连接的模块阻抗改变,会导致正常应该输出48k的lrck(ws)频率会变动,有时候变成96khz,客户的模块是专用的asic。
客户反应,这个问题同样可以在nxp mimxrt685-aud-evk板子上复现,因为aud-evk fc2p0_14连接到了外部led的驱动电路:
如果是官方的代码配置,不会复现问题,如果是使用客户的代码,能够复现问题。
如果断开r397 1_2的电阻,问题就不会复现,连接之后就会复现。
所谓复现:测试p0_15 lrck采样率从期望的48khz变成了96khz:
所谓不复现:测试p0_15 lrck采样率就是期望的48khz:
从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即可。
可以看到,如果配置为full output driver,驱动能力是normal输出的两倍。所以,问题出在bclk的引脚驱动能力这块。
然而,推荐客户改变驱动能力的方式,纵然可以输出正确的48khz采样率波形,客户并不接受,认为高驱动能力也代表着功耗的加大,而他们的产品是对功耗要求极高的,必须要在普通驱动能力下解决问题。所以进一步分析波形,通过使用高采样率的示波器20gsa/s,2g探头抓取出问题时候的bclk,可以发现有一些毛刺:
通过内部的沟通,也认为这个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); 测试结果如下:
可以看到波形很光滑,毛刺消失,输出也是稳定的48khz,满足客户不改变驱动能力的要求。
小结 在使用i.mx rt600 fc2做i2s的时候,为了bclk不受外部电路影响,从而影响到ws的波形频率,建议引脚配置以下二选一:
1. 使用full output drive,提高驱动能力2. 使用慢slewrate,滤掉bclk上升下降小毛刺
最后,特别感谢nxp 苏州se团队 james fan 在该解决方案上提供的大力支持!作者:周晶晶
传统安防的升级,视频监控系统呈燎原之势
数字孪生的新应用,通过智能技术提高建筑安全性
无线热像仪WiFi模组技术的应用
ST的MP1系列MPU
!销售/收购/维修HP8562E頻譜分析儀HP 8562E小
i.MX RT600 BCLK受干扰影响WS频率解决方案
波士顿动力机器人组团跳舞:跳舞背后的原理是什么呢
示波器高压探棒—揭秘高品质示波器的关键配件
全球顶尖的11家科技公司全部都在“热火朝天”得搞人工智能
家庭预防近视是关键,研究证明OLED自发光电视蓝光更少更护眼
如何用uClinux系统设计汽车黑匣子?
大功率充电堆技术
HOLTEK新推出HT66FxxA最佳性价比Enhanced Flash MCU系列
性能稳定优势显著 智芯传感ZXP5机油压力传感器具备多项亮点
物流无人机市场爆发 企业纷纷布局 空域问题最受关注
Hi3518EV300开发板源码编译方式
VCS1301S磁阻传感器在电子锁上的应用
推荐一款增添家庭无线娱乐生活的装备 蓝牙3D立体眼镜
测评:一加OnePlus 6手机显示屏的像素超过12英寸是无法分辨的
导热硅胶片解决5G通信路由器天线模块导热问题