阅读:1908回复:4
EP6固件程序请校正!
本人使用CYPRESS 芯片,固件配置实现BULK传输 SLAVE模式 ,现配置EP6为AUTOIN模式,外部提供时钟,参考开发手册中的例子差不多,为什么我从端点6读出来的数据会重复写两次,有时又好了不重复,但数据不定期的会重复。代码如下:请教。
void TD_Init(void) // Called once at startup { //int i; // set the CPU clock to 48MHz //CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1 ) ;这里应使用外部时钟,我想没什么影响,可不用 REVCTL=0x03;//// MUST set REVCTL.0 and REVCTL.1 to // SYNCDELAY; IFCONFIG |= 0x03;//use IFCLK pin driven by external logic (5MHz to 48MHz) IFCONFIG |= 0x43;主要是这里影响,例子里是设为0X43 ,但我觉得我不用内部时钟,0X03就可以了。 // use slave FIFO interface pins driven sync by external master // reset EP2 EP6 FIFOs FIFORESET = 0x80; SYNCDELAY; FIFORESET = 0x02; SYNCDELAY; FIFORESET = 0x04; SYNCDELAY; FIFORESET = 0x06; SYNCDELAY; FIFORESET = 0x08; SYNCDELAY; FIFORESET = 0x00; SYNCDELAY; EP6FIFOCFG = 0x0C; // this lets the FX2 auto commit IN packets, gives the // ability to send zero length packets, // and sets the slave FIFO data interface to 8-bits SYNCDELAY; EP6CFG = 0xE2;//默认EP6CFG=0xE2 EP6 is DIR=IN,TYPE=BULK,SIZE=512,BUF=4X; PINFLAGSAB = 0x00;//0xC4; // defines FLAGA as EP2 programmable flag PINFLAGSAB = 0x84; SYNCDELAY; // FLAGB as EP2 full flag PINFLAGSCD = 0x0E;//0x00; // FLAGC EP6 as full flag FLAGD as programmable flag. PINFLAGSCD = 0x0C; // won't generally need FLAGD SYNCDELAY; PORTACFG = 0x00; // used PA7/FLAGD as a port pin, not as a FIFO flag FIFOPINPOLAR = 0x00; // set all slave FIFO interface pins as active low SYNCDELAY; EP6AUTOINLENH = 0x02; // you can define these as you wish, SYNCDELAY; // to have the FX2 automatically limit IN's,this is 0x200 512字节 EP6AUTOINLENL = 0x00; SYNCDELAY; EP6FIFOPFH = 0x82; // you can define the programmable flag (FLAGA) SYNCDELAY; // to be active at the level you wish EP6FIFOPFL = 0x00; // out endpoints do not POR (power-on reset) armed SYNCDELAY; EP2BCL = 0x80; // arm EP2OUT by writing byte count w/skip. SYNCDELAY; EP2BCL = 0x80; SYNCDELAY; EP4BCL = 0x80; // arm EP2OUT by writing byte count w/skip. SYNCDELAY; EP4BCL = 0x80; SYNCDELAY; // enable dual autopointer feature AUTOPTRSETUP |= 0x01; Rwuen = TRUE; // Enable remote-wakeup } 另外延时宏的使用 SYNCDELAY; 有那些要注意的。 读出的数据如下: 00 00 04 04 56 56 77 77 12 12 等,就会重复读出两次来。有时又不会,但数据是不对的。隔几个重复 00 04 56 56 77 12 等。 |
|
沙发#
发布于:2004-11-03 16:15
问题找到了。你猜也猜不到 ,是 KEIL51编译器不支持中文输入,我在里面写了中文注释,编译虽然成功,但不对,把那个中文注释屏蔽后就好了。想不到得问题啊。
|
|
板凳#
发布于:2004-11-01 19:02
呵呵,那12MHz的时钟从哪里来的呀?就是要用到24MHz的晶振,芯片自己是没有晶振的,要靠外接一个24MHz的晶体获得时钟。
既然你自己确定下来了问题可能的出处,那就一个一个试不就知道了! |
|
地板#
发布于:2004-11-01 14:25
现在我用的是IFCONFIG|=0X03,使用得是外部时钟,CPUS中默认是用12M的时钟,应该没有什么影响。我也试过。不行啊。
|
|
地下室#
发布于:2004-11-01 13:38
如果你使用的是内部时钟的话(IFCONFIG |= 0x43),会不会产生重复读出两次的情况?
即使不用CPUS,你还是把那条语句加上去吧,因为芯片内部其他的部件也是靠这个晶振做时钟源的。 :D :D :D |
|