imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
阅读:1833回复:10

in token中断和短包中断的问题

楼主#
更多 发布于:2007-09-30 15:27
好几个月了,在公司里一直在搞设备端的usb,现在对usb理解相对来说比较深刻了,写得程序的枚举,接受,发送 功能也基本实现了,但离最终目标还有很长一段。
但现在又有新的困惑,还请大家指教。我用的芯片是net2272。实际上芯片都差不多,大家完全可以忽略它的影响。

第一个问题,数据发送的时候,in token是pc 发送的,那pc是轮询的发吗?还是只发一次?受不受设备端影响?因为我是用windriver作数据接受试验的。当我在windriver按一下listen to  pipe的时候,就会产生in  token,然后我在我的usb程序里接受到中断,我搬数据到相应的端点,然后windriver里能看到我搬的数据。

第二个问题是,控制端点的,假设大小是64B,我第一次发送的设备描述符18B,这样算不算短包?
因为之前我只知道接受才有短包。还有虽然刚刚只传了18B,但看那个端点还有多少字节剩余的寄存器,数字确是64B,照我的理解应该是46B才对阿。或者是0,那说明,芯片会自动帮你填0在端点里。。64我就百思不得其解了。
vip0126
驱动牛犊
驱动牛犊
  • 注册日期2006-08-31
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分162分
  • 威望27点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-30 16:39
第一个问题,是。不受。我记得host 是不停的发in token的,一旦device有了数据,就会发送到host端
第二个问题,不懂。应该是短包吧。
imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-09-30 21:59
好的,谢谢

短包就是那个数据比最大包小的包。通常最后一个包是短包啊
bance
驱动牛犊
驱动牛犊
  • 注册日期2007-09-23
  • 最后登录2010-11-21
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-01 22:43
第一个问题:记得在看68013的手册时见到过,当采用中断传输方式的时候系统为了保证实时性,周期性的发送IN TOKEN,从而实现主机对设备的轮询。其它方式下的不是很清楚。

第二个问题:短包的没研究过。
imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-01 23:01
好像我也看到过中断方式下是,但我想知道的是bulk方式,不过还是感谢。
bance
驱动牛犊
驱动牛犊
  • 注册日期2007-09-23
  • 最后登录2010-11-21
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-10-01 23:17
我没有看到过确切的说明。

在传入数据的时候,数据无非是放在芯片缓冲区或主机内存中。
方式1:不关主机的程序需不需要只要有数据都先从下边收上来放到内存中再说,要的时候直接丢给程序。
方式2:数据先压在芯片中,当主机确切的说明需要数据的时候,再放上去。

方式1中需要轮询。

如果你是设计师,会选择哪种方式?我选第2种,第一种的话一不小心就会使主机当掉,第二种最多是数据丢失。
中断方式手册中指明要用令牌轮询,批量方式没说,用轮询的可能性较小。
imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-10-03 11:05
我明白你的意思。
对于bulk方式的过程,我是这么理解的:
首先主机发送一个in token,然后设备受到,产生中断,把数据放到芯片缓冲区,然后主机就接受到了数据。主机发送ack。然后重复这一过程。事实上,我的理解是这样的过程是除了isochronous方式之外,其他三种都是这样的。这样的过程我感觉就是轮询。

至于你说的两种方式,方式一中难道就不经过芯片缓冲区,直接数据到主机内存中了吗?
我觉得我们理解的轮询好像有点不一样。

另外,我在2.0协议中以poll关键字查了下,确实在interrupt方式中特别他提到了poll。但我还发现这样的话,
The USB is a polled bus. The Host Controller initiates all data transfers.
leonmcu
驱动牛犊
驱动牛犊
  • 注册日期2007-09-29
  • 最后登录2007-10-30
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-05 08:05
问题1:Polling方式。
问题2:短包。从机回复短包,或空包(0B数据)表示完成一次传输,所以这样的包肯定是一次传输中从机最后所发送的包。
imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-10-06 13:37
谢谢了
imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-10-19 22:59
现在我基本了解了,in token应该是轮询的发
事实上,设备端先发数据到 in端点上,然后使之有效,然后收到in token后,把数据发送出去
,之后产生一个发送完成信号。

实际上和uart的发送查不错。
甚至可能所有的通信方式都这样??
imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-10-24 18:14
引用第0楼imjacob于2007-09-30 15:27发表的 对于usb传输的新困惑 :
第二个问题是,控制端点的,假设大小是64B,我第一次发送的设备描述符18B,这样算不算短包?
因为之前我只知道接受才有短包。还有虽然刚刚只传了18B,但看那个端点还有多少字节剩余的寄存器,数字确是64B,照我的理解应该是46B才对阿。或者是0,那说明,芯片会自动帮你填0在端点里。。64我就百思不得其解了。

.......

算自我解答了。
今天我做了试验后,发现那种情况算是短包。
所以短包是接收和发送都有的。
另外,对于net2272,产生短包中断的同时,必定产生transmitted中断(对于发的情况)或者received中断(对于接收的情况)。理解这个对写程序是有很大帮助的
游客

返回顶部