单片机/MCU论坛
直播中

刘丹

8年用户 1563经验值
私信 关注
[问答]

I2S 串行数据输入显示延迟串行数据输出?

我正在使用ModusToolbox™将 XMC4500 中的一个 USIC 设置为 I2S 主设备。 由于 XMC4500 的 MTB 设备配置器不支持 I2S,因此我使用XMC™ Lib 手动配置了 USIC。 它似乎基本可以正常工作;SCLK 以正确的速度运行,字地址根据正在写入的通道切换,串行数据输出 (MTSR) 信号根据我从代码传输的内容显示正确的数据。
尽管没有连接从设备,我的逻辑分析仪仍在显示串行数据输入 (MRST) 上的数据,并且它似乎与传输的数据有关,就像启用了环回或类似功能一样:

我不确定为什么我会看到有关 MRST 的数据。
我在 I2S 模式下的 USIC 通道设置中是否遗漏了什么?这是我的初始化代码。未显示的是 MTSR、SCLK 和 WORD_ADDR 在设备配置器中配置为输出引脚,但我需要更改它们的模式以连接到 USIC 通道。MSTR 设置为三态输入,无 ALT 功能。
const XMC_I2S_CH_CONFIG_t I2S_CONFIG_0_channel_config ={  .baudrate = 1411271U,  .data_bits = 16U,  .frame_length = 16U,  .data_delayed_sclk_periods = 1U,  .wa_inversion = XMC_I2S_CH_WA_POLARITY_DIRECT,  .bus_mode = XMC_I2S_CH_BUS_MODE_MASTER};int main(void){    cy_rslt_t result;    // Set ALT2 mode for MTSR and SCLK (driven by USIC I2S)    MTSR_config.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2;    SCLK_config.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2;    WORD_ADDR_config.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2;    /* Initialize the device and board peripherals */    result = cybsp_init();    if (result != CY_RSLT_SUCCESS)    {        CY_ASSERT(0);    }    XMC_I2S_CH_InitEx(XMC_I2S1_CH0, &I2S_CONFIG_0_channel_config, true);    /* Set the frame length, word length and system word length */    XMC_I2S_CH_SetFrameLength(XMC_I2S1_CH0, 64U);    XMC_I2S_CH_SetWordLength(XMC_I2S1_CH0, 16U);    XMC_I2S_CH_SetSystemWordLength(XMC_I2S1_CH0, 16U);    /* Set MSB data shift direction */    XMC_I2S_CH_SetBitOrderMsbFirst(XMC_I2S1_CH0);    /* Set input source for input stage dx0 (receive pin) */    XMC_I2S_CH_SetInputSource(XMC_I2S1_CH0, XMC_I2S_CH_INPUT_DIN0, 0U);    /* Configure the clock polarity and clock delay */    XMC_USIC_CH_ConfigureShiftClockOutput(XMC_I2S1_CH0, XMC_USIC_CH_BRG_SHIFT_CLOCK_PASSIVE_LEVEL_0_DELAY_DISABLED, XMC_USIC_CH_BRG_SHIFT_CLOCK_OUTPUT_SCLK);    XMC_I2S_CH_Start(XMC_I2S1_CH0);    for (;;)    {        XMC_I2S_CH_Transmit(XMC_I2S1_CH0, 0xA5A5, 0);        XMC_DelayUs(500);    }}

回帖(1)

杨万富

2025-7-17 17:48:09

基于您的描述,XMC4500 USIC 配置为 I2S 主设备时出现串行数据输入(MRST)显示异常数据(与发送数据相关),这很可能源于 接收数据输入源配置错误或内部环回模式被意外启用。以下是关键原因和解决方案:




根本原因分析




  1. 内部环回模式(Loopback)被启用

    若发送数据(MTSR)直接路由到接收端(MRST),即使无物理从设备,逻辑分析仪也会在 MRST 上看到与发送数据相似的波形。




  2. 输入源(DX0)配置错误

    I2S 接收数据(MRST 信号)应连接到 DX0A(引脚输入)。若配置为其他内部信号源(如 DX0B、DX0C 或发送数据反馈),会导致 MRST 接收到内部产生的数据。






解决方案:修正 USIC 配置


请检查并修改以下配置代码(以 XMC Lib 为例):


1. 禁用环回模式


// 确保环回模式已禁用
XMC_USIC_CH_DisableLoopback(USIC_CHANNEL); // 使用 XMC_USIC0_CH0 等具体通道

2. 正确设置接收数据源(DX0)


// 将 DX0 输入源设置为引脚(DX0A),而非内部反馈
XMC_USIC_CH_SetInputSource(USIC_CHANNEL, XMC_USIC_CH_INPUT_DX0, XMC_INPUT_A);

3. 验证 DX0CR 寄存器配置


检查数据输入控制寄存器(DX0CR)的设置:



  • DSEL 位域必须为 0x0(对应 DX0A)。


  • INSW 位应设为 0(输入信号来自引脚)。


    使用寄存器调试时,确保:


    USIC_CHANNEL->DX0CR = (uint32_t)(0 << 0); // DSEL=0 (DX0A)



4. 检查接收通道初始化


确保接收 FIFO 和帧配置未隐式启用内部反馈:


// 接收初始化示例(禁用不必要的反馈路径)
XMC_USIC_CH_RXFIFO_Configure(USIC_CHANNEL,
                             XMC_USIC_CH_FIFO_SIZE_16WORDS,
                             XMC_USIC_CH_FIFO_POINTER_0,
                             0); // 禁用反馈路径



关键配置点总结
































配置项 正确值 错误值(导致问题)
环回模式 DISABLED ENABLED
DX0 输入源 XMC_INPUT_A (引脚) XMC_INPUT_B/C/D
DX0CR.DSEL 0x0 (DX0A) 非0(如 DX1B=0x5)
数字反馈路径 禁用 意外启用



其他排查建议




  1. 物理引脚检查

    确认硬件上 MRST 引脚未短路连接到 MTSR 或 SCLK 信号。




  2. 寄存器快照调试

    使用调试器读取以下寄存器值,验证配置:



    • USIC_CHx->DX0CR:确保 DSEL=0, INSW=0

    • USIC_CHx->SCTR:检查反馈位 FLEDFLDFU 是否为 0

    • USIC_CHx->PCR_SSCMode:确认环回位 LPBK=0




  3. 最小化测试代码

    临时注释掉接收相关初始化(如 XMC_USIC_CH_RXFIFO_Enable()),观察 MRST 信号是否消失。若是,则问题聚焦在接收配置。




  4. XMC Lib 版本更新

    若使用旧版 Lib,请升级到最新版本(修复已知配置错误)。






通过上述修正,MRST 引脚上的异常数据应消失(无物理从设备时 MRST 应保持静态电平或高阻态)。若仍有问题,请提供 USIC 通道初始化代码片段进一步分析。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分