This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C6678:TMS320C6678中的 SRIO 链接问题

Guru**** 1957125 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/792842/tms320c6678-srio-link-problem-in-tms320c6678

器件型号:TMS320C6678

您好!

感谢您的关注、以下是我的问题:

我有一个定制板、FPGA 通过 SRIO X 2 (5.0GHz)与 DSP (C6678)通信、在我的系统初始化期间、FPGA 将复位 DSP 电源(1.0V 和1.1V)以复位 DSP。

然后、DSP 将从 EEPROM 加载固件。 在我的 DSP 固件中、SRIO 接口将由以下代码(TI 的示例代码)提供。

SRIO 链接后、我的 PC SW 将通过 SRIO 进行读取/写入来验证 DSP DDR3。

但是、在 DDR3测试期间、在 SRIO 链路后重新初始化 SRIO 的可能性约为1.5%、并使 DDR3测试失败。(最后检测到 status0x00020002)由于 FPGA 上没有仅复位 SRIO 的功能、因此怀疑 DSP 在 DDR3测试期间复位 SRIO。 我是否可以知道任何条件/DSP 函数将触发 SRIO 链路复位?

此外、我还发现了一个问题、即在 SRIO 链接(状态从0x1更改为0x2)之后的 DSP 固件中、有用于初始化 SRIO 中断的函数、如您在源代码中看到的那样。

我还尝试在检测到 SRIO 链路后等待50ms、然后转到在高级测试 DDR3、但问题也可以检测到。

附录:DSP 的 SRIO Link 初始化源代码。

/********* SRIO 链接初始化******** /
//最后链接 SRIO
serdes_cfg.commonSetup.inputRefClock_MHz = 250;

//清除配置结构 true 以确保未使用的字段为0
memset (&SRIO_cfg、0、sizeof (SRIO_cfg));

SRIO_cfg.blockEn.bBLK1_LSU_EN = 1;
SRIO_cfg.blockEn.bBLK2_MAU_EN = 1;
SRIO_cfg.blockEn.bBLK3_TXU_EN = 0;
SRIO_cfg.blockEn.bBLK4_RXU_EN = 0;

SRIO_cfg.loopback_mode = SRIO_NO_LOOPACK;

srio_cfg.device_ID_routing_config = dsp0_device_ID_routing_config;
SRIO_cfg.uiNumDeviceId = sizeof (dsp0_device_ID_routing_config)
/ sizeof (SRIO_Device_ID_Routing_Config);

serdes_cfg.commonSetup.loopBandwidth = SERDES_PLL_LOOP_BAD_MID;
srio_cfg.serdes_cfg = SerDes_cfg;

serdesLinkSetup.loopback = SERDES_LOOP_DISABLE;
serdesLinkSetup.txOutputSwing = 0~15;//μ s 表示100到850mVdfpp 之间
serdesLinkSetup.testPattern = SERDES_TEST_DISABLED;
serdesLinkSetup.rxAlign = SERDES_RX_逗 号_alignment_enable;
serdesLinkSetup.rxInvertPolarity = SERDES_RX_NORMAL;
serdesLinkSetup.rxTermination = SERDES_RX_TERM_common_point_ac_耦 合;
serdesLinkSetup.rxEqualizerConfig = SERDES_RX_EQ_ADAPTIVE;
serdesLinkSetup.rxCDR = SERDES_RX_CDR_1;
serdesLinkSetup.txInvertPolarity = SERDES_TX_NORY_POLARITY;

priority_permissing.SupervisorHostID_16b = DSP1_SRIO_BASE_ID;
priority_permissing.SupervisorHostID_8b = DSP1_SRIO_BASE_ID 和0xFF;
priority_permission.uiVbusPriority = 0;
SRIO_cfg.Priority_Permission =&Priority_Permission;

LSU_cfg.lsughp0ShadowImage 设置= SRIO_LSU_SHADOK_REGs_Setup_4_4_4_4_4_4;
LSU_cfg.lsup Grp1ShadowImage 设置= SRIO_LSU_SHADOK_REGs_Setup_4_4_4_4_4_4;
LSU_cfg.lsuIntSetup[0]= LSU_INT_DRIVE_BY_SRCID;
LSU_cfg.lsuIntSetup[1]= LSU_INT_DRIVE_BY_SRCID;
LSU_cfg.lsuIntSetup[2]= LSU_INT_DRIVE_BY_SRCID;
LSU_cfg.lsuIntSetup[3]= LSU_INT_DRIVE_BY_SRCID;
LSU_cfg.lsuIntSetup[4]= LSU_INT_DRIVE_BY_SRCID;
LSU_cfg.lsuIntSetup[5]= LSU_INT_DRIVE_BY_SRCID;
LSU_cfg.lsuIntSetup[6]= LSU_INT_DRIVE_BY_SRCID;
LSU_cfg.lsuIntSetup[7]= LSU_INT_DRIVE_BY_SRCID;
SRIO_cfg.LSU_cfg =&LSU_cfg;

NuCard2_SRIO_Init();

SRIO_INTERRUPTS_Init();
/********* SRIO 链路初始化结束************* /

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您使用的是哪款处理器 SDK RTOS?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Yordan、

    我使用的是 pdk_C667X_1_1_1_1_4、而不是 RTOS。

    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yordan、

    请您支持此案例吗?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Li、

    是否尝试使用 CSL_PSC_enableModuleResetIsolation()启用 SRIO 复位隔离?
    当发生运行时错误时,SRIO_INTERRUPTS_Init()是否有可能复位 SRIO? 您如何确定 SRIO 是否"重新初始化"?
    此外、您是否还发现1.25Gbps 等较低数据速率存在同样的问题?

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Garrett、

    感谢您的回复。

    正如您看到的共享示例代码一样, 不调用 CSL_PSC_enableModuleResetIsolation()。 那么、如果此函数确实有用、我可以在哪里找到有关该函数的更多详细信息。

    任何 SRIO_INTERRUPTS_Init()函数都会导致运行时错误? 或者在什么情况下可能导致 SRIO 链路复位?

    我的 FPGA 中有一个用于检测 SRIO Link 位0 (PORT_UNINIT)的逻辑、如果该位从"0"更改为"1"、我会考虑它被重新插入。 这意味着 SRIO 链路在我的常规 Power REST DSP 之后被复位。   

    当然、我将尝试以较低的数据速率对其进行测试。 但是、当我启动 DSP 并运行我的代码时、我从未遇到过这个问题。

    我的操作序列是: DSP 的 FPGA 复位功率-> DSP 在 DSP 电源复位后加载 EEPROM (I2C)(初始化 DDR3、PLL、SRIO)-> FPGA 等待 SRIO LinkUp (0x2)-> 通过 SRIO 对 DSP 的 FPGA 写入/读取 DDR3 ->通过 SRIO 将自定义位流下载到 DDR3、然后选择 Kick start。

    该问题仅发生在通过 SRIO 对 DSP 的 FPGA 写入/读取 DDR3上、到目前为止、在启动后未检测到"重新启动"问题。 问题约为1~2%。

    谢谢。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Li、

    有关复位隔离、请参阅 SRIO 用户指南第2.3.11节 RapidIO 的复位隔离。

    通常、当发生运行时错误时、CPU 应该复位/重新同步外设、请参阅2.3.14错误处理和记录部分了解错误情况、并参阅端口错误状态(CSR)了解寄存器中捕获的错误。 与 FPGA 类似、在 C6678的 SRIO IP 中、链路故障也被视为致命错误、请参阅表3-87端口错误状态 CSR n 字段说明(地址偏移量0xB158、0xB178、0xB198、0xB1B8)(第2部分、共2部分): 入站或出站端口遇到硬件无法恢复的错误(致命错误)。 写入1清除该位。 该位报告设计无法从以下错误中恢复的情况:
    -四次链路请求试验,接收链路响应,但没有未决的 ackID
    -四次链路请求试用,出现超时错误以进行链路响应。

    我想您在 SRIO_INTERRUPTS_Init()中重置了错误处理/SRIO。

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Garret、

    感谢您的回复、阅读有关复位隔离的用户指南后、我认为我的应用不需要这样的支持。

    正如我在帖子开头提到的、我在收到"已重新输入"错误后发现 SRIO 状态为0x00020002。

    其中 bit 17 Output Error-encountered 意味着: "Output port has encountered (and possly recovered from) a transmission error.(输出端口遇到(并可能恢复)传输错误。) 当位16被置位时、该位被置位。 置位后、保持置位、直到写入逻辑1以清除。" (表3-87)

    我从未看到 bit2:端口错误。 您在之前的回复中提到的位置。

    因此、我不知道为什么会出现传输错误、您能否详细解释输出端口上的传输错误、是由于 FPGA 没有 ACK、还是其他原因?

    此外、我仅在首次启动 DSP 并通过 SRIO 执行 DDR3检查时才遇到此问题。 在正常运行期间从未遇到此错误、而在我的正常运行期间、SRIO 带宽使用率远高于启动后的 DDR3检查。

    正如您所提到的,它可能与 SRIO_Interrups_inits()函数有关,我已经对它进行了审阅,并且无法找到导致 SRIO REST 的任何实例,如下所示代码所示:

    在查看代码后、您能否给出一些意见?

    -------------------------------------- SRIO_INTERRUPTS_Init 函数-------------------------------------------------------

    void SRIO_interrupts_Init (void)

    /*将 SRIO 门铃中断映射到 INT4。
    映射消息描述符累加低优先级通道0中断
    至 INT5*/
    CGEM_regs->INTMUX1 =
    (CSL_GEM_INTDST_N_PLUS_16<<CSL_CGEM_INTMUX1_INTSEL4_SHIFT)|
    (<CSL_CGEM_INTMUX1_INTSEL5_SHIFT);

    /*清除所有 DSP 核心事件*/
    Cgem _REGS->EVTCLR[0]= 0xFFFFFFFF;
    Cgem _REGS->EVTCLR[1]= 0xFFFFFFFF;
    Cgem _REGS->EVTCLR[2]= 0xFFFFFFFF;
    Cgem _REGS->EVTCLR[3]= 0xFFFFFFFF;

    //清除 DSP 内核中断标志
    ICR= IFR;

    //启用 INT4,5.
    //IER = 3|(1<<4)|(1<<5);
    IER = 0;

    /*指向 LL2存储器开头的中断服务表指针*/
    ISTP= 0x800000;

    //启用 GIE
    TSR = TSR|1;

    interrupt_cfg.interrupt_map = INTERRUPT_MAP;
    INTERRUPT_cfg.uiNumInterruptMap =
    sizeof (interrupt_map)/sizeof (SRIO_Interrupt_Map);

    /*中断速率控制在此测试中不使用*/
    interrupt_cfg.interrupt_rate= NULL;
    interrupt_cfg.uiNumInterruptRateCfg= 0;

    ///interrupt_cfg.DoorBell_route_ctl= SRIO_DoorBell_route_TO_DISAGE_INT;
    interrupt_cfg.DoorBell_route_ctl= SRIO_DoorBell_route_TO_General_INT;

    srio_cfg.interrupt_cfg = interrupt_cfg;

    --------------------------------------------------------------------

    非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Li、

    从 RapidIOTm互连规范第4部分:物理层8/16 LP-LVDS 规范粘贴 Blow,该规范解释了您观察到的传输错误:

    --------

    有三种类型的可检测控制符号错误:数据包确认错误、损坏控制符号错误和未损坏的协议违反控制符号。

    数据包确认错误是一个数据包接受或数据包重试控制符号、具有意外的 ackID 值或意外的数据包未接受控制符号。 此错误应导致接收设备进入“Output Error-Stopped”(输出错误-停止)状态,立即停止传输新数据包,并发出重新启动-错误控制符号。 重新启动自错误控制符号接收包含接收器内部状态的响应、包括预期的 ackID。 该预期的 ackID 向发送方指示从何处开始重新传输、因为接口可能已脱离序列。 发送方随后应备份到相应的未接受数据包并开始重新传输。

    ----------

    此致、

    Garrett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、您能否检查随附的"Keystone 软件辅助错误恢复附录"是否有帮助?

    e2e.ti.com/.../0435.Keystone-Software-Assisted-Error-recovery_5F00_addendum.pdf

    此致、
    Garrett

x 出现错误。请重试或与管理员联系。