大家好、
我们正在开始制造一个使用 F28069U 作为中央 DSP 的控制板、我们已经完成了对原型的测试、然后开始主要生产、 我们制造了12个器件、只是为了了解它们的行为、我们对此感到非常惊讶、几乎所有12个电路板都显示了加电过程中的不一致性、问题的详细信息如下所示:
我们的系统可以随时以任何频率打开(如每2秒或更长时间打开/关闭),现在我们的代码在这些板上运行, 我们随机尝试打开和关闭它们、大多数情况下代码在加电后立即启动、如果代码未冻结、板上会有一个 LED 闪烁(我们当然检查了所有其他功能)、 但是、假设10次中有2次、DSP 不会启动、它们会保持冻结、LED 也会保持关闭、直到我们必须再次循环通电。
在电源回收后、它们大多开始重新工作、但有时需要多次电源回收、直到 DSP 能够再次启动...
到目前为止、这种行为从未在具有完全相同电路和组件的原型中出现(12个板是其克隆)!
考虑到这一大难题、我们开始调查导致问题的原因、我首先检查电压、启动时的瞬变等、但一切似乎都很好、一旦 DSP 被冻结、电源瞬变中就没有电流下降或异常行为。 (XRS 始终保持高电平,我认为这似乎表明没有欠压或其他与电源相关的问题,...)
之后、我要检查代码、我找到了一个非常奇怪的东西、那就是 DSP 在生产中在以下函数中失败:
void enable_interrupts()
{
EALLOW;
PieVectTable.ADCINT1 = &ADCINT1_isr; /* Hook interrupt to the ISR*/
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; /* Enable interrupt ADCINT1*/
IER |= M_INT1;
EALLOW;
PieVectTable.EQEP1_INT = &EQEP1_INT_isr;/* Hook interrupt to the ISR*/
EDIS;
PieCtrlRegs.PIEIER5.bit.INTx1 = 1; /* Enable interrupt EQEP1_INT*/
IER |= M_INT5;
EALLOW;
PieVectTable.SCIRXINTA = &SCIRXINTA_isr;/* Hook interrupt to the ISR*/
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; /* Enable interrupt SCIRXINTA*/
IER |= M_INT9;
EALLOW;
PieVectTable.ECAP1_INT = &ECAP1_INT_isr;/* Hook interrupt to the ISR*/
EDIS;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1; /* Enable interrupt ECAP1_INT*/
IER |= M_INT4;
EALLOW;
PieVectTable.ECAP2_INT = &ECAP2_INT_isr;/* Hook interrupt to the ISR*/
EDIS;
PieCtrlRegs.PIEIER4.bit.INTx2 = 1; /* Enable interrupt ECAP2_INT*/
IER |= M_INT4;
EALLOW;
PieVectTable.ECAP3_INT = &ECAP3_INT_isr;/* Hook interrupt to the ISR*/
EDIS;
PieCtrlRegs.PIEIER4.bit.INTx3 = 1; /* Enable interrupt ECAP3_INT*/
IER |= M_INT4;
EALLOW;
PieVectTable.ECAN0INTA = &ECAN0INTA_isr;/* Hook interrupt to the ISR*/
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx5 = 1; /* Enable interrupt ECAN0INTA*/
IER |= M_INT9;
// EALLOW;
// PieVectTable.ADCINT1 = &ADCINT1_isr; /* Hook interrupt to the ISR*/
// PieVectTable.EQEP1_INT = &EQEP1_INT_isr;/* Hook interrupt to the ISR*/
// PieVectTable.SCIRXINTA = &SCIRXINTA_isr;/* Hook interrupt to the ISR*/
// PieVectTable.ECAP1_INT = &ECAP1_INT_isr;/* Hook interrupt to the ISR*/
// PieVectTable.ECAP2_INT = &ECAP2_INT_isr;/* Hook interrupt to the ISR*/
// PieVectTable.ECAP3_INT = &ECAP3_INT_isr;/* Hook interrupt to the ISR*/
// PieVectTable.ECAN0INTA = &ECAN0INTA_isr;/* Hook interrupt to the ISR*/
// EDIS;
//
// PieCtrlRegs.PIEIER1.bit.INTx1 = 1; /* Enable interrupt ADCINT1*/
// IER |= M_INT1;
// PieCtrlRegs.PIEIER5.bit.INTx1 = 1; /* Enable interrupt EQEP1_INT*/
// IER |= M_INT5;
// PieCtrlRegs.PIEIER9.bit.INTx1 = 1; /* Enable interrupt SCIRXINTA*/
// IER |= M_INT9;
// PieCtrlRegs.PIEIER4.bit.INTx1 = 1; /* Enable interrupt ECAP1_INT*/
// IER |= M_INT4;
// PieCtrlRegs.PIEIER4.bit.INTx2 = 1; /* Enable interrupt ECAP2_INT*/
// IER |= M_INT4;
// PieCtrlRegs.PIEIER4.bit.INTx3 = 1; /* Enable interrupt ECAP3_INT*/
// IER |= M_INT4;
// PieCtrlRegs.PIEIER9.bit.INTx5 = 1; /* Enable interrupt ECAN0INTA*/
// IER |= M_INT9;
/* Enable global Interrupts and higher priority real-time debug events:*/
EINT; /* Enable Global interrupt INTM*/
ERTM; /* Enable Global realtime interrupt DBGM*/
}
准确的故障点是当代码将 ECAP1与 ISR 挂钩时:
EALLOW;
PieVectTable.ECAP1_INT =&ECAP1_INT_ISR;/*将中断钩到 ISR*/
EDIS;
在故障 DSP 中的这段代码之后、系统进入停止或冻结模式(偶尔也不总是)、我通过启用另一个 GPIO 找到了这一点、我在这里跟踪了问题、因为我的代码现在通过引导加载程序从闪存运行 (为 DFUprog 编写的 USB 引导加载)、现在我将介绍一些其他重要观察结果:
- 我们的控制卡没有本地安装的 JTAG、因此每当 DSP 冻结时、在我连接 JTAG 后、它们就会恢复正常运行!! LED 开始闪烁、看起来一切都很棒、而且只要 JTAG 在电路中、代码就永远不会失败...
- 我尝试使用我们的看门狗、重点是看门狗、每当发生故障时、都会不断复位板、但在我完全回收功率之前、它永远无法将其恢复到正常运行状态(我们使用的是软件看门狗、而不是 NMI)
- 在电路板上、我们没有从外部上拉 GPIO 34或 TDO。 (我检查过、即使是外部上拉电阻也没有区别、似乎问题不在于引导模式选择...)
- 为了消除引导加载程序的影响、我将其删除、并使代码成为独立代码、只是为了确保引导加载程序不会导致问题、并且在没有引导加载程序的情况下、代码偶尔会在同一个位置停止、而不是始终停止(我希望始终如此)
- 我在这里为您附上了我们系统的链接器命令文件。
下面是刻在 F28069U 故障和工作状态上的序列号:
F28069UPNT - G4A - 08AFXHW - G4有故障
工作: F28069UPNT - G4A - 99C4EXW - G4
我找不到方法来跟踪这些芯片的生产日期、但在我看来、由于一些猜测、故障芯片的版本较旧、如第3部分中所述、它以零开始...
那么、现在的问题是:
这是硬件问题还是软件问题、以及如何解决?
提前感谢
John


