6678通过交换芯片CPS1848与FPGA相连通信,现在已经实现了1x 2.5G的通信。
但是每一次改动DSP程序,重新load之后,必须先重新load交换芯片和FPGA的程序才能够再次实现通信。如果不load FPGA和交换芯片的程序,即使一开始port ok,发送一个数据包之后port的状态也会进入错误(根据err_stat寄存器的值得到)。
而且如果是FPGA和DSP双向发送接收的话,每一次按照顺序load完程序(交换芯片,FPGA,最后DSP),DSP程序尚未运行即可以收到FPGA传送过来的数据,但是一旦程序运行,运行完函数Keystone_SRIO_Init(&srio_cfg);之后,接收即终止了,之后也没办法继续接收FPGA传输的数据。而此时DSP可以正常向FPGA传输数据。
不知道是不是因为没有添加维护函数Keystone_SRIO_match_ACK_ID(0, FPGA_SRIO_BASE_ID, 2);的原因?
但是在初始化函数之后添加该维护函数之后,我却一直没办法运行通过该函数,停在了函数的while循环之中如下:
do
{
//set the remote OUTBOUND_ACKID to be same as local INBOUND_ACKID
uiLocal_In_ACK_ID= (srioRegs->RIO_SP[uiLocalPort].RIO_SP_ACKID_STAT&CSL_SRIO_RIO_SP_ACKID_STAT_INB_ACKID_MASK)>>
CSL_SRIO_RIO_SP_ACKID_STAT_INB_ACKID_SHIFT;
uiMaintenanceValue= ((uiRemote_In_ACK_ID+1)<<
CSL_SRIO_RIO_SP_ACKID_STAT_INB_ACKID_SHIFT)|uiLocal_In_ACK_ID;
//set the remote ACK_ID through maintenance packet
uiResult= Keystone_SRIO_Maintenance(uiLocalPort, uiLocalPort, uiDestID,
0x148+(0x20*uiRemotePort), GLOBAL_ADDR(&uiMaintenanceValue),
SRIO_PKT_TYPE_MTN_WRITE);
if(flag_maintenance == 0)
break;
if(uiResult) //fail
continue;
//readback the remote ID
uiResult= Keystone_SRIO_Maintenance(uiLocalPort, uiLocalPort,
uiDestID, 0x148+(0x20*uiRemotePort), GLOBAL_ADDR(&uiMaintenanceValue),
SRIO_PKT_TYPE_MTN_READ);
uiRemote_out_ACK_ID= uiMaintenanceValue&
CSL_SRIO_RIO_SP_ACKID_STAT_OUTB_ACKID_MASK;
}while(uiResult|(uiLocal_In_ACK_ID+1 != uiRemote_out_ACK_ID));
uiResult的值是能够返回0的,也就是读写都成功了?但是uiMaintenanceValue的值在读之后一直是0,导致无法退出循环。
请问该维护函数是DSP和交换芯片之间的读写嘛?还是DSP和FPGA之间的读写?
维护函数始终无法通过是否是因为DSP是小端而交换芯片是大端的原因?
还有始终要load交换芯片和FPGA程序是否是因为没有维护函数的原因?