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.
我们将针对单位和双位错误检测实施 DCAN ECC 测试。 在我们的实施中引用和使用 SafeTI 诊断库代码。
双位 ECC 错误工作正常、但对于单位类型、只能用于首次调用任何 DCAN (1/2/3/4)、当我们 调用 DCAN ECC 针对单位 ECC 功能的自检时
第二次它只在 ECC CS 寄存器中设置 DEFLG (双位标志)、而不设置 SEFLG (单位标志)。
您能不能帮您解释一下为什么它设置双位而不是单位。
您好 Dhana、
如果在与最后一个单位错误相同的位置检测到信号位 ECC 错误、则不会设置 SEFLG。
但不应针对单位 ECC 错误设置 DEFLG。
您好、Wang、
感谢您的回答。 为4个 DCAN 使用不同的 dcanrambase 地址、并尝试在不同的 RAM 位置读取。
仍然看到 single-bit ECC 测试不起作用。 并观察到、在每个 DCAN ECC 测试后调用_memInit_函数时、它工作正常。
但它会清除所有以前的全局数据。
您能不能建议、在测试所有4个 DCAN ECC 测试时、如何使用不同的位置为每个 DAN 设置 ECC 错误。
谢谢
Dhanalakshmi
是的、在访问 DCAN 消息 RAM 之前、应该先对其进行初始化以使 ECC 错误无效。
如果您使用安全诊断库的 sl_DCAN-Selftest(),则不容易将 ECC 注入不同的位置。 您可以编写自己的代码来注入 ECC 错误:
易失性 uint32*数据;
对于(i=1;i<3;i++){
数据=(易失性 uint32 *)(canRAM1+ I * 0x20u + 0x4);
CANREG1->CTL = 0x5 << 10; //PMD = 0x5、禁用 SECDED
canREG1->CTL |= (1 << 7);//启用测试模式
canREG1->CTL |=(1 << 0)//init 位
canREG1->test |= (1 << 9);//启用对 RAM 的直接访问
canREG1->ECCDIAG = 0x5;//启用 ECC 诊断模式
CANREG1->ECC_CS = 0x5 << 24; //启用 SECDED 单个位错误
canREG1->CTL &=~(0xF <<10);
CANREG1->CTL |=(0xA <<10); //启用 SECDED
daraRead =*数据;
检查 ESM 寄存器和 CAN 状态寄存器;
清除错误标志
}
您将看到第二个位置的错误
您好、Wang、
谢谢你。 我尝试使用以下行而不是安全 库(sl_selftest.c)代码行[ data =(volatile UINT32 *)(((((uint32) dcanRAMBase)+(msgNo* 0x20u)));
Data++;]、它现在适用于所有 DCAN 单个位。 我观察 到在 sl_select.c 代码中使用 uint32将 dcanRAMBase 拼写错误增加1个字节(32位)、在1个字节以下增加4个字节。 例如 、如果 dcanRAMBase 地址= 0xFF1E0000;下面一行的代码偏移量更改为0xFF1E0110、而不是0xFF1E0044、则正常工作。
数据=(易失性 uint32 *)(canRAM1+ msgNo * 0x20u + 0x4);其中 msgNo = 2U
谢谢
DhanaLakshmi