阅读:1509回复:5
---------EP2 AUTO out出现错误数据,请高人指点!---------
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 } --------------------------------部分固件代码--------------------------------------------- |
|
沙发#
发布于:2007-08-23 18:53
等了两天了,还没大侠相助,我顶啊。
|
|
板凳#
发布于:2007-08-24 10:05
看你的问题似乎问题不在于数据传输错误, 除了第一,二字节不对外,其外都对. 好象数据错开了一个字节. 找一找其它的原因, 如:初始化变量, 地址指针等.
|
|
|
地板#
发布于:2007-08-24 11:18
谢谢楼上的回答!
第一,二字节错了不要紧的,关键是第0x401字节错了,而且每次第0x401个字节都有错,这是最要命的,连续数据传输在中间出错一般都是干扰或是信号不稳定造成的,可是如果是干扰或是信号不稳定的话,数据出现错误应该是随机的,不应该总是出现在0x401这个位置上面。 另外,我用的是AUTO in和AUTO out模式,跟指针无关吧? |
|
地下室#
发布于:2007-09-05 21:13
似乎有跟楼上相同的问题了
同求解决方法 |
|
5楼#
发布于:2007-09-07 12:29
时序没匹配好吧
仔细看一下68013的时序,在看看你FPGA的时序,比较一下 |
|