前段时间在论坛中下了C6657的SRIO驱动代码,并进行了调试,能够很好的进行维护操作、NWRITE、NREAD和DOORBELL操作。但是发现一个问题,利用CCS5进行开发过程中,第一次load程序,运行SRIO_init,然后进行维护操作可以读取到交换芯片的信息,但是如果不断电再次load程序,SRIO_init可以通过,但是维护操作失败,0x0290B158寄存器为0x00020002,报输出错误。查看第一次load和第二次load时所有的SRIO寄存器和PSC寄存器,发现都是一样的。我查看了程序,第二次程序代码会根据PSC的状态,有一个srio复位的操作,单步运行程序发现srio的所有寄存器也确实是进行了复位操作。请问是什么问题导致了初始化后的SRIO操作的失败。
顺便问一下,CCS5的复位是不是跟软件复位是一样的,我试过,利用仿真器复位SRIO寄存器并不会清零。
谢谢解答
chen chen6:
这个问题我也遇到过,每次重新load程序,如果不断电重启板卡的话,SRIO也是报你所述信息,同问~
Brighton Feng:
这个可能是SRIO ACKID不一致造成的。
复位的DSP上的ACKID会变成0,而没复位的switch那边的ACKID没有清零。如果下电再上电的话,双方都会重新初始化ACKID,所以会一致。
详细信息请参阅SRIO协议,如附件,在其中搜索ACKID可以找到相关信息。
在我们的例程中的KeyStone_SRIO_match_ACK_ID可以用来实现一些错误恢复的方法。
Lew Yu:
回复 Brighton Feng:
那我可以这样理解不:
dsp端的初始化是正确的,在维护或读写操作时因为switch的ackid没有清零,导致操作错误。需要dsp通过维护操作来清除switch的ackid。是吗
Brighton Feng:
回复 Lew Yu:
你的理解是对的
Lew Yu:
回复 Brighton Feng:
那我还有点疑问:
如果我第一次维护操作了交换芯片,然后复位dsp,此时dsp和switch的ackid将不一致。那么dsp对switch的进一步维护操作将失败。那我又怎么通过维护操作来修改switch中的ackid呢。
谢谢解答
Brighton Feng:
回复 Lew Yu:
有些命令是不依赖ACKID的。
具体细节请研究协议。
相关代码可以参考我们例程中的:
void KeyStone_SRIO_match_ACK_ID(Uint32 uiLocalPort, Uint32 uiDestID, Uint32 uiRemotePort)
yl2008new:
我们也曾经遇到过类似的问题,SRIO接口不掉电的情况下如果反复初始化可能会导致双方握手出现问题引起端口不通,应该是演示程序中握手机制不完整所造成的。