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.
您好!
感谢您的关注、以下是我的问题:
我有一个定制板、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 链路初始化结束************* /
谢谢。
您好、Yordan、
请您支持此案例吗?
谢谢。
您好、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%。
谢谢。
谢谢。
您好、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、
从 RapidIO互连规范第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