2415979_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2415979_zh-CN

2415979_zh-CN

i.MX RT1064 定制板 – SGTL5000 编解码器通过 I2C 无响应

您好,


我设计了一款采用MIMXRT1064处理器和SGTL5000音频编解码器的定制 PCB。


对于 SGTL5000 电路,我遵循了标准/参考 SGTL5000 原理图。


RT1064 和 SGTL5000 之间的连接方式如下:


  • LPI2C1_SCL → GPIO_AD_B1_00

  • LPI2C1_SDA → GPIO_AD_B1_01

  • SAI1_MCLK → GPIO_AD_B1_09

  • SAI1_RXD → GPIO_AD_B1_12

  • SAI1_TXD → GPIO_AD_B1_13

  • SAI1_RX_BCLK → GPIO_AD_B1_11

  • SAI1_RX_LRCLK → GPIO_AD_B1_10


我也附上了原理图的相关部分。


Anushka_SS_0-1790243138656.png



我的主要问题是,在刷写固件后,我没有收到来自 SGTL5000 的任何 I2C ACK 。


我测量了以下电压:


  • SCL ≈ 3.3 V

  • SDA ≈ 3.3 V

  • MCLK 约为1.6 V


为了进行调试,我编写了一个函数,该函数暂时将 I2C 引脚更改为 GPIO,生成 9 个时钟脉冲,执行位操作 I2C 地址扫描,然后将引脚恢复为 LPI2C1。


static void i2c_hw_debug(void)
{
gpio_pin_config_t 输入 =
{
kGPIO_数字输入,
0,
kGPIO_NoIntmode
};


IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_00_GPIO1_IO16, 0U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_01_GPIO1_IO17, 0U);


IOMUXC_SetPinConfig(
IOMUXC_GPIO_AD_B1_00_GPIO1_IO16,
0x00B0U);


IOMUXC_SetPinConfig(
IOMUXC_GPIO_AD_B1_01_GPIO1_IO17,
0x00B0U);


gpio_pin_config_t out_init =
{
kGPIO_数字输出,
1、
kGPIO_NoIntmode
};


GPIO_PinInit(GPIO1, 16, &out_init);
GPIO_PinInit(GPIO1, 17, &in);


for (int i = 0; i < 9; i++)
{
GPIO_PinWrite(GPIO1, 16, 0U);
SDK_DelayAtLeastUs(10U, SystemCoreClock);


GPIO_PinWrite(GPIO1, 16, 1U);
SDK_DelayAtLeastUs(10U, SystemCoreClock);
}


PRINTF("正在扫描 I2C 地址...\r\n");


for (uint8_t addr = 0x03; addr <= 0x77; addr++)
{
如果 (bb_probe(16, 17, addr))
{
PRINTF("在 0x%02X 处找到 ACK\r\n", addr);
}
}


IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL,
1U);


IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA,
1U);
}

如何使用 MIMXRT1064 初始化 SGTL5000 编解码器?为什么即使所有硬件连接和配置看起来都正确,我也没有收到来自编解码器的 ACK?


谢谢。

Re: i.MX RT1064 Custom Board – SGTL5000 Codec Not Responding Over I2C

嗨@Anushka_SS ,

我建议您以evkmimxrt1064_sai示例代码为基础来开发您的应用程序。该代码示例展示了 RT1064 和 WM8960 编解码器的集成。也就是说,我们也提供了fsl_sgtl5000.c/.h驱动程序文件,可以将其作为元器件导入到项目中,只需取消定义CODEC_WM8960_ENABLE并改为定义CODEC_SGTL5000_ENABLE即可启用该驱动程序。SGTL5000 驱动程序文件包含正确初始化和使用此编解码器所需的例程。

如果这有帮助,或者您还需要任何进一步的帮助,请告诉我。

BR,
埃德温。

Re: i.MX RT1064 Custom Board – SGTL5000 Codec Not Responding Over I2C

谢谢。我已经完成了这项工作:使用 SDK 的 fsl_sgtl5000 驱动程序和 CODEC_SGTL5000_ENABLE 创建了一个新项目。问题发生在驱动程序初始化之前:SGTL5000 NAK 其地址(0x0A 和 0x2A,LPI2C 状态 902)。运行时验证:音频 PLL = 786.432 MHz,SAI1 MCLK = 12.288 MHz(从 CCM 寄存器读取),LPI2C 时钟 = 10 MHz。我使用 GPIO_AD_B1_00/01 作为 LPI2C1,使用 GPIO_AD_B1_09 作为 MCLK。SGTL5000 模块通过跳线连接到我的定制 RT1064 板。您能否建议一下硬件方面还有哪些需要检查的地方(焊盘设置、MCLK 信号完整性、RT1064 特有的问题等等)?

Re: i.MX RT1064 Custom Board – SGTL5000 Codec Not Responding Over I2C

我的定制板上同时安装了RT1064和SGTL5000编解码器。我分别测试了每个芯片:用 Teensy 4.1 测试了 SGTL5000,用外部 PJRC SGTL5000 音频扩展板测试了 RT1064。这两个芯片单独使用都没问题,但是当我把它们的引脚焊接在一起时,就无法正常工作,并出现以下输出:

=== SGTL5000 启动测试 ===
I2C扫描(Teensy风格)……
扫描完成:0 个设备
音频锁相环 = 786432000 Hz
SAI1 mux=2 prediv=3 div=15 -> MCLK = 12288000 Hz (预期 12288000)
LPI2C 时钟频率 = 10000000 Hz(预期值为 10000000)
-- 尝试 1 --
CHIP_ID @0x A: status=902 id=0x 0 0
CHIP_ID @0x2A:状态=902 id=0x 0 0
-- 尝试 2 --
CHIP_ID @0x A: status=902 id=0x 0 0
CHIP_ID @0x2A:状态=902 id=0x 0 0
-- 尝试 3 --
CHIP_ID @0x A: status=902 id=0x 0 0
CHIP_ID @0x2A:状态=902 id=0x 0 0
SGTL5000 无应答。停止。

我测量的电压值是:

  • SCL:3.2V
  • SDA:3.2 伏
  • MCLK:1.5–1.6V



Re: i.MX RT1064 Custom Board – SGTL5000 Codec Not Responding Over I2C

更新:MCLK 测试结果

RT1064 板和编解码器板是两个独立的板子,通过跳线连接。我使用来自两个不同来源的 MCLK,并采用相同的 RT1064 I2C 固件对编解码器进行了测试。

测试 1:来自 RT1064 的 MCLK(SAI1_MCLK,GPIO_AD_B1_09,12.288 MHz)

  • 直流万用表测量 MCLK 引脚上的电压,读数约为 1.57 V(电源电压约为 3.1 V)。
  • 慢速位操作 I2C(~1 kHz):编解码器发出 ACK,但 CHIP_ID 读取的是 0xBFFF / 0xA01F 而不是 0xA011。
  • LPI2C 在 5、10、20、50 和 100 kHz 时:每个速度下均为 NAK(状态 902)。
  • 当 MCLK 焊盘设置较弱 (0x1008) 时,编解码器完全没有响应,MCLK 引脚读数约为 0 V。
  • 不同的MCLK焊盘驱动设置没有区别。

测试 2:来自 Teensy 4 的 MCLK(引脚 23)

  • RT1064 MCLK 跳线已从编解码器板上断开。
  • Teensy MCLK 连接到编解码器板的 MCLK 焊盘,Teensy GND 连接到编解码器板的 GND。
  • RT1064 仍然通过跳线驱动 I2C (SCL/SDA)。
  • RT1064 LPI2C 在 100 kHz 时: CHIP_ID = 0xA011 且 CODEC_Init OK 。
  • 使用直流万用表测量 Teensy MCLK,读数约为 1.7 V(3.3 V 电源)。

目前为止的结论
编解码器板、其电源、I2C 线路和 I2C 固件都正常工作。问题只出在来自 RT1064 板的 MCLK 信号上。在万用表上,直流电平看起来正常,但编解码器表现得好像来自 RT1064 的 12.288 MHz 时钟信号无法使用。

Re: i.MX RT1064 Custom Board – SGTL5000 Codec Not Responding Over I2C

请问您能否帮我理解一下为什么RT1064没有通过MCLK引脚向编解码器提供正确的时钟信号?

这可能是硬件相关的问题,还是更有可能是我的 RT1064 程序中的配置问题,例如 MCLK 时钟源、音频 PLL 配置、时钟分频器、引脚多路复用器配置或 SAI 设置?

Tags (1)
No ratings
Version history
Last update:
21m ago
Updated by: