阅读:1852回复:6
低速USB芯片的传输
看到很多同志在谈低速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声明更大的数据量。这很有效果。 批量传输和同步传输:这在低速芯片是不支持的。不在本文的讨论之内。 |
|
沙发#
发布于:2001-11-08 16:05
难道就没有哪位对HID熟悉的大侠肯指点指点吗?
大家帮我想想办法吧,快挺不住了。 先谢谢了。 Best Regards/Aron Chu |
|
|
板凳#
发布于: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, 不知我的理解对不对? 盼回复! 谢谢! |
|
|
地板#
发布于:2001-10-19 17:41
好!原来是这样的,好象清醒了些
|
|
地下室#
发布于:2001-10-19 16:30
假如我有50个字节的数据要从HOST 发送到FIRMWARE,采用批量传输方式,该怎么传送。
如果我另有100个字节的数据要从FIRMWARE 发送到HOST,又该怎么办? |
|
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中. |
|
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 |
|
|