TI中文支持网
TI专业的中文技术问题搜集分享网站

PCIE问题

两片6678进行PCIE通信,LINK和outbound地址使能先后顺序有严格要求吗?

Andy Yin1:

应该先使能outbound地址使能,然后initiate link training,关于6678 PCIe通信,可以参考使用如下STK中的PCIe进行初始化及测试。

http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx

Shuxin Zhao:

回复 Andy Yin1:

我现在遇到的问题是两片6678之间通过PCIE传递256数据,发现中断不能被发送具体情况请您见附件

Shuxin Zhao:

回复 Andy Yin1:

现在两片6678的PCIE存在的问题是我想用PCIE实现从RC到EP传输40个字的通信,然后EP通过查询最后一位的标志位方式确定收到数据。接着EP发送数据给RC,通过中断的方式告诉EP已经将数据发送完毕。RC收到中断之后进行数据校验。我是仿照KEYSTONE那个PCIE例程修改的。例程里面相当于是一开始发送中断做了一个握手协议,单后RC和EP都是通过校验最后一味的方式判断收没收到数据。我不想用这个方式,我想按照上面的方式进行数据传输。并且我修改了keystone的地址映射,以达到我的简单的传输数据的目的。在RC端我没有用到MEMSPACE和PREFETCH_MEM这些寄存器,在RC端我配置的outbound传输寄存器是OB_SIZE = 8M ,OB_OFFSET_INDEX0 = 0x70000001,然后每隔8M往上增加一个region。一直到OB_OFFSET_INDEX31 = 0x7F800001。OB_OFFSETnHI都是0.也就是把RC端的outbound32个region都给使能了。RC端BAR0和BAR1的MASK都是0x0FFFFFFF。我传输数据用的BAR1,BAR1=0x90000000。(正好是EP端outbound的地址)然后RC端的INBOUND传输有4个region,这四个region中我用到了region0。配置如下:IB_BAR0 = 1,IB_START0_LO = 0X90000000 IB_START0_HI = 0; IB_OFFSET0 = 0XA0000000。

在EP端的outbound传输配置是OB_SIZE = 8M OB_OFFSET_INDEX0 = 0X90000001 然后,每隔BM往上递增一个,直到OB_OFFSET_INDEX1 = 0X9F800001。也就是把EP端的outbound 32个region也都使能。EP端的BAR0到BAR5的MASK配置都是0x0FFFFFFF。EP端接收数据也是用的BAR1,INBOUND也是用的region0。配置如下:IB_BAR0 = 1; IB_START0_LO = 0X90000000 ,IB_START0_HI = 0; IB_OFFSET0 = 0XB0000000。还有一处改动的地方是

KeyStone_PCIE_RC_MSI_allocate((PCIE_MSI_Regs *)&gptPCIE_remote_EP_Regs->MSI_CAP, PCIE_NONFETCH_BASE_ADDRESS+((Uint32)&gpPCIE_app_regs->MSI_IRQ)-(Uint32)gpPCIE_app_regs);这个入参把PCIE_NONFETCH_BASE_ADDRESS改成了0x90000000。因为注释上说是用RC的PCIE地址。然后开始发送数据,先都是RC和EP都用查询末尾标志位的方式,发现可以成功传输40个字的数据,也可以最大传输256M字节的数据。现在想把中断加上,于是在EP返回给RC数据之后,挂上了MSI8号中断。发现RC端并没有进入中断服务函数。于是我查了文档看了例程,发现MSI中断与BAR0有关。于是都把RC和EP端改用BAR0。发现中断可以进去,但是EP端却不能给RC端返回数据了。改用BAR1就可以传输数据。于是我就觉得BAR0是用来传送中断信号的。BAR1是用来传数据的。我看例程就是这样的。EP端的outbound用的不是一个地址,一个是0x10000000另一个是0x80000001。因此我想针对我以上的情况,是不是我要做两种地址映射,应该空出传中断的region空出8M。然后从0x90800000这个位置开始传输数据?或者说有没有更好的方法实现我的那个想法

赞(0)
未经允许不得转载:TI中文支持网 » PCIE问题
分享到: 更多 (0)