完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
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程序是否是因为没有维护函数的原因? |
|
相关推荐
5个回答
|
|
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循环 |
|
|
|
liuqin123 发表于 2018-6-21 13:27 感谢你的回复。 还想请问一下,在维护函数中Keystone_SRIO_match_ACK_ID(0, FPGA_SRIO_BASE_ID, 2);第二个参数是对方的deviceID,在我这种应用场景下,该设备ID应该是交换芯片的设备ID?还是应该是FPGA的? 因为始终没有找到交换芯片的deviceID,所以一直使用的是FPGA的deviceID,但是也能读写成功,即返回值为0. 谢谢。 |
|
|
|
testd023 发表于 2018-6-21 13:33 SWITCH 应该也有自己的DEVICE ID的,试试呢? |
|
|
|
在调试中,第一次上电我们按照交换芯片,FPGA,DSP这样的顺序来load程序,结果可以正常的收发。 之后重新load了交换芯片和FPGA的程序,没有load DSP的程序,DSP端就只能够接收FPGA的数据而不能发送出去,此时端口状态寄存器err_stat显示端口错误,最低字节为6. 然后load了DSP的程序并对DSP进行重新初始化,跑完SRIO的初始化程序之后,端口状态OK,即err_stat寄存器最低字节为2.但此时DSP不能接收数据只能发送数据,这个时候观测交换芯片对应的端口的寄存器,发现端口状态出错,最低字节为6。 请问 1.是否可以这么理解,交换芯片和FPGA重新load程序之后,DSP的SRIO仍然处于已初始化的状态,所以可以直接和交换芯片连接上接收数据,但是为何端口状态会是错误,从而无法发送数据? 2.为何DSP重新进行一次初始化之后,交换芯片那一端的端口状态就变为了错误,导致这个时候DSP只能发送不能接收? 3.出现这些错误的原因是没有进行维护吗? 4.一边端口出错的情况下,应该使用maintenance函数进行维护吗?还是端口出错maintenance函数在这种情况下就没有作用了? 5.如果不是使用maintenance函数,那么这个错误应该怎么解决啊? 谢谢 |
|
|
|
你好,请问你问题解决没有,我最近也在调试srio遇到和你相似的问题
|
|
|
|
只有小组成员才能发言,加入小组>>
309 浏览 1 评论
513 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
754 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
641 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1113 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
226浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
181浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
46浏览 13评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
149浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
158浏览 12评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 13:28 , Processed in 0.826594 second(s), Total 56, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号