打印

68013的slave fifo模式发送数据出现问题

[复制链接]
2899|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
付小小苏|  楼主 | 2013-6-3 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求教大侠们。我本意是使用68013的slave fifo进行数据传输,外部的数据送直接通过68013送到PC机,但是PC机发送的命令送到68013之后,再转换成用串口发送到外部控制芯片。但是现在发现如果设置REVCTL.0和REVCTL.1为1,那么只能从PC机发送两次命令,第三次开始就总是提示Bulk OUT failed。如果不设置REVCTL.0和REVCTL.1为1,那么可以正常发送数据。这是为什么,急求原因,感激不尽。
void TD_Init(void)             // Called once at startup
{
CPUCS = 0x12;           //设置CPU时钟
FX2LPSerial_Init();
IFCONFIG = 0xCB;   // bit7: IFCLKSRC=1   , FIFO使用内部时钟
                               // bit6: xMHz=1       , 48MHz 内部时钟
                               // bit5: IFCLKOE=0    , 不设置IFCLK引脚为48MHz
                               // bit4: IFCLKPOL=0   , IFCLK引脚不取反
                               // bit3: ASYNC=1      , 主机异步读取数据
                               // bit2: GSTATE=0     , 不把GPIF状态送到PORTE[2:0]
                               // bit[1:0]: IFCFG[1:0]=11, FX2 in slave FIFO mode
SYNCDELAY;
REVCTL = 0x03;       // 必须设置REVCTL.0和REVCTL.1为1,芯片规定
EP6CFG = 0xE2;       // 配置EP6为输入端点,块传输,双缓冲512字节FIFO(与默认配置相同)
SYNCDELAY;
EP4CFG = 0xA0;        
SYNCDELAY;
EP2CFG = 0xA2;
SYNCDELAY;
EP8CFG = 0xE0;
SYNCDELAY;
FIFORESET = 0x80;  // 重设全部 FIFOs
SYNCDELAY;
FIFORESET = 0x02;   // 重设端点2的FIFO
SYNCDELAY;
FIFORESET = 0x04;   // 重设端点4的FIFO
SYNCDELAY;
FIFORESET = 0x06;   // 重设端点6的FIFO
SYNCDELAY;
FIFORESET = 0x08;   // 重设端点8的FIFO
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;   
OUTPKTEND = 0x82;
SYNCDELAY;
OUTPKTEND = 0x82;
SYNCDELAY;
EP6FIFOCFG = 0x0D;  // 设置自动发送IN数据包,能发送0长度数据包
                                    // 数据接口为16bits
EP2FIFOCFG = 0x00;
SYNCDELAY;
PINFLAGSAB = 0x00;   // 配置FLAGA为prog-level flag,判别由FIFOADR[1:0]指向的FIFO
SYNCDELAY;                // 配置FLAGB满标志,判别由FIFOADR[1:0]指向的FIFO
PINFLAGSCD = 0x00;   // 配置FLAGC空标志,判别由FIFOADR[1:0]指向的FIFO
SYNCDELAY;                     // FLAGD一般不使用
FIFOPINPOLAR = 0x04;  // 配置SLWR为高电平有效
SYNCDELAY;
EP6AUTOINLENH = 0x02;  // 配置自动传送的数据包大小,高字节,对Bulk,小于512
SYNCDELAY;            
EP6AUTOINLENL = 0x00; // 配置自动传送的数据包大小,低字节,对Bulk,小于512
         
SYNCDELAY;                    
EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.
SYNCDELAY;                    
EP2BCL = 0x80;
Rwuen=TRUE;
}

void TD_Poll(void)              // Called repeatedly while the device is idle
{   
char order;
  if(!(EP2468STAT & bmEP2EMPTY))
  {
        APTR1H = MSB( &EP2FIFOBUF );
        APTR1L = LSB( &EP2FIFOBUF );
  order = EXTAUTODAT1 ;
  FX2LPSerial_XmitChar(order);
        EP2BCL = 0x80;          // re(arm) EP2OUT
  EP2BCL = 0x80;          // re(arm) EP2OUT
  FX2LPSerial_XmitChar('c');
     
  }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

8

帖子

0

粉丝