lbbbb
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2004-09-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1297回复:2

ezusb fx2的多缓冲机制

楼主#
更多 发布于:2003-09-28 15:28
设定一个端点有四个缓冲区,每个缓冲区大小512字节。采用自动传输模式,如果一次传输的数据不足512字节 那么 usb主机将数据发送到缓冲区,那么当这次传输完成以后,缓冲区中的这些数据 会不会马上发送到外设去?

主机开始下一次数据传输时候,新来的数据,会接着存到该没有占满的缓冲区,还是存到另外一个空的数据缓冲区?
我是lbbbb呀 ^_^
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-09-29 09:05
这有好几种情况,在我实际的调试过程(下传)中发现,如果你第一次没有把端点填满,那么你可以用control panal再传一次数据下去,这一次数据时放在之前的那个缓冲区里的,如果还没有填满,好想就不行了,你可以自己验证,用开发板,你设置的是4缓冲,你可以一次传1个字节下去,连续传5次,如果第五次之后你还能发送成功,那就说明是你说的第一种情况,如果传了四次后不能再下传了,那就说明端点已经认为满了(其实时4个不满包占了4个512的缓冲区),这就是你说的第二种情况。

对于传输情况,那要看你设置的标志了,你是下传数据,而且应该用的是slave fifo或者gpif模式,如果你的外设判断的是当端点满了(也就是查满标志FLAGB),也就是达到2048才读数据,那么不满的包是不会发送到外设去的(对于slave fifo其实是外设读走,不是usb发给外设),如果你查的是半满标志(FLAGA),那么要看你设置的多少才是半满(有2个寄存器,EPxFIFOPFH:L),如果你设置的是1024算半满,那么当数据少于1024时,外设不会把数据读走,因为此时半满标志是无效的。
这样就会有一个问题,当最后一个数据包少于1024时,这个包不会被外设读走,它会留在端点里!这两种情况,当你判断到标志有效是必须读走一批数据,对于前面的情况是2048或者1024

所以还有一个空标志(FLAGC),只有当端点里一个数据都没有时空标志才有效,因此如果你得数据不时512或这1024的整数倍,你最好使用空标志(可以一个字节一个字节的读),只要端点里有数据外设就读,数据在端点里是循环存放的,地址指针也是循环移动的,而且当端点全满后数据就不会再写到端点里,所以你不用担心会有覆盖的事情发生

对于上传数据的情况,如果端点没有满,数据不会发给主机,除非你通过PKTEND声明这个包是个不满包,否则后续的数据是依次存放的,只有当前一个512满了才会存放后一个512,不管你什么时候或者分多少次往端点里放数据

说了一堆废话,希望对你有点用处。
lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-09-28 16:37
缓存区的数据发送取决于你的固件里的配置。可以配置成端点在你想要的数据大小时就发出去。数据满了才发出来。
游客

返回顶部