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.

[参考译文] CCS/TMDSEVM6678:在超链接中检测到致命错误

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/957698/ccs-tmdsevm6678-fatal-error-detected-in-hyperlink

器件型号:TMDSEVM6678

工具/软件:Code Composer Studio

您好~

我正在尝试使用 hyplnk_evmc6678_C66BiosExampleProject 对 EVM1 (C6678)<-> EVM2 (C6678)进行通信测试。

我运行 hyplnk_evmc6678_C66BiosExampleProject。 EVM1和 EVM2中。

基本上、当在两个 EVM 上仅使用 core0运行示例时、它可以正常运行、没有任何问题。

通过超链接连接两个芯片、用于唤醒每个 DSP 中的所有内核。

我 想在一个芯片的内核之间使用 IPC、并在芯片之间使用超链接。

因此、我修改  了 hyplnk_evmc6678_C66BiosExampleProject。

 1..cinit:在配置文件中,L2SRAM -> MSMCSRAM

 2.要仅在 DNUM 为0时运行、请在 hyplnk_evmc6678_C66BiosExampeProject 中添加 main.c (在 EVM_init()中启用所有内核)和修改后的 main()-> hyplnk_main ()线程  

案例1: EVM1[8core up]<->EVM2[8core up]  

结果: “检测到致命错误”   

只有当 EVM1和 EVM2内核都被使用时、才会在超链接测试期间发生"检测到致命错误"。
它基于基本示例、但我不知道要修改哪个部分、因此我联系您...

日志如下

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

[C66xx_0]即将进行系统设置(PLL、PSC 和 DDR)
电源域已启用。 您可能在没有重置设备的情况下重新运行(这是正常的)
已构造 SERDES 配置:PLL=0x00000228;RX=0x0046c495;TX=0x000ccf95
系统设置工作正常
即将设置 HyperLink 外设
=================================== 超链接测试端口0
================================================================================ 在初始化之前开始寄存器===========
修订版寄存器内容:
RAW = 0x4e901900
状态寄存器内容:
RAW = 0x00000004
链路状态寄存器内容:
RAW = 0x00000000
控制寄存器内容:
RAW = 0x00000000
控制寄存器内容:
RAW = 0x00000000
=================== 在初始化之前结束寄存器===========
等待另一侧升高(0)
SERDES_STS (32位)内容:0x03078d1b;LOCK = 1
等待另一侧升高(1)
=================== 初始化后开始寄存器===========
状态寄存器内容:
RAW = 0x04402005
链路状态寄存器内容:
RAW = 0xccf00000
控制寄存器内容:
RAW = 0x00006204
=================== 初始化后结束寄存器===========
等待5秒钟以检查链路稳定性
分析每个通道的连接
前体1分析:0、1、0、1、0、1、0、1、000
光标:19分析:1、0、1、0、1、0、1
链路看起来稳定
尝试读取远程寄存器
=================== 在初始化后开始远程寄存器===========
状态寄存器内容:
RAW = 0x0440200b
链路状态寄存器内容:
RAW = 0xfdf0bdf0
控制寄存器内容:
RAW = 0x00006204
=================== 在初始化后结束远程寄存器===========
外设设置工作正常
[hyplnk_main:735]条目...(DNUM:0)
版本号:0x02010008;字符串 HYPLNK LLD 修订版本:02.01.00.08:OCT 26 2020:13:53:37
即将读取/写入一次
即将读取/写入一次
检测到严重错误   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 致命错误
本地致命 ISR status.lError = 1.
本地致命 ISR status.rError = 1.
本地致命 ISR ECERRS.dblErrGet = 1.

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

CASE2: EVM1[core0 only up]<->EVM2[8core up]

结果:超链接测试成功。

我的目标是使超链接在案例1中正常工作。

但是、我无法理解为什么我设置使用所有内核的操作会产生问题。

使用超链接时、主/从配置是否存在错误? (例如超链接主模式。 正确吗?)

如果主/从配置是原因、我想知道如何将一个 EVM 设置为从模式。

附加修改后的代码。

1.仅限 core0 :

jc_hyplnk_test_base.zip

2. 8个内核上:

jc_hyplnk_test_base_mult.zip

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

    我找到导致"检测到致命错误"的代码。
    在 hyplnkIsr.c 中的 hyplnkExampleIsr()中,无法检索 Hyplnk_readRegs()中的 regs 值,或者剩余 Interrupts 值为 hyplnk_example_isrNUM_fatal,并显示致命错误。
    此外、查看日志、如果在"等待另一侧出现"后将其连接到另一侧的 EVM、则同一日志将重复输出两次、并输出致命错误。
    这就是 hyplnk 在两个内核上运行的样子。

    [C66xx_0]启用主 Core 0
    版本号:0x02010008;字符串 HYPLNK LLD 版本:02.01.00.08:OCT 26 2020:13:53:37
    关于执行系统设置(PLL、PSC 和 DDR)
    电源域已启用。 您可能在没有器件复位的情况下重新运行(正常)
    构建了 SERDES 配置:PLL=0x00000228;RX=0x0046c495;TX=0x000ccf95
    系统设置程序已着手
    设置 HyperLink 外设
    ================================== 超链接测试端口0
    ================================================================ 在初始化之前开始寄存器===========
    修订寄存器内容:
    RAW = 0x4e901900
    状态寄存器内容:
    RAW = 0x00000004
    链路状态寄存器内容:
    原始 = 0x00000000
    控制寄存器内容:
    原始 = 0x00000000
    控制寄存器内容:
    原始 = 0x00000000
    =================== 在初始化之前结束寄存器===========
    等待另一侧出现( 0)
    SERDES_STS (32位)内容:0x03478e1d;LOCK = 1
    等待另一侧升高( 1)
    等待另一侧出现( 2)
    等待另一侧出现( 3)
    等待另一侧出现( 4)
    等待另一侧出现( 5)
    等待另一侧出现( 6)
    等待另一侧出现( 7)
    等待另一侧出现( 8)
    等待另一侧出现( 9)
    等待另一侧出现( 10)
    等待另一侧出现( 11)
    等待另一侧出现( 12)
    等待另一侧出现( 13)
    等待另一侧出现( 14)
    等待另一侧出现( 15)
    等待另一侧出现( 16)
    等待另一侧出现( 17)
    等待另一侧出现( 18)
    等待另一侧出现( 19)
    等待另一侧出现( 20)
    等待另一侧出现( 21)
    等待另一侧出现( 22)
    等待另一侧出现( 23)
    等待另一侧出现( 24)
    等待另一侧出现( 25)
    等待另一侧出现( 26)
    等待另一侧出现( 27)
    等待另一侧出现( 28)
    等待另一侧出现( 29)
    等待另一侧出现( 30)
    等待另一侧出现( 31)
    等待另一侧出现( 32)
    等待另一侧出现( 33)
    等待另一侧出现( 34)
    等待另一侧出现( 35)
    等待另一侧出现( 36)
    等待另一侧出现( 37)
    等待另一侧出现( 38)
    等待另一侧出现( 39)
    等待另一侧出现( 40)
    等待另一侧出现( 41)
    等待另一侧出现( 42)
    [hyplnkExamplePeriphSetup:1241]启用远程通信
    [hyplnkExamplePeriphSetup:1251]获取远程寄存
    器[hyplnkExamplePeriphSetup:1251]获取远程寄存器
    致命错误检测
    到本地致命 ISR 状态。lError = 1
    本地致命状态。rError = 1
    本地 ISR ECCERDEC.rblet = 1本地严重错误 


    如何使 C6678中的 hyplnk 在特定内核上单独运行?
    为了在使用 hyplnk 函数时使用 c6678中的所有8个内核、我是否应该以不同的方式而不是以下面的代码运行8个内核?

    ===========================================

    void EVM_init (void)
    {
    platform_init_flags init_flags;
    platform_init_config init_config;
    uint32_t 内核;
    
    IF (DNUM =0U){
    platform_UART_init();
    platform_UART_set_baudate (115200);
    (void) platform_write_configure (platform_write_printf);
    
    memset (init_flags、0x00、sizeof (platform_init_config));
    memset (&init_config、0x00、sizeof (platform_init_config));
    init_flags.ecc = 1;
    
    if (platform_init (&init_flags、&init_config)!=Platform_eok){
    printf ("平台初始化失败、errno = 0x%x \n"、platform_errno);
    }
    
    printf ("启用主 Core -%d\n"、DNUM);
    
    
    DEVICE_REG32_W (DSCR_KICK0、DSCR_KICK0_KEY);
    DEVICE_REG32_W (DSCR_KICK1、DSCR_KICK1_KEY);
    
    for (core = 1U;core < 8u;core++){
    DEVICE_REG32_W (boot_magic_ADDR (内核)、(uint32_t)&_c_int00);
    platform_delay (1U);
    }
    
    for (core = 1U;core < 8u;core++){
    DEVICE_REG32_W (IPCGR (CORE)、1);
    platform_delay (1000);
    }
    
    }
    MultiProc_setLocalId ((uint16_t) CSL_chipReadDNUM ());
    }
    
    int start_hyplnk (void);// 20201116 main ()-> API by JC
    
    
    int32_t main (void)
    {
    platform_info p_info;
    
    uint16_t core_id;
    
    core_id =(uint16_t) CSL_chipReadDNUM ();
    //System_printf ("%d"、core_id);
    
    ipc_start();
    
    platform_get_info (&p_info);
    switch (core_id){
    情况0:
    System_printf ("0\n");
    platform_delay (1000* 1000);
    start_hyplnk();
    中断;
    案例1:
    System_printf ("1\n");
    中断;
    案例2:
    System_printf ("2\n");
    中断;
    案例3:
    System_printf ("3\n");
    中断;
    案例4:
    System_printf ("4\n");
    中断;
    情况5:
    System_printf ("5\n");
    中断;
    案例6:
    System_printf ("6\n");
    中断;
    案例7:
    System_printf ("7\n");
    中断;
    默认值:
    中断;
    }
    BIOS_start();
    return (0);
    }
    
    
    //int main (void)// 20201116 orig 被 JC
    int start_hyplnk (void)阻止// 20201116任务由 JC
    {
    hyplnkRet_e RetVal;
    uint32_t 令牌;
    uint32_t i;
    int 迭代= 0;
    hyplnkExampleDataBuffer_t * dataBufPtr;
    #ifndef __ARMv7
    uint8_t Mar;
    TSCL = 1;
    #endif
    
    #ifdef infrastructDMA
    Qmss_result localRegion、remoteRegion;
    #endif
    
    defined (SOC_C6678)
    CSL_BootCfgUnlockKicker();
    #endif
    
    /*初始化 EDMA 和 InfraDMA 句柄*/
    #ifdef EDMA
    EDMA3_DRV_Handle hEdma;
    hEdma = NULL;
    #endif
    
    

    ===========================================