飞天猩猩
驱动巨牛
驱动巨牛
  • 注册日期2001-09-24
  • 最后登录2008-06-17
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
阅读:1852回复:6

低速USB芯片的传输

楼主#
更多 发布于:2001-10-19 13:13
看到很多同志在谈低速USB芯片时,都强调这样一个问题:每10MS传输8 BYTE的数据。显然这对USB的传输还不是很清楚。我胡乱说几句:

中断传输:在进行中断传输时,确实有一个时间间隔,对于低速芯片,其间隔范围是10-255MS。这种传输是HOST定时查询DEVICE有无数据要想HOST传输,如果有,HOST就响应,接收这些数据,没有就等下一次再去查询。这种传输是单向的,即DEVICE向HOST。这种传输对速度的要求很低,适用于鼠标、游戏杆、键盘等设备。

控制传输:
       这是USB默认的ENDPOINT 0的传输方式,是双向的。可以是DEVICE向HOST,也可以是HOST向DEVICE。如果我们使用低速芯片,又要速度够快,用这种方式是首选。我以HOST向DEVICE传输40个数据为例,谈谈它的流程:1、HOST先发送SETUP,告诉DEVICE要发送数据到DEVICE及数据的数量,然后HOST再发送数据;低速的最大包是8 BYTE,因此数据是8个8个的发,DEVICE每接收完8字节,给HOST发送一个ACK表示接收OK,或发NAK表示接收失败;HOST接收到ACK后,会发下一个8 BYTE。依次类推。
      很多人在谈速度,认为这也不快,怎么减少时间呢?一个好的方法就是减少HOST发送SETUP的时间,这40个数据HOST在一个SETUP内声名,告诉DEVICE有40个数据要发送。这样并不是说低速芯片依次可以发送40BYTE的包,其实还是8个一发,但SETUP时间大大缩短。当然,只要允许,你可以在SETUP声明更大的数据量。这很有效果。

批量传输和同步传输:这在低速芯片是不支持的。不在本文的讨论之内。
AronChu
驱动牛犊
驱动牛犊
  • 注册日期2001-08-01
  • 最后登录2002-01-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-11-08 16:05
难道就没有哪位对HID熟悉的大侠肯指点指点吗?
大家帮我想想办法吧,快挺不住了。
先谢谢了。
Best Regards/Aron Chu
Best Regards/Aron Chu 拉拉拉,拉拉拉,我是个失业的流浪汉!
AronChu
驱动牛犊
驱动牛犊
  • 注册日期2001-08-01
  • 最后登录2002-01-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-11-07 14:01
陌路情人,

您好!再向您请教一个问题.
当用控制传输来双向交换数据时,您的意思是自己写Driver,
可我不大会写Driver,能不能用HID的Driver呢?
按<< USB 大全 >>中写的是(Page160 & 161):
设备的描述符必须识别设备为一个有HID接口的设备,除了默认的控制流程,固件必须支持中断IN终端,...
要发送数据,固件必须支持Get_Report控制传输和中断IN传输;要接收数据固件必须支持Set_Report控制传输,也可能性支持中断OUT传输.
对 HID Client 的控制流程,我的理解如下:
1.  调用API 函数 HidD_GetHidGuid(&hidGuid) 等寻找设备,
    再调用API 函数 CreateFile 建立设备句柄 HidHandle.
2.  调用 API 函数 ReadFile 和 WriteFile 读写设备.
3.  对ReadFile,系统HID.sys自动向设备发一个 Get_Report,
    并自动决定是采用控制传输还是中断传输, (因为HID设备必须支持中断IN传输;
4.  对WriteFile,系统HID.sys自动向设备发一个 Set_Report,
    对 USB Version1.10 ,系统自动决定是采用控制传输还是中断传输.
    对 USB Version1.00 ,系统只能用控制传输.

因我的HID firmware 已完成,Clent 也差不多了(已成功建立句柄并用ReadFile通讯),但我的产品对速度很关心,因此我想问一下
1.按我上面的理解, 用HID Driver 的话无法控制其传输方式,
2.如要用控制传输进行双向传输,则必须自己写Driver,
  不知我的理解对不对?

盼回复! 谢谢!



    
Best Regards/Aron Chu 拉拉拉,拉拉拉,我是个失业的流浪汉!
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-10-19 17:41
好!原来是这样的,好象清醒了些
snakehl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-29
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-10-19 16:30
假如我有50个字节的数据要从HOST 发送到FIRMWARE,采用批量传输方式,该怎么传送。
如果我另有100个字节的数据要从FIRMWARE 发送到HOST,又该怎么办?
飞天猩猩
驱动巨牛
驱动巨牛
  • 注册日期2001-09-24
  • 最后登录2008-06-17
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-10-19 15:02
[QUOTE]原本由 AronChu 发表
[B]谢谢。概念说的很清楚。
不过我还有一些问题。
1.一次最多可以声明多少个数据(可以达1Mbyte吗)。
2.Host 在发完 8byte 后是不是马上可以发第二个 8 byte 呢?
3.如是 Device 向 Host 发数据,Host 是不是要不断查询呢?
4.看了您上面的文章我知道 Firmware 应该怎么样写。
  可 HOST 端的 Driver 要怎么样写呢,哪些是由OS完成?
Thanks and Regards
Aron Chu
 [/B][/QUOTE]
1.依次声明不可以是太大。我曾经试过960 BYTE,但不行,提示是系统资源不够。我用的是480 BYTE。
2。HOST发完后要接收到ACK后才发下一个8 BYTE。
3。DEVICE想HOST发数据,HOST是在查询。
4。DRIVER的编写,主要是SETUP的建立,在WINIOCTL.H中.
AronChu
驱动牛犊
驱动牛犊
  • 注册日期2001-08-01
  • 最后登录2002-01-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-10-19 13:36
谢谢。概念说的很清楚。
不过我还有一些问题。
1.一次最多可以声明多少个数据(可以达1Mbyte吗)。
2.Host 在发完 8byte 后是不是马上可以发第二个 8 byte 呢?
3.如是 Device 向 Host 发数据,Host 是不是要不断查询呢?
4.看了您上面的文章我知道 Firmware 应该怎么样写。
  可 HOST 端的 Driver 要怎么样写呢,哪些是由OS完成?
Thanks and Regards
Aron Chu
Best Regards/Aron Chu 拉拉拉,拉拉拉,我是个失业的流浪汉!
游客

返回顶部