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程序是否是因为没有维护函数的原因?
shuang li1:
回复 Thomas Yang1:
Thomas Yang1
1 是读写成功的
2 退出循环的条件是 除了 读写成功,且uiLocal_inACK_ID+1要等于 uiRemote_out_ACK_ID
3 这里程序本身是看link partner,, 在您的场景中, 是DSP和交换芯片的
4 如果DSP配置成little endian模式,由于RAPID IO协议是基于 big endian传输的,所以在程序中要把维护包的数据值进行反序
uiCompletionCode= KeyStone_SRIO_wait_LSU_completion(uiLSU_No, lsuTransfer.transactionID, lsuTransfer.contextBit);
#ifdef _LITTLE_ENDIAN Uint32 * uipData = (Uint32 *)uiLocalAddress;
//swap maintenance value for little endian *uipData= _swap4(_packlh2(*uipData, *uipData)); #endif
5 重新load才能正常运行的原因一般是ACK ID 没有匹配上,也就是您的测试中,始终没有退出while循环
Thomas Yang1:
回复 shuang li1:
SWITCH 应该也有自己的DEVICE ID的,试试呢?
shuang li1:
回复 Thomas Yang1:
Thomas Yang1
SWITCH 应该也有自己的DEVICE ID的,试试呢?
user6027759:
回复 shuang li1:
你好,请问你的问题是否解决,我也遇到了跟你类似的问题!