搜索
bottom↓
回复: 13

CY7C68013的Bulksrc第二次IN的数据有误

[复制链接]

出0入0汤圆

发表于 2014-10-9 11:19:50 | 显示全部楼层 |阅读模式
用EP6作BULK IN, 代码如下:

void TD_Init(void)             // Called once at startup
{
        WORD i;

   // set the CPU clock to 48MHz
   CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1) ;

   // set the slave FIFO interface to 48MHz, PORTS mode
   IFCONFIG |= 0x40;

   gpio_Init();

  // default: all endpoints have their VALID bit set
  // default: TYPE1 = 1 and TYPE0 = 0 --> BULK  
  // default: EP2 and EP4 DIR bits are 0 (OUT direction)
  // default: EP6 and EP8 DIR bits are 1 (IN direction)
  // default: EP2, EP4, EP6, and EP8 are double buffered

  // we are just using the default values, yes this is not necessary...
  EP1OUTCFG = 0xA0;
  EP1INCFG = 0xA0;
  SYNCDELAY;     
      
  EP2CFG = 0xA2;                        //EP2 is DIR=OUT, TYPE=BULK, SIZE=512, BUF=2x
  SYNCDELAY;   
            
  EP4CFG = 0xA2;
  SYNCDELAY;   
            
  EP6CFG = 0xE2;
  SYNCDELAY;   
         
  EP8CFG = 0xE2;
  SYNCDELAY;
  // out endpoints do not come up armed
  
  // since the defaults are double buffered, we must write dummy byte counts twice                  
  EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.
  SYNCDELAY;
                    
  EP2BCL = 0x80;
  SYNCDELAY;  
                  
  EP4BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.
  SYNCDELAY;
                    
  EP4BCL = 0x80;   
  SYNCDELAY;

  for (i=0;i<512;i++)
     EP6FIFOBUF[i] = i+3;
  SYNCDELAY;                    //
  EP6BCH = 0x02;
  SYNCDELAY;                    //
  EP6BCL = 0x00;

  for (i=0;i<512;i++)
     EP6FIFOBUF[i] = i+4;
  SYNCDELAY;                    //
  EP6BCH = 0x02;
  SYNCDELAY;                    //
  EP6BCL = 0x00;


  // enable dual autopointer feature
  AUTOPTRSETUP |= 0x01;
}


void TD_Poll(void)              // Called repeatedly while the device is idle
{
        if((EP2468STAT & bmEP6EMPTY))
          {
                SYNCDELAY;                //
              EP6BCH = 0x02;
              SYNCDELAY;                //
              EP6BCL = 0x00;
               
                SYNCDELAY;                //
              EP6BCH = 0x02;
              SYNCDELAY;                //
              EP6BCL = 0x00;
          }
}

初始化时往EP6的两个buffer 里填充数据,当两个buffer空时重新arm,第一次IN的数据正确,第二次IN的数据为32行相同的F4, F5,....,03,请教问题出在哪了?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2014-10-9 11:32:26 | 显示全部楼层
用bulksrc例程不加任何改动是同样的效果

出0入0汤圆

发表于 2014-10-9 12:50:39 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2014-10-9 15:16:47 | 显示全部楼层

出0入0汤圆

发表于 2014-10-9 15:42:52 | 显示全部楼层
虽然是两个buffer,但是MCU只能看到一个。也就是当前的buffer。empty时是个什么状态?两个buffer都为空?
为什么当两个buffer空时重新arm??
你还是多读读datasheet再来问吧,直接贴代码没人会给你看的。

出0入0汤圆

发表于 2014-10-9 16:06:53 | 显示全部楼层
4K缓冲区都用的话需要配置。发一堆代码上来确实没人看的

出0入0汤圆

 楼主| 发表于 2014-10-9 16:44:49 | 显示全部楼层
zcoder 发表于 2014-10-9 15:42
虽然是两个buffer,但是MCU只能看到一个。也就是当前的buffer。empty时是个什么状态?两个buffer都为空?
...

对于IN端点,empty时表示两个buffer都available,firmware可以load 数据,当然‘FULL’ is more useful for IN transfers,但是用empty也没有错误,只是host取数据时可能buffer里面还没有load数据,bulksrc例程里用的if(!(EP2468STAT & bmEP6FULL))而不是 if((EP2468STAT & bmEP6EMPTY)),但也存在同样的问题。

出0入0汤圆

 楼主| 发表于 2014-10-9 16:46:36 | 显示全部楼层
zhoujustin108 发表于 2014-10-9 16:06
4K缓冲区都用的话需要配置。发一堆代码上来确实没人看的

EP6是2×512,所有端点都采用的默认配置

出0入0汤圆

发表于 2014-10-9 17:18:10 | 显示全部楼层
yonghhu 发表于 2014-10-9 16:44
对于IN端点,empty时表示两个buffer都available,firmware可以load 数据,当然‘FULL’ is more useful f ...

都说了MCU只能看到当前的buffer。你需要重新把buffer写入数据,然后再arm发给主机。

出0入0汤圆

 楼主| 发表于 2014-10-9 17:26:25 | 显示全部楼层
zcoder 发表于 2014-10-9 17:18
都说了MCU只能看到当前的buffer。你需要重新把buffer写入数据,然后再arm发给主机。
...

既然只能看到当前buffer,那就不能往两个buffer里面都写入数据,可在bulksrc里面初始化时有这样的语句:

  // fill up both IN endpoints

  for (i=0;i<512;i++)
     EP6FIFOBUF = i+2;
  SYNCDELAY;                    //
  EP6BCH = 0x02;
  SYNCDELAY;                    //
  EP6BCL = 0x00;

  for (i=0;i<512;i++)
     EP6FIFOBUF = i+2;
  SYNCDELAY;                    //
  EP6BCH = 0x02;
  SYNCDELAY;                    //
  EP6BCL = 0x00;


岂不是往同一个buffer里面写了两次?这个bulksrc程序也是存在同样的问题

出0入0汤圆

 楼主| 发表于 2014-10-9 17:29:17 | 显示全部楼层
什么情况下一个buffer成为“当前buffer”?

出0入0汤圆

发表于 2014-10-9 23:00:45 | 显示全部楼层
本帖最后由 zcoder 于 2014-10-9 23:02 编辑
yonghhu 发表于 2014-10-9 17:26
既然只能看到当前buffer,那就不能往两个buffer里面都写入数据,可在bulksrc里面初始化时有这样的语句:
...


EP6FIFOBUF 不是个指针?EP6FIFOBUF = i+2; ??

轮流成为当前buffer。MCU填好数据后,buffer控制权给USB,主机取走数据后控制权回到MCU,多个buffer控制权同时回到MCU时,排队!

出0入0汤圆

 楼主| 发表于 2014-10-10 21:07:59 | 显示全部楼层
EP6FIFOBUF = i+2;这句应该为EP6FIFOBUF[i] = i+2;着急敲错了

TD_Poll()函数里面改成
        if(!(EP2468STAT & bmEP6FULL))
          {
                  for (i=0;i<512;i++)
                     EP6FIFOBUF[i] = i+3;
                SYNCDELAY;                //
              EP6BCH = 0x02;
              SYNCDELAY;                //
              EP6BCL = 0x00;
          }

问题依旧。

哪怕我的程序有各种问题,可官方提供的bulksrc怎么也是这种结果呢?难道就应该这样吗

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-10-10 23:12:38 | 显示全部楼层
重新找了一块板子,现在正常了,看来芯片硬件出问题了。
多谢讨论。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-17 19:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表