阅读:1298回复:4
auto模式下碰到的一个问题!
我用auto in模式传输数据到PC,按说td_poll()函数应该不用做什么工作,该是一个空函数,手册也是这么说的,可现在我碰到的情况是如果为空则读数据失败,我在td_poll中添加如下代码:
if(EP6CS&&0x04) { SYNCDELAY; // EP6BCH = 0x02; SYNCDELAY; // EP6BCL = 0x00; } 就成功了,很奇怪,请高人指点,估计应该是其他某个地方没设置对,当我又找不到那错了? |
|
|
沙发#
发布于:2007-05-15 09:36
你的端点设置的不是auto模式
就这么简单 |
|
板凳#
发布于:2007-05-15 15:04
下面是我的firmware中的几个关键参数的设置,仔细检查过没错阿,怎么会不是auto in呢:
IFCONFIG = 0xCB;//确保了IFCFG1:0 = 11; EP6CFG = 0xE0; EP6FIFOCFG = 0x0C;//确保EP6FIFOCFG.3 = 1; EP6AUTOINLENH = 0x02; SYNCDELAY; EP6AUTOINLENL = 0x00; SYNCDELAY; |
|
|
地板#
发布于:2007-05-15 15:36
// 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 上述寄存器设置需要加延时 设置完端点reset一下 把没用的端点关掉。比如4,和8 |
|
地下室#
发布于:2007-05-15 16:35
您说的我都作了,我上面只是为了描述重点就剩了些代码,详细如下:
CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD0) ;//bmCLKSPD1->bmCLKSPD0 CPU clock from 48MHz to 24MHz // set the slave FIFO interface to 48MHz //IFCONFIG |= 0x40; IFCONFIG = 0xCB;//can be changed to 0xDB for test; SYNCDELAY; REVCTL = 0x03; SYNCDELAY; EP2CFG = 0xA0; SYNCDELAY; EP6CFG = 0xE0; SYNCDELAY; EP4CFG = 0x20; SYNCDELAY; EP8CFG = 0x60; SYNCDELAY; PINFLAGSAB = 0x00; SYNCDELAY; PINFLAGSCD = 0x00; PORTACFG = 0x00;//need further confirm,now IFCFG[1:0] = 11; SYNCDELAY; FIFOPINPOLAR = 0x00; SYNCDELAY; EP6AUTOINLENH = 0x02; SYNCDELAY; EP6AUTOINLENL = 0x00; SYNCDELAY; FIFORESET = 0x80; SYNCDELAY; FIFORESET = 0x02; SYNCDELAY; FIFORESET = 0x04; SYNCDELAY; FIFORESET = 0x06; SYNCDELAY; FIFORESET = 0x08; SYNCDELAY; FIFORESET = 0x00; SYNCDELAY; EP2FIFOCFG = 0x00; SYNCDELAY; EP6FIFOCFG = 0x0C; SYNCDELAY; INPKTEND = 0x86; SYNCDELAY; INPKTEND = 0x86; SYNCDELAY; INPKTEND = 0x86; SYNCDELAY; INPKTEND = 0x86; SYNCDELAY; OUTPKTEND = 0x82; SYNCDELAY; OUTPKTEND = 0x82; SYNCDELAY; OUTPKTEND = 0x82; SYNCDELAY; OUTPKTEND = 0x82; |
|
|