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.

[参考译文] TMS570LC4357:MSP16:如何测试SPI ECC?

Guru**** 2465890 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1088977/tms570lc4357-msp16-how-to-test-spi-ecc

部件号:TMS570LC4357

各位专家,您好!

《安全手册》和《技术参考手册》均未提供有关如何测试SPI RAM的ECC逻辑的详细说明。 SafeTi Lib甚至没有提到此测试。
据我所能判断,这是进行测试的方式:

对于MibSPI1:
1.将一些值写入TX-buffer 1 (地址= 0xFF0E 0000h)
2.打开TESTMODE (0x1至EDAC_MODE)
3.在地址0xFF0E 0000 + 0x400h (正常模式)时翻转1 ECC位(单位错误)
4.禁用testmode (0x0到EDAC_mode)
5从地址0xFF0E 0000h读取
6.检查ESM 1.77 和PAR_ECC_Statt寄存器是否存在单位错误
7.打开TESTMODE (0x1至EDAC_MODE)
8.再次翻转位以纠正故障
9.禁用testmode (0x0到EDAC_mode)

11....对双位错误执行相同操作,但翻转两个ECC-Bit并检查ESM 1.17

(Q1)这是否是测试ECC机制的正确方式?

谢谢,顺祝商祺!
最大

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

    您好,我们的专家在4月7日之前不在办公室。 请期待回复延迟。

    此外,请参阅此常见问题解答: software-dl.ti.com/.../index.html

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

    您好,Max,

    您可以使用SDL API:SL_selftest_mibpsi()

    1.启用 ECC内存测试启用: PAR_ECC_CTRL寄存器的第8位

    2.启用RXRAM访问: MIBSPIE寄存器的位16

    3.启用ECC诊断模式: ECCDIAG_CTRL寄存器的位[3:0],以启用ECC空间的读/写功能

    4.启用 单位错误事件:Bit[27:24], PAR_ECC_CTRL寄存器的SBE_EVT_EN, 以在检测到1位错误时启用错误生成。

    5.翻转位于一个MibSPI RAM (或ECC值)位置的1位或2位数据  

    6.启用SECCED:Bit[3:0],  PAR_ECC_CTRL寄存器的Eden,以启用ECC错误检测

    7.读取数据  

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

    QJ:您好!

    初始化SPI时,启用单位错误事件(SBE_EVT_EN)和SECCED (PAR_ECC_CTRL)。

    这意味着可以跳过步骤4和6。 正确吗?

    谢谢,顺祝商祺!
    最大

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

    您好,Max,

    我会仔细检查一下,然后明天早上回来。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这405.6831万这意味着可以跳过步骤4和6。 正确?[/QUOT]

    1.对于1位ECC测试, 应禁用SBE_EVT_EN,否则只要翻转数据位,就会更正数据(步骤5)。

    2.应在mibspiInit()中启用Eden (par_ecc_CTRL),以确保在 mibspiInit() 程序状态位到TX RAM和RX RAM时正确编程ECC。  

    3. 在翻转位之前需要禁用Eden (PAR_ECC_CTRL),否则ECC将被更新

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

    /**初始化MIBSPI */
    mibspiInit();-->  应该启用SECCED ( par_ecc_CTRL寄存器的Eden=0xA)

    //1. Enable ECC memory test enable (启用ECC内存测试启用):PAR_ECC_CTRL寄存器的位8
    mibspiredg1->par_ecc_CTRL = 0x0A5.0105万;-->SECCED被禁用,并启用错误信号

    //2. 启用RXRAM访问:MIBSPIE寄存器的位16
    //mibspireG1->MIBSPIE |=1<16;-->  如果只测试TX RAM,则不需要

    //3. 启用ECC诊断模式:ECCDIAG_CTRL寄存器的位[3:0],以启用对ECC空间的写入/读取
    mibspireG1->ECCDIAG_CTRL = 0x5;//启用ECC写入  -->如果不更改ECC位则不需要

    //4. 启用单位错误事件:Bit[27:24],PAR_ECC_CTRL寄存器的SBE_EVT_EN,以便在检测到1位错误时启用错误生成。
    mibspireg1->par_ecc_CTRL |= 0x5 << 24; -->禁用1位ECC纠错,如果在步骤1中禁用此步骤,则不需要此步骤

    //5. 翻转位于一个MibSPI RAM (或ECC值)位置的1位或2位数据

    //*(unsigned int*)(0xFF0e0404)^= 0x01; -->反转1位ECC值

    *(unsigned int*)(0xFF0e0004)^= 0x01; -->翻转一位数据  

    //6. 启用SECCED:Bit[3:0],PAR_ECC_CTRL寄存器的Eden,以启用ECC错误检测

    mibspiredg1->par_ecc_CTRL = 0x0A0.501万A;--> 启用SECCED

    无符号int值=*(volatile UINT32 *) 0xFF0E0004U);

    *(unsigned int*)(0xFF0e0004)=备份;

    希望这有帮助。

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

    QJ:您好!

    这很有帮助。 但我对SBE_EVT_EN位的功能有疑问。 我认为这将启用发生单位错误的信号,而不是纠正。

    这就是为什么我认为需要为1位错误测试启用此功能的原因?

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

    您回答正确。  应启用SBE_EVT_EN,但 应禁用EDAC_MODE。

    /**初始化MIBSPI */
    mibspiInit();-->  应该启用SECCED ( par_ecc_CTRL寄存器的Eden=0xA)

    //1. Enable ECC memory test enable (启用ECC内存测试启用):PAR_ECC_CTRL寄存器的位8
    mibspiredg1->par_ecc_CTRL = 0x0A5.0105万;-->SECCED被禁用,并启用错误信号

    //2. 启用RXRAM访问:MIBSPIE寄存器的位16
    //mibspireG1->MIBSPIE |=1<16;-->  如果只测试TX RAM,则不需要

    //3. 启用ECC诊断模式:ECCDIAG_CTRL寄存器的位[3:0],以启用对ECC空间的写入/读取
    mibspireG1->ECCDIAG_CTRL = 0x5;//启用ECC写入  -->如果不更改ECC位则不需要

    //4. 启用单位错误事件:Bit[27:24],PAR_ECC_CTRL寄存器的SBE_EVT_EN,以便在检测到1位错误时启用错误生成。
    mibspireg1->par_ecc_CTRL |= 0xA <24;-->启用单位错误事件

    //5. 禁用 SECDED检测到的SBE校正

    mibspireg1->par_ecc_CTRL |= 0x5<16;--> 禁用1位ECC纠错,如果在步骤1中禁用此步骤,则不需要此步骤

    //6. 翻转位于一个MibSPI RAM (或ECC值)位置的1位或2位数据

    //*(unsigned int*)(0xFF0e0404)^= 0x01; -->反转1位ECC值

    *(unsigned int*)(0xFF0e0004)^= 0x01; -->翻转一位数据  

    //7. 启用SECCED:Bit[3:0],PAR_ECC_CTRL寄存器的Eden,以启用ECC错误检测

    mibspiredg1->par_ecc_CTRL = 0x0A0.501万A;--> 启用SECCED

    无符号int值=*(volatile UINT32 *) 0xFF0E0004U);

    *(unsigned int*)(0xFF0e0004)=备份;