quanxianwang
驱动牛犊
驱动牛犊
  • 注册日期2004-09-24
  • 最后登录2004-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2761回复:8

BULK IN 传输。 急!!!急!!!急!!!

楼主#
更多 发布于:2004-10-29 11:05
大家好
我是个新手,有一个自己感觉到很棘手的问题
bulk in 传输
我的理解如下
主机发出读的请求, D12获取数据之后,向主机发ACK, 随后激活中断, MCU读取中断, 知其为一令牌报, 并把数据靠到MCU缓冲区,将d12缓冲清0。分析令牌报知其为读操作, 设置下一状态位write(FIFO), 等待主机的IN指令。 此时我有疑问, 固件如何获得主机要读数据的长度呢?? 另外我看了一些例子应用程序, 发现如果直接读比方说readfile(), 会在无限等待。 如果先deviceiocontrol(read_write_register)也就是先控制传输, 在读, 数据能读到。因为在控制传输你可以知道要传输的数据大小,wLength。 但是我感觉到我还是理解错误了。 请各位大虾指点。

共同探讨,我们共同进步。

谢谢各位



wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-10-29 15:22
1 设备把数据放到 bulk in 端点的缓冲区。这个长度你可以知道吧。
2 主机发送 bulk in 请求。
3 设备收到 bulk in 请求后,硬件会自动把bulk in端点缓冲区的数据发给主机。长度不用你管,硬件会解析主机发来的bulk in 请求得到长度。
4 bulk in 完成后,设备会产生一个中断,设备固件清除bulk in状态。

大概就这么个过程吧。
xiaozhu912
驱动牛犊
驱动牛犊
  • 注册日期2004-09-27
  • 最后登录2005-08-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-29 15:28
我是这样理解的:
  当主机发出IN命令后,USB核心会查相应Bulk In 端点,看有没有数据,如果有,则发出数据包给主机。主机收到数据后,会发出ACK来相应,告诉USB我已经收到了。若没有,USB则发出NAK以此来相应主机,主机知道后,它会不断地发出IN令牌,与此同时,USB会给MCU一个中断,通知MCU该向端点写数据了,则MCU向端点写相应数据包的大小,当端点写满后,USB会主动把数据上传。


主机是永远处于主动地位,而USB设备则处于被动地位。
IN----数据方向为:设备---〉主机
OUT---数据方向:主机--->设备
主机只能发出ACK,设备能发出:ACK,NAK,STALL;

当然我的意见仅供参考,其实我也是新手,大家互相讨论,这样会少走弯路。
quanxianwang
驱动牛犊
驱动牛犊
  • 注册日期2004-09-24
  • 最后登录2004-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-30 15:47
首先
谢谢各位的回答
当设备处于bulk in状态的时候, 他是要往端点的缓冲写数据。 但是写数据的大小他是怎么得到的。因为写的数据是由软件实现的,大小长度也用改由软件从硬件设备的寄存器读的, 但是从那读呢??

wdy9927兄
如果数据长度是由硬件自动解析, 那我写数据到端点缓冲的时候, 我如何知道我到底写多少?因为写是由设备完成的, 设备得知道写多少吧。 如果是主机向设备写数据我肯定知道他的大小因为缓冲区有长度计数器。
“硬件会解析主机发来的bulk in 请求得到长度“
请问是什么请求??标准请求, 厂商请求, 还是令牌报, 还是其他??我查了好多资料, 只有在控制传输的摄制阶段有此类信息, 但这又不可能,因为只有在控制传输的时候才有。

xiaozhu912

“MCU向端点写相应数据包的大小,当端点写满后,USB会主动把数据上传“
如上所述,如果主机要的数据小于端点缓冲的长度如何??难道也要把数据写满?
 


quanxianwang
驱动牛犊
驱动牛犊
  • 注册日期2004-09-24
  • 最后登录2004-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-10-30 15:50
wdy9927兄

“设备把数据放到 bulk in 端点的缓冲区。这个长度你可以知道吧“

就是这个长度我不知道!!!!!!你告诉我如何得知啊???呜呜!!!_!!_!_!_!_!__!
:(
quanxianwang
驱动牛犊
驱动牛犊
  • 注册日期2004-09-24
  • 最后登录2004-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-10-30 16:01
就是那个设备向端点写的长度, 让我几个星期无法睡眠啊!!!
如何得知??

哎!!!

谢谢各位了
xiaozhu912
驱动牛犊
驱动牛犊
  • 注册日期2004-09-27
  • 最后登录2005-08-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-10-31 18:19
如果写的数据小于端点的大小,那么可以向相应的长度寄存器写你小于端点的大小,USB的SIE然后会自动发送的

(你可以看看你所用的芯片的说明书,我想你可以从那里找到答案)
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2004-10-31 19:12
你想接收什么数据自己怎么会不知道呢?

你也可以这样,主机先用厂家请求,告诉设备把64字节的数据放到缓冲区里。然后再发送64字节的bulk in 请求。

quanxianwang
驱动牛犊
驱动牛犊
  • 注册日期2004-09-24
  • 最后登录2004-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-11-01 10:50
wdy9927兄

您好,
如果你在写应用程序,假如READFILE(其调用的端点是BULK IN传输), 其中的长度不可能是固定的。可是你的固件程序写好就不动了啊。你说呢。我是从设备读数据, 不是向设备写数据. 我查了好多书, 就是没有提及。 我不知道你们在开发的时候是怎么处理的???真是奇怪哎。居然没人提出这问题。

关于你的第二个建议, 是可行的。 谢谢. 可是很遗憾的是, 如果你在此之前先控制传输(告诉设备主机读的长度), 这是不合常理的。 很难适应应用程序的需要。虽然可以实现但是不可取啊。

既然USB2.0协议出来了这么久, 大家用了这么长时间, 肯定是可以直接实现的。 关键是如何实现??我如何获得主机要读的数据。从主机到设备这段路, 对我们透明的地方只有应用程序, 我们写的驱动, 固件程序, 这三部分。

哎,真是很难???
游客

返回顶部