linux usb驱动传输摄像头数据_USB 四大传输方式有哪些?

我们知道,传输事务解决了主机、设备之间交互一次数据的问题(请看上节笔记 USB 之传输事务),但是有些端点是需要进行多次双向传输或者多次单向传输的,同时因为设备的功能不同,所需要的带宽和传输特性也不同,那么就需要一个更上层的机制解决以上问题,四大传输应运而生。

控制传输( Control Transfers )、中断传输( Interrupt Transfers )、批量传输( Bulk Transfers )、同步传输( Isochronous Transfers )称之为四大传输。接下来我们看看这些传输各自的特点,同时了解一下这些传输方式在生活中的应用。 控制传输 一种 可靠的双向传输,所有USB设备 必须支持的一种传输方式,该传输一般发生在 端点 0 中,用于USB的枚举、配置(也可能进行其他数据传输)等阶段。而我们接下来需要详细介绍的传输方式就是它。当设备插入主机后,主机通过 端点 0 (还记得前面说它是双向端点吗)进行控制传输,通过一系列的数据交互,主机可以了解设备有多少个接口,有多少可用的端点等各种设备信息。你的设备能否被主机(电脑)正确识别,完全取决于控制传输能否正常进行,这是 USB 学习中最先遇到的拦路虎,也是很多人望而却步的一个地方,但是希望大家通过鱼鹰的介绍能够真正掌握它。在带宽(所谓带宽,可以认为主机对USB总线进行 分时数据传输,比如1秒中使用100毫秒用于控制传输)使用上,高速端点的控制传输不能占用 20 %的微帧(125 us 一个微帧),全速和低速不能超过 10 %(1 ms 一帧)。在控制传输中,为了实现 完整的一次控制传输,一般由三个阶段组成: 建立阶段、数据阶段(该阶段可能没有,由建立阶段的数据决定) 、状态阶段,每一个阶段都由 传输事务组成,即存在三个数据包的传输。 23dc2720273d559cd19fe591d9ac48dd.png我们可以具体看看上面最简单的无数据阶段控制传输(其他传输类似): 89420d6ad25b0f3db882d0c1d1801418.png这里需要特别注意的是,建立阶段一定是 DATA0 数据包,之后如果有数据阶段,将进行翻转,变成 DATA1 ,并且在每次正确数据传输后都会进行一次翻转,这个机制用于保证数据被正确接收,而不是发送方发送的重复数据包(如果对方没有正确接收数据,DATAx不会翻转)。在 状态阶段,一律使用 DATA 1进行回复,状态阶段的数据包中的 数据为 空,也就是说不携带任何数据。同时,根据建立阶段中的数据要求不同,比如要求发送数据或者接收数据,将使用相反的 IN 或 OUT 令牌完成状态阶段,比如建立阶段主机要求发送 15 字节到设备中,那么数据阶段将先使用 OUT 令牌发送数据,之后在状态阶段主机将使用相反的 IN 令牌获得空数据包。因为传输时,可能需要多次传输事务才能完成数据阶段,那么如何判断对方数据传输已经完成,从而让主机不再发送IN或OUT令牌包传输数据呢?有两种可能:如果传输的数据大小刚好是端点支持数据大小的整数倍,比如一个端点最大数据包长度为64字节,如果传输128字节,就需要在最后发送一个空数据包。而如果要传输127字节,那么因为最后一个包不是满负载(只有63字节),所以也将认为数据传输完成。 09a537722d40df06c246e98a0bca6702.png也就是说, 最后一个数据包一定不是满载的,前面的数据包一定是满载的。 这代表了数据阶段的结束。当完成了以上几个阶段,一次 控制传输才算完成。正因为控制传输的情况比较复杂,所以学习起来也比较麻烦,不过鱼鹰会在接下来的 CDC 教程中详细介绍这种传输方式,目前暂时了解即可。 中断传输 中断传输时一种 可靠的 单向传输方式,采用定时轮询的方式收发数据,每次主机对中断端点查询时,如果设备有数据传输,则返回数据,否则NAK,表示未准备好。同理,如果是主机发送数据,如果设备没有准备好接收,也将使用 NAK 回复。如果需要双向传输,必须使用 IN 和 OUT 两个端点。中断传输的延迟有保证,也就是说,可以在有限的延迟中完成传输,并且支持错误重传(在下一个周期进行重传),所以它是可靠的。因为可能产生错误重传,所以中断传输也会采用 PID 翻转的机制保证收发端数据的同步。中断传输一般用于对延迟要求比较严格,同时数据量较小,比如我们常见的键盘、鼠标就是采用中断传输方式。当你的鼠标、键盘插入电脑后,电脑在枚举配置成功后,就会按照描述符中的查询时间定时发送 IN 令牌包,获取所需的数据,如果设备没有数据发送,则回复 NAK。对于全速端点,中断传输的间隔在 1 ms 到 255 ms 之间,对于低速端点,间隔时间限制在10ms到255ms之间, 对于高速端点,间隔为2^bInterval-1×125us, bInterval的值在1到16之间。CMSIS-DAP 调试器使用的就是中断传输,全速模式下1 ms 64 字节一包数据,所以最大传输速率是64 K,速率不是很高,如果使用高速,可以达到125 us 1024 字节,还有一种高速高带宽的中断端点,125 us 微帧内可以进行三次中断传输,即125 us 内可传输 3072 字节。 177c9036b6f35d0b27583da4073553c6.png(注意上图未画出握手包) 批量传输 批量传输是一种可靠的单向传输,但是和中断传输不同,传输延迟没有保证,它会尽可能的利用可以利用的带宽完成传输(说白了,就是个捡漏的),适合数据量比较大的传输。当然如果说总线上只有批量传输,那么延迟也是能保证的,毕竟没人和它竞争带宽。现实中,U盘就是采用批量传输,因为它对时间延迟不是那么严格,只要可靠的完成大量数据的传输即可。 低速设备不支持批量传输,高速设备批量最大包长度为512字节,全速批量可以为 8、16、32、64,选择余地比较大。因为会错误重传,所以需要 PID 的翻转机制,即按照 DATA0 – DATA1 – DATA0 – DATA1……的方式翻转,允许 3 次以下的传输错误,超过三次,主机将认为端点功能错误 (STALL),放弃该端点的传输,需要主机使用控制传输恢复该端点的功能。 b5c4a535938b756c25f5dfb9f6aa30cc.png注意上面的 STALL 回复,这个代表端点错误,一旦回复该 STALL,如果没有主机干预,设备将一直使用 STALL 回复,说明该端点不支持该功能或者产生了错误。 同步传输 这种传输是四大传输中唯一 不可靠的传输方式,但是好处就是可以保证带宽,并且没有延迟,而且因为是不可靠的传输,所以没有握手包,也不支持 PID 翻转,主机在安排这些传输事务时,同步传输拥有最高的优先级。高速同步端点最大包长度为 1024,全速为 1023。高速端点在一个微帧内仅允许一次同步传输事务,而高速高带宽的同步端点可以在一个微帧内传输三次,即3072 Byte / 125us。在现实中,这种传输用于摄像头、USB音响等,因为它们对实时性要求比较高,但是可以容忍错误(摄像头偶尔出现了一帧有错误的画面,没多大关系,因为下一帧画面马上就会传过来)。 d6884285579b8a0d7c6f914b1e73894d.png在前面的介绍中,一直都有帧、微帧的身影,那么它是什么?我们知道,令牌包中有一种特殊的包,称之为 SOF (start of frame)包,格式如下:

bbe9925345d15b37667c07c2e5b0ed58.png

CRC校验为 5 bit,和 11 bit 的帧号刚好凑成 16 bit 两个字节。高速设备中每过 125 us 发出一个微帧,全速每过 1 ms 发出一帧,之后才会开始数据传输。主机在每个帧(微帧)的开始传输一个SOF,每次帧号加 1,当达到 0x7FF 时,将清零重新开始计数。看图理解 SOF 和其他传输的关系: 777f2ba8dfce659e295818d494e31c14.png看上图可以了解到,每过一定时间(1 ms或者 125 us),主机发出 SOF 包,接下来进行传输事务(四大传输中的一种),每一个传输事务中又包含了三个数据包(我们可以认为SOF就是 USB 总线中的时钟信号)。通过上图,我们就可以理解 帧、传输、传输事务、 包之间的关系了。再用另一个图看看四大传输之间的关系: 6c4386b6744093c2cca877bc72f066c8.png可以看到,假如总线中有四类数据需要传输,那么主机将在每帧开始发送SOF包,然后优先安排同步传输,之后安排中断传输,其次是控制传输,最后才是批量传输(大容量传输),所以说批量传输是专业捡漏的。推荐阅读:嵌入式系统优先级详解KEIL 调试经验总结线程CPU使用率到底该如何计算?许久以后,你会感谢自己写的异常处理代码终极串口接收方式,极致效率延时功能进化论(合集)如何写一个健壮且高效的串口接收程序?打了多年的单片机调试断点到底应该怎么设置?| 颠覆认知

-THE END-


其他网友提问汇总

c7034977333432e465281c204c8a467b.gif

 1. 两个线程,两个互斥锁,怎么形成一个死循环?

c7034977333432e465281c204c8a467b.gif

 2. 一个端口号可以同时被两个进程绑定吗?

c7034977333432e465281c204c8a467b.gif

 3. 一个多线程的简单例子让你看清线程调度的随机性

c7034977333432e465281c204c8a467b.gif

 4. 粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数

推荐阅读

【1】 SPI转can芯片CSM300详解、Linux驱动移植调试笔记 必读 【2】 到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】 必读 【3】Linux面试题100道,看看会多少? 【4】Modbus协议概念最详细介绍 必读 【5】I2C基础知识入门 【6】 两个线程,两个互斥锁,怎么形成一个死循环? 【7】多路复用IO内幕  【8】 又一华为程序员进了ICU:压垮一个家庭,一张结算单就够了! 必读
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值