This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DSP28335通过XINTF与FPGA进行数据交互,DSP->FPGA时,写入数据异常

XINTF配置如下

void InitXintf(void) {
// This shows how to write to the XINTF registers. The
// values used here are the default state after reset.
// Different hardware will require a different configuration.

// For an example of an XINTF configuration used with the
// F28335 eZdsp, refer to the examples/run_from_xintf project.

// Any changes to XINTF timing should only be made by code
// running outside of the XINTF.

// All Zones---------------------------------
// Timing for all zones based on XTIMCLK = 1/2 SYSCLKOUT
EALLOW;
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;
EDIS;



EALLOW;
XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
// No write buffering
XintfRegs.XINTCNF2.bit.WRBUFF = 0;
// XCLKOUT is enabled
XintfRegs.XINTCNF2.bit.CLKOFF = 0;
// XCLKOUT = XTIMCLK/2
XintfRegs.XINTCNF2.bit.CLKMODE = 1;

// Zone 0------------------------------------
// When using ready, ACTIVE must be 1 or greater
// Lead must always be 1 or greater
// Zone write timing
XintfRegs.XTIMING0.bit.XWRLEAD = 3;
XintfRegs.XTIMING0.bit.XWRACTIVE = 7;
XintfRegs.XTIMING0.bit.XWRTRAIL = 3;
// Zone read timing
XintfRegs.XTIMING0.bit.XRDLEAD = 3;
XintfRegs.XTIMING0.bit.XRDACTIVE = 7;
XintfRegs.XTIMING0.bit.XRDTRAIL = 3;

// double all Zone read/write lead/active/trail timing
XintfRegs.XTIMING0.bit.X2TIMING = 1;

// Zone will sample XREADY signal
XintfRegs.XTIMING0.bit.USEREADY = 1; //修改值,忽略xready信号
XintfRegs.XTIMING0.bit.READYMODE = 1; // sample asynchronous

// Size must be either:
// 0,1 = x32 or
// 1,1 = x16 other values are reserved
XintfRegs.XTIMING0.bit.XSIZE = 3;
EDIS;

}

使用ZONE0区域 通信代码如下

void CommunicationFPGA(void)
{



                GpioDataRegs.GPACLEAR.bit.GPIO5 = 1;            //D_G_A 使能A相数据总线收发器
                GpioDataRegs.GPASET.bit.GPIO30 = 1;             //D_G_B 禁止B相总线收发器导通
                GpioDataRegs.GPBSET.bit.GPIO32 = 1;             //D_G_C 禁止C相总线收发器导通

                GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;           //A_G_A****地址线总线收发器使能,低电平使能
                GpioDataRegs.GPASET.bit.GPIO1 = 1;             //A_G_B地址总线禁止
                GpioDataRegs.GPBSET.bit.GPIO39 = 1;            //A_G_C

                GpioDataRegs.GPASET.bit.GPIO4 = 1;             //D_DIR_A 总线收发器方向,DSP->FPGA
                GpioDataRegs.GPASET.bit.GPIO3 = 1;

                *(sendStart + 0) =Value;
                *(sendStart + 1) =Value;
                *(sendStart + 2) =Value;
                *(sendStart + 3) =Value;
                *(sendStart + 4) =Value;
                *(sendStart + 5) =Value;
                *(sendStart + 6) =Value;
                *(sendStart + 7) =Value;


                GpioDataRegs.GPACLEAR.bit.GPIO4 = 1;             //D_DIR_A 总线收发器方向,FPAG->DSP
                GpioDataRegs.GPASET.bit.GPIO3 = 1;
            /*  receFPGAmessage[0] = *(receStart + 0);    //第一个子模块电压
                receFPGAmessage[1] = *(receStart + 1);    //第二个子模块电压
                receFPGAmessage[2] = *(receStart + 2);    //第三个子模块电压
                receFPGAmessage[3] = *(receStart + 3);    //第三个子模块电压
                receFPGAmessage[4] = *(receStart + 4);    //第四个子模块电压
                receFPGAmessage[5] = *(receStart + 5);
                receFPGAmessage[6] = *(receStart + 6);
                receFPGAmessage[7] = *(receStart + 7);    //第六个子模块电压

                receFPGAmessage[8] = *(receStart + 8);    //第七个子模块电压
                receFPGAmessage[9] = *(receStart + 9);    //第七个子模块电压
                receFPGAmessage[10] = *(receStart + 10);    //第八个子模块电压
                receFPGAmessage[11] = *(receStart + 11);    //第八个子模块电压
                receFPGAmessage[12] = *(receStart + 12);    //第八个子模块电压
                receFPGAmessage[13] = *(receStart + 13);    //第八个子模块电压
                receFPGAmessage[14] = *(receStart + 14);    //第八个子模块电压
                receFPGAmessage[15] = *(receStart + 15);    //第八个子模块电压*/

                GpioDataRegs.GPASET.bit.GPIO5 = 1;              //D_G_A 禁止A相数据总线收发器
                GpioDataRegs.GPASET.bit.GPIO2 = 1;             //A_G_A禁止A相地址总线收发

                return;
}

Value值为9;

仿真时,通过查看memory观察,数据异常,而且没有什么规律

已经测试过FPGA时序是正常的

求大神告知

  • 您是否有尝试  XINTF Power Up Workaround 的方法?

    调试XINTF的最直接方法是在写入数据时使用示波器观察其引脚活动。这将使您能够验证控制信号的时序和逻辑电平。

  • 您好,我们通过ChipScope观察一些使能引脚时序,均为正常,在之前我们检查硬件问题时,发现若发送数据1,XD0电平应该是3.3V,但是实际上通过示波器观测电压只有1V。 但是这似乎不影响数据的传输,现在当FPGA像DSP接收数据时,DSP接受的数据基本正常(有些微小误差)但是当DSP发送数据给FPGA时,向地址写入数据,通过仿真器观察,这些地址的数据并不是我写入的数据。FPGA接受到的数据是我memory里面观测到的数据

  • 看着好像XINTF和FPGA之间存在线路争用,XINTF和FPGA之间的争用很容易导致数据损坏,因为两个端点都试图同时控制总线。
  • 您好,感谢您的答复!

    我们目前有了新的进展,现DSP->FPGA时,FPGA可以接收到正确的数据,但是在接受数据期间会有多次跳变,如图所示

    发送的数据依次为1,1,255,地址分别为0x4000  0x4001 0x4002. 可以看到第二个数据出现问题,在地址变为4001时,接受到了1,但是随后又跳变成为0,又跳变为1,又跳变为0,后面还有几组数据类似这种情况,是个很奇怪的问题,目前怀疑可能是FPGA的亚稳态问题或者是XINTF时序不匹配导致。
  • 我建议验证一下FPGA是否满足异步协议的控制信号和时序要求。

    例如,根据TRM的波形图表明,只有在Write操作的ACTIVE和TRAIL阶段,才保证数据总线有效:

    datasheet里面提供了有关Setup和Hold时序的更多详细信息

  • 您好,我们检测到时硬件出现了问题,应该是三态缓冲器出错,目前已更换板子,并且按照您的建议修改了时序,消除了一些不利影响。十分感谢!!
  • 客气了,祝你后期调试顺利
  • 您好,我也碰到了类似的问题,您这里的三态缓冲器出错,是指哪里的三态缓冲器呢,谢谢!
  • 就是DSP与FPGA之间的,我们只用了这种

x 出现错误。请重试或与管理员联系。