helloxieyu
驱动牛犊
驱动牛犊
  • 注册日期2005-04-10
  • 最后登录2011-05-25
  • 粉丝0
  • 关注0
  • 积分820分
  • 威望83点
  • 贡献值0点
  • 好评度83点
  • 原创分0分
  • 专家分0分
阅读:1508回复:5

---------EP2 AUTO out出现错误数据,请高人指点!---------

楼主#
更多 发布于:2007-08-22 15:10
EP2 AUTO out出现错误数据,请高人指点!

过程如下:EP2 AUTO OUT,EP6 AUTO IN;通端点2下载到FPGA的2K缓冲,再通过端点6回读上来。
既:每次从电脑端下载递增数"0-2047"到68013的EP2,之后fpga再从EP2将2k数据读出并保存到SRAM里,
再设68013的当前操作端点为EP6 in,SRAM的2K数据又写到EP6并再控制面板显示。

注意:EP6 AUTO in的回读肯定是没有问题的,我试过把FPGA的2K数据固定后通过端点6回读,保证100%正确的,
      那么问题就出在端点2的AUTO OUT。不知是什么原因,是数据及时钟线过长么?还是时钟频率过高?我用的
      是内部30M的IFCLK,用内部48M的IFCLK则数据错得更多,看样子好像跟时钟频率有关,可是我改成用外部
      12.5M的IFCLK后死得更惨,数据错得最多。
      
--------------------------------部分固件代码---------------------------------------------
void TD_Init( void )
{ // Called once at startup

  CPUCS = 0x10;                 // CLKSPD[1:0]=10, for 48MHz operation
                                // CLKOE=0, don't drive CLKOUT
   IFCONFIG = 0xA3;  //in 30M
  // IFCLKSRC=1   , FIFOs executes on internal clk source
  // xMHz=1       , 48MHz internal clk rate
  // IFCLKOE=0    , Don't drive IFCLK pin signal at 48MHz
  // IFCLKPOL=0   , Don't invert IFCLK pin signal from internal clk
  // ASYNC=1      , master samples asynchronous
  // GSTATE=0     , Don't drive GPIF states out on PORTE[2:0], debug WF
  // IFCFG[1:0]=11, FX2 in slave FIFO mode


  // Registers which require a synchronization delay, see section 15.14
  // FIFORESET        FIFOPINPOLAR
  // INPKTEND         OUTPKTEND
  // EPxBCH:L         REVCTL
  // GPIFTCB3         GPIFTCB2
  // GPIFTCB1         GPIFTCB0
  // EPxFIFOPFH:L     EPxAUTOINLENH:L
  // EPxFIFOCFG       EPxGPIFFLGSEL
  // PINFLAGSxx       EPxFIFOIRQ
  // EPxFIFOIE        GPIFIRQ
  // GPIFIE           GPIFADRH:L
  // UDMACRCH:L       EPxGPIFTRIG
  // GPIFTRIG
  
  // Note: The pre-REVE EPxGPIFTCH/L register are affected, as well...
  //      ...these have been replaced by GPIFTC[B3:B0] registers
  
  SYNCDELAY;                    // see TRM section 15.14
  REVCTL = 0x00;
  // NOTE: when using "enhanced packet handling" feature (REVCTL.0=1)
  //       ...the core functions as follows:
  //        - OUTPKTEND is used to skip/commit OUT pkt.
  //        - INPKTEND is used to skip/commit IN pkt.
  //        - EPxBCH/L is used to
  //          - commit cpu sourced pkt.
  //          - modify length of an OUT pkt.
  //        - cpu can not source an OUT pkt in "AUTOOUT" mode
  // - see cpu source out pkt method in BOOL DR_VendorCmnd(); ...
  
  // EP2 512 BULK OUT 4x
  SYNCDELAY;                    //
    EP2CFG = 0xAA;              //1024*2
  // EP6 512 BULK IN 4x
  SYNCDELAY;                    //
  EP6CFG = 0xEA;                //1024*2
  // EP4 and EP8 are not used in this implementation...
  SYNCDELAY;                    //
  EP4CFG = 0x20;                // clear valid bit
  SYNCDELAY;                    //
  EP8CFG = 0x60;                // clear valid bit

  SYNCDELAY;                    //
  FIFORESET = 0x80;             // activate NAK-ALL to avoid race conditions
  SYNCDELAY;                    //
  FIFORESET = 0x02;             // reset, FIFO 2
  SYNCDELAY;                    //
  FIFORESET = 0x04;             // reset, FIFO 4
  SYNCDELAY;                    //
  FIFORESET = 0x06;             // reset, FIFO 6
  SYNCDELAY;                    //
  FIFORESET = 0x08;             // reset, FIFO 8
  SYNCDELAY;                    //
  FIFORESET = 0x00;             // deactivate NAK-ALL

  // 8-bit bus (WORDWIDE=0)...

  // use manual out mode...
  SYNCDELAY;                    //
  EP2FIFOCFG = 0x00;            // AUTOOUT=0, WORDWIDE=0
  SYNCDELAY;
  
  EP2FIFOCFG = 0x10;            // AUTOOUT=1, WORDWIDE=0
  SYNCDELAY;
  
  SYNCDELAY;                    //
  OUTPKTEND = 0x82;             // arm first buffer
  SYNCDELAY;                    //
  OUTPKTEND = 0x82;             // arm second buffer
  SYNCDELAY;                    //
  OUTPKTEND = 0x82;             // arm third buffer
  SYNCDELAY;                    //
  OUTPKTEND = 0x82;             // arm fourth buffer

  // use auto in mode
  SYNCDELAY;                    //
  EP6FIFOCFG = 0x0C;            // AUTOIN=1, ZEROLENIN=1, WORDWIDE=0
}
--------------------------------部分固件代码---------------------------------------------  
helloxieyu
驱动牛犊
驱动牛犊
  • 注册日期2005-04-10
  • 最后登录2011-05-25
  • 粉丝0
  • 关注0
  • 积分820分
  • 威望83点
  • 贡献值0点
  • 好评度83点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-23 18:53
等了两天了,还没大侠相助,我顶啊。
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-08-24 10:05
看你的问题似乎问题不在于数据传输错误, 除了第一,二字节不对外,其外都对. 好象数据错开了一个字节. 找一找其它的原因, 如:初始化变量, 地址指针等.
一起交流,共同提高!
helloxieyu
驱动牛犊
驱动牛犊
  • 注册日期2005-04-10
  • 最后登录2011-05-25
  • 粉丝0
  • 关注0
  • 积分820分
  • 威望83点
  • 贡献值0点
  • 好评度83点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-08-24 11:18
谢谢楼上的回答!
第一,二字节错了不要紧的,关键是第0x401字节错了,而且每次第0x401个字节都有错,这是最要命的,连续数据传输在中间出错一般都是干扰或是信号不稳定造成的,可是如果是干扰或是信号不稳定的话,数据出现错误应该是随机的,不应该总是出现在0x401这个位置上面。
另外,我用的是AUTO in和AUTO out模式,跟指针无关吧?
hange_1983
驱动牛犊
驱动牛犊
  • 注册日期2006-02-24
  • 最后登录2009-11-09
  • 粉丝0
  • 关注0
  • 积分310分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-09-05 21:13
似乎有跟楼上相同的问题了
同求解决方法
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-09-07 12:29
时序没匹配好吧
仔细看一下68013的时序,在看看你FPGA的时序,比较一下
游客

返回顶部