我正在使用 SYS/BIOS 工业 SDK v2.01.03.02在 ICEv2板上开发一个应用、该应用必须对路由到 latch0/1输入的某些信号的上升沿进行时间戳记。
该应用程序几乎可以完美运行、这意味着我能够正确获取时间戳、但在由于锁存而导致第一次 PDI 中断后 、寄存器0x220的位1永远不会复位。
因此、应用程序会被 PDI 中断悬空。
在伪代码中、这就是它所做的。
Beckhoff slavestack 已被修改、以向应用程序通知锁存事件:
void PDI_ISR (void)
{
(笑声)
UINT16 ALEvent = HW_GetALEventRegister_ISR ();
(笑声)
if (ALEvent & LATCH_EVENT)/* LATCH_EVENT = 0x02*/
{
appl_latch();
}
(笑声)
}
UINT16 APPL_StartInputHandler (UINT16 * pIntMask)
{
bsp_write_word (pruIcss1Handle、0x0303、0x09A8);
bsp_pDI_latch0_control (pruIcss1Handle、0x03);
bsp_pDI_latch1_control (pruIcss1Handle、 0x03);
*pIntMask |= 0x0002;
返回 ALSTATUSCODE_NOERROR;
}
void APPL_Latch()
{
uint8 latchreg = bsp_read_Byte (pruIcss1Handle、0x09AE);
if (latchreg & 0x01)
{
/*锁存0正边沿*/
bsp_get_latch0_POSetge_time (pruIcss1Handle、(uint32*)(&sSynchronizationFsm.latch0PositiveEdge)、(uint32*)(&sSynchronizationFsm.latch0PositiveEdge)+1);
}
if (latchreg & 0x0002)
{
/*锁存0负边沿*/
bsp_get_latch0_negegedge_dime (pruIcss1Handle、(uint32*)(&sSynchronizationFsm.latch0NegativeEdge)、(uint32*)(&sSynchronizationFsm.latch0NegativeEdge)+1);
}
latchreg = bsp_read_Byte (pruIcss1Handle、0x09AF);
if (latchreg & 0x01)
{
/*闩锁1正边*/
bsp_get_latch1_POSetge_time (pruIcss1Handle、(uint32*)(&sSynchronizationFsm.latch1PositiveEdge)、(uint32*)(&sSynchronizationFsm.latch1PositiveEdge)+1);
}
if (latchreg & 0x02)
{
/*闩锁2负边*/
bsp_get_latch1_negegedge_dime (pruIcss1Handle、(uint32*)(&sSynchronizationFsm.latch1NegativeEdge)、(uint32*)(&sSynchronizationFsm.latch1NegativeEdge)+1);
}
}
我验证了在读取锁存时间戳寄存器后、锁存状态寄存器中的相应位被正确复位(0x9AE[1:0]= 0、0x9AF[1:0]= 0)、但 AL 事件寄存器的位1仍然被置位(0x220[1]=1)。
根据 Beckhoff ESC 文档、不应发生这种情况(请参见随附的图像)。
那么、我的问题是:我是否遗漏了什么?
我是否应该添加任何 ESC BSP API 调用来对其进行复位?
或者 PRU 固件中是否有需要修复的问题?
感谢你的帮助。
Paolo Mastrapasqua