您好,
我设计了一款采用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
我也附上了原理图的相关部分。
我的主要问题是,在刷写固件后,我没有收到来自 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?
谢谢。
嗨@Anushka_SS ,
我建议您以evkmimxrt1064_sai示例代码为基础来开发您的应用程序。该代码示例展示了 RT1064 和 WM8960 编解码器的集成。也就是说,我们也提供了fsl_sgtl5000.c/.h驱动程序文件,可以将其作为元器件导入到项目中,只需取消定义CODEC_WM8960_ENABLE并改为定义CODEC_SGTL5000_ENABLE即可启用该驱动程序。SGTL5000 驱动程序文件包含正确初始化和使用此编解码器所需的例程。
如果这有帮助,或者您还需要任何进一步的帮助,请告诉我。
BR,
埃德温。
谢谢。我已经完成了这项工作:使用 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 特有的问题等等)?
我的定制板上同时安装了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 无应答。停止。
我测量的电压值是:
更新:MCLK 测试结果
RT1064 板和编解码器板是两个独立的板子,通过跳线连接。我使用来自两个不同来源的 MCLK,并采用相同的 RT1064 I2C 固件对编解码器进行了测试。
测试 1:来自 RT1064 的 MCLK(SAI1_MCLK,GPIO_AD_B1_09,12.288 MHz)
测试 2:来自 Teensy 4 的 MCLK(引脚 23)
目前为止的结论
编解码器板、其电源、I2C 线路和 I2C 固件都正常工作。问题只出在来自 RT1064 板的 MCLK 信号上。在万用表上,直流电平看起来正常,但编解码器表现得好像来自 RT1064 的 12.288 MHz 时钟信号无法使用。
请问您能否帮我理解一下为什么RT1064没有通过MCLK引脚向编解码器提供正确的时钟信号?
这可能是硬件相关的问题,还是更有可能是我的 RT1064 程序中的配置问题,例如 MCLK 时钟源、音频 PLL 配置、时钟分频器、引脚多路复用器配置或 SAI 设置?