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

6678 PCIe 与FPGA LINK UP 后 不能获得FPGA的DEVICE_ID和VENDDR_ID

我用的代码模板是C:\ti\pdk_C6678_1_1_2_6\packages\ti\drv\pcie\example\sample 查相关PCIE协议在RC配置EP时是基于ID的跟地址没有关系

6678 PCIe 与FPGA  LINK UP 后 不能获得FPGA的DEVICE_ID和VENDDR_ID 求大神指导 

1.配置DSP为RC ,FPGA为EP

2.本地配置寄存器配置如下:

/* Configure Address Translation */

barCfg.location = pcie_LOCATION_LOCAL; //配置本地的配置寄存器
barCfg.mode = pcie_RC_MODE;
barCfg.base = 0x70000000;//PCIE_IB_LO_ADDR_M;
barCfg.prefetch = pcie_BAR_NON_PREF;
barCfg.type = pcie_BAR_TYPE32;
barCfg.memSpace = pcie_BAR_MEM_MEM;
barCfg.idx = PCIE_BAR_IDX_M;//指定翻译区域1

if ((retVal = Pcie_cfgBar(handle, &barCfg)) != pcie_RET_OK)
{
System_printf ("Failed to configure BAR (%d)\n", (int)retVal);
exit(1);
}

3.配置输入地址转换

/* Inbound 端 使用翻译区域0 32位起始地址:0X90000000 偏移地址位:(0XdstBuf.buf地址)0x00809C00 PCIE:0X90000000 */

ibCfg.ibBar = PCIE_BAR_IDX_M; /* Match BAR that was configured above*/ //使用的是BAR1也可以使用 2,3,4,5 BAR0是给EP的配置空间
ibCfg.ibStartAddrLo = PCIE_IB_LO_ADDR_M;//0x90000000
ibCfg.ibStartAddrHi = PCIE_IB_HI_ADDR_M;//0x00000000
ibCfg.ibOffsetAddr = (uint32_t)pcieConvert_CoreLocal2GlobalAddr ((uint32_t)dstBuf.buf);
ibCfg.region = PCIE_IB_REGION_M; //指定翻译区域0 也可以选择 1、2、3

4 输出地址转换

/* Outbound 端 这里使用翻译区域0 最大能传8M 如果要传大于8M需要再次调用这个函数 偏移地址:0X70000000 srcBuf:0x8108AB50 */
/* PCIE地址 = PCIE_OB_LO_ADDR_M[31:23]+DSP PCIE地址的[22:0](PCIE地址的[27:23]位为选择翻译区域) ,注意地址对齐*/
if ((retVal = pcieObTransCfg (handle, PCIE_OB_LO_ADDR_M(0x70000000), PCIE_OB_HI_ADDR_M(0x00000000), PCIE_OB_REGION_M)) != pcie_RET_OK)

/*PCIE_OB_REGION_M 0 */

 5.LINK UP之后的代码如下

System_printf ("Link is up.\n");

priority.mstPrivID = 11;
setRegs.priority = &priority;
Pcie_writeRegs (handle, pcie_LOCATION_REMOTE, &setRegs);

/* 写FPGA的PCIE BUS FUNCTION DEVICE号 */
remote_cfg_setup.type = 0;
remote_cfg_setup.bus = 0;
remote_cfg_setup.device = 0;
remote_cfg_setup.func = 0;

setRegs.cfgTrans = &remote_cfg_setup;
if ((retVal = Pcie_writeRegs (handle, pcie_LOCATION_REMOTE, &setRegs)) != pcie_RET_OK)
{
System_printf ("SET CMD STATUS register failed!\n");
}
if ((retVal = Pcie_getMemSpaceRange (handle, &pcieBase, NULL)) != pcie_RET_OK) {
System_printf ("getMemSpaceRange failed\n", (int)retVal);
exit(1);
}

/* 读取远程配置寄存器*/
volatile UInt32 *epCfg = (UInt32 *)0x21801000;
int n=0;
for(n = 0; n < 116; n+=4)
{
System_printf("offset: 0x%x : %08x %08x %08x %08x\n", n*4, epCfg[n+0], epCfg[n+1], epCfg[n+2], epCfg[n+3]);
System_flush();
}
/* 读取远程配置寄存器*/
volatile UInt32 *epCfg1 = (UInt32 *)0x21802000;
for(n = 0; n < 116; n+=4)
{
System_printf("offset: 0x%x : %08x %08x %08x %08x\n", n*4, epCfg1[n+0], epCfg1[n+1], epCfg1[n+2], epCfg1[n+3]);
System_flush();
}

6.打印信息如下

Successfully configured Inbound Translation!
Successfully configured Outbound Translation!
Starting link training…
Link is up.
offset: 0x0 : 8888104c 00100146 00000001 00010000
offset: 0x10 : 00000000 70000000 00000000 00000000
offset: 0x20 : 00000000 00000000 00000000 00000000
offset: 0x30 : 00000000 00000040 00000000 000001ff
offset: 0x40 : 00035001 00000000 00000000 00000000
offset: 0x50 : 00807005 00000000 00000000 00000000
offset: 0x60 : 00000000 00000000 00000000 00000000
offset: 0x70 : 00420010 00008001 0005281f 00135422
offset: 0x80 : 10110008 00000040 004003c0 00000000
offset: 0x90 : 00000000 0000001f 00000000 00000006
offset: 0xa0 : 00010002 00000000 00000000 00000000
offset: 0xb0 : 00000000 00000000 00000000 00000000
offset: 0xc0 : 00000000 00000000 00000000 00000000
offset: 0xd0 : 00000000 00000000 00000000 00000000
offset: 0xe0 : 00000000 00000000 00000000 00000000
offset: 0xf0 : 00000000 00000000 00000000 00000000
offset: 0x100 : 00010001 00002000 00000000 00062030
offset: 0x110 : 00000001 00002000 000001ed 00000000
offset: 0x120 : 00000000 00000000 00000000 00000000
offset: 0x130 : 00000057 00000000 00000000 00000000
offset: 0x140 : 00000000 00000000 00000000 00000000
offset: 0x150 : 00000000 00000000 00000000 00000000
offset: 0x160 : 00000000 00000000 00000000 00000000
offset: 0x170 : 00000000 00000000 00000000 00000000
offset: 0x180 : 00000000 00000000 00000000 00000000
offset: 0x190 : 00000000 00000000 00000000 00000000
offset: 0x1a0 : 00000000 00000000 00000000 00000000
offset: 0x1b0 : 00000000 00000000 00000000 00000000
offset: 0x1c0 : 00000000 00000000 00000000 00000000
offset: 0x0 : 00000000 00000000 21802000 00000070
offset: 0x10 : 00000000 00000000 21802000 00000000
offset: 0x20 : 00000000 00000000 21802000 00000004
offset: 0x30 : 00000000 00000000 21802000 00000008
offset: 0x40 : 00000000 00000000 21802000 0000000c
offset: 0x50 : 00000000 00000000 21802000 00000010
offset: 0x60 : 00000000 00000000 21802000 00000014
offset: 0x70 : 00000000 00000000 21802000 00000018
offset: 0x80 : 00000000 00000000 21802000 0000001c
offset: 0x90 : 00000000 00000000 21802000 00000020
offset: 0xa0 : 00000000 00000000 21802000 00000024
offset: 0xb0 : 00000000 00000000 21802000 00000028
offset: 0xc0 : 00000000 00000000 21802000 0000002c
offset: 0xd0 : 00000000 00000000 21802000 00000030
offset: 0xe0 : 00000000 00000000 21802000 00000034
offset: 0xf0 : 00000000 00000000 21802000 00000038
offset: 0x100 : 00000000 00000000 21802000 0000003c
offset: 0x110 : 00000000 00000000 21802000 00000040
offset: 0x120 : 00000000 00000000 21802000 00000044
offset: 0x130 : 00000000 00000000 21802000 00000048
offset: 0x140 : 00000000 00000000 21802000 0000004c
offset: 0x150 : 00000000 00000000 21802000 00000050
offset: 0x160 : 00000000 00000000 21802000 00000054
offset: 0x170 : 00000000 00000000 21802000 00000058
offset: 0x180 : 00000000 00000000 21802000 0000005c
offset: 0x190 : 00000000 00000000 21802000 00000060
offset: 0x1a0 : 00000000 00000000 21802000 00000064
offset: 0x1b0 : 00000000 00000000 21802000 00000068
offset: 0x1c0 : 00000000 00000000 21802000 0000006c

xiaoming wang5:

打印的代码

/* 读取远程配置寄存器*/ volatile UInt32 *epCfg = (UInt32 *)0x21801000; int n=0; for(n = 0; n < 116; n+=4) { System_printf("offset: 0x%x : %08x %08x %08x %08x\n", n*4, epCfg[n+0], epCfg[n+1], epCfg[n+2], epCfg[n+3]); System_flush(); } /* 读取远程配置寄存器*/ volatile UInt32 *epCfg1 = (UInt32 *)0x21802000; for(n = 0; n < 116; n+=4) { System_printf("offset: 0x%x : %08x %08x %08x %08x\n", n*4, epCfg1[n+0], epCfg1[n+1], epCfg1[n+2], epCfg1[n+3]); System_flush(); }

xiaoming wang5:

我顶

xiaoming wang5:

我顶

xiaoming wang5:

我顶

Thomas Yang1:

回复 xiaoming wang5:

建议你详细检查FPGA configuration 空间的配置,即FPGA上BAR0的映射规则,TI DSP侧是BAR0空间是写死的,你可以先用2个TI DSP进行互通测试来做交叉验证

xiaoming wang5:

回复 Thomas Yang1:

非常高兴能接到您的回复,

1.FPGA这边是IP核,我用的是PIO例程 手册上说对于配置空间都是IP核自动响应的,所以问题应该还是出在DSP这边,由于我的DSP的PCIE接口只和FPGA接在了一起 所以没有条件做两个DSP的互相连接

2.目前的情况是LINK UP后 一读远程设备的配置空间0X21802000 DEBUG 就停止

CONSOLE:C66xx_0: Trouble Reading Memory Block at 0x21802000 on Page 0 of Length 0x190: (Error -1202 @ 0x21802000) Device core is hung. The debugger will attempt to force the device to a ready state to recover debug control. Your application's state will be corrupt. You should have limited access to memory and registers, but you may need to reset the device to debug further. (Emulation package 5.1.232.0) 

3.我尝试读取DSP的配置 找到了BAR0掩码寄存器 设置的值不正确 修改后 还是出现2中的情况

麻烦您能不能给我一些DSP作为RC的配置参数 让我挨个对一下 或者  指点下我读取不到远程ID可能是哪的原因

xiaoming wang5:

回复 Thomas Yang1:

还有就是 时钟问题 我系统运行在1G条件下  查看相关TI帖子说  PCIE VBUSM时钟是CLK4   1/3分频  对于我的系统VBUSM的值就是333M 

而我配置FPGA IP核时这个值 是250M  这种情况是否会影响我读取ID呢

xiaoming wang5:

我顶

Thomas Yang1:

回复 xiaoming wang5:

VBUSM CLK时钟是PCIE IP 和内部总线进行数据交换的时钟频率和PCIE SERDES线上时钟无关,只需要保持RC和EP的PCIE data rate 和work mode(如1x和2x)一致即可。

关于配置,你可以查看置顶帖中STK 包中STKcode或者ti pdk code :pdk_install_folder\packages\ti\drv\pcie

xiaoming wang5:

回复 Thomas Yang1:

STK的代码我也试过 但是依然读取不到ID,现在项目卡在这块1个月了 ,非常着急 ,非常需要您的帮助,像我这种情况,我需要做哪些排查才能大致确定问题

赞(0)
未经允许不得转载:TI中文支持网 » 6678 PCIe 与FPGA LINK UP 后 不能获得FPGA的DEVICE_ID和VENDDR_ID
分享到: 更多 (0)