lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1908回复:4

EP6固件程序请校正!

楼主#
更多 发布于:2004-11-01 12:25
本人使用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 等。
lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-03 16:15
问题找到了。你猜也猜不到 ,是 KEIL51编译器不支持中文输入,我在里面写了中文注释,编译虽然成功,但不对,把那个中文注释屏蔽后就好了。想不到得问题啊。
free_man_free
驱动小牛
驱动小牛
  • 注册日期2003-08-19
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-01 19:02
呵呵,那12MHz的时钟从哪里来的呀?就是要用到24MHz的晶振,芯片自己是没有晶振的,要靠外接一个24MHz的晶体获得时钟。
既然你自己确定下来了问题可能的出处,那就一个一个试不就知道了!
lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-01 14:25
现在我用的是IFCONFIG|=0X03,使用得是外部时钟,CPUS中默认是用12M的时钟,应该没有什么影响。我也试过。不行啊。
free_man_free
驱动小牛
驱动小牛
  • 注册日期2003-08-19
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-01 13:38
如果你使用的是内部时钟的话(IFCONFIG |= 0x43),会不会产生重复读出两次的情况?
即使不用CPUS,你还是把那条语句加上去吧,因为芯片内部其他的部件也是靠这个晶振做时钟源的。 :D :D :D
游客

返回顶部