怎么看k线图 初学者学看USB196402

STM32学习之USB深入浅出(一)
第一节:USB设计的基础知识
1.USB设备的插入检测
USB主机是如何检测到设备的插入的呢?首先,在USB集线器的每个下游端口的D+和D-上,分别接了一个15K欧姆的下拉电阻到地。这样,在集线器的端口悬空时,就被这两个下拉电阻拉到了低电平。而在USB设备端,在D+或者D-上接了1.5K欧姆上拉电阻。对于全速和高速设备,上拉电阻是接在D+上;而低速设备则是上拉电阻接在D-上。这样,当设备插入到集线器时,由1.5K的上拉电阻和15K的下拉电阻分压,结果就将差分数据线中的一条拉高了。集线器检测到这个状态后,它就报告给USB主控制器(或者通过它上一层的集线器报告给USB主控制器),这样就检测到设备的插入了。USB高速设备先是被识别为全速设备,然后通过HOST和DEVICE两者之间的确认,再切换到高速模式的。在高速模式下,是电流传输模式,这时将D+上的上拉电阻断开。
一个简单的实验:只用一个上拉电阻接在USB的+5V和D+或者D-上,WINDOWS也会提示发现新硬件,但是无法找到驱动程序。这时去设备管理器里面看,有显示未知USB设备,并且其VID和PID为0。根据这个,我们可以简单的判断设备是否枚举成功。如下图所示,分别是枚举不成功和枚举成功的图。
2.USB的各种设备描述符以及各种描述符之间的关系
USB是个通用的总线,端口都是统一的。但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了。USB的描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符等等。一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。
每种描述符都有自己独立的编号,如下:
下面分别详细介绍一下各描述符。
1.设备描述符
2.配置描述符
3.接口描述符
4.端点描述符
下面是一个配置描述符集合的定义
配置描述符集合的示例
其中关于端点的类型定义如下
端点号的定义如下
已投稿到:博客访问: 2927573
博文数量: 695
博客积分: 13321
博客等级: 上将
技术积分: 8721
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 服务器与存储
1. 概要OTG设备使用插头中的ID引脚来区分A/B Device,ID接地被称作为A-Device,为连接时候的USB Host,A-Device始终为总线提供电力,ID悬空被称作为B-Device,为连接时候的USB Device,设备的USB Host/USB Device角色可以通过HNP切换。OTG设备连接时不能跨越USB Hub,如果跨越USB Hub则失去HNP功能。这里要注意A-Device/B-Device与USB Host/Device不是一回事 没有必然的绑定关系A-Device就一定要是Host,A-Device只是连接时的Host可以通过HNP切换,切换完毕A-Device变成USB Device但是仍然为总线提供电力。2.设备类型Embedded Host:提供标准的A插座,普通的USB Host并带有TPL(支持设备列表)OTG Device:使用Micro AB插座,可以在运行时切换Host/Device。仅外设B-Device:仅仅能作为外设的B-Device(分为插头一体和插头线缆分离的)。注意:OTG Device在插头插入后会先打开VBus,如果没有设备连接则关闭VBus,并开启ADP侦测,而Embedded Host则不会再次关闭VBus。3.协议SRP(Session Request Protocol):B-Device使用。通过数据线上的脉冲,请求A-Device打开VBUS并且开始一个Session。Session为从VBUS打开到关闭这一段时间。支持:A-Device允许回应SRP,B-Device(包括仅能作为外设的B-Device),允许发起SRP。一个能够支持HNP的B- Device应该能够发起SRP。当A插头插入时关闭VBus的Host必须支持回应SRP,VBus总是打开的Host不必响应SRP。ADP(Attach Detection Protocol):提供设备检测是否有对端设备插入。支持:任何OTG设备,Embedded Host,支持SRP的B-Device允许ADP Probing,B-Device和仅能作为外设的B-Device还必须支持ADP Senseing如果他们支持ADP Probing。HNP(Host Negotiation Protocol):OTG设备通过HNP来切换Host/Device角色。当前的USB Host通过HNP Polling(类似Polling Hub)通过轮询GetStatus()命令返回的数据中的Host request flag查询对端设备是否请求变为Host,Polling间隔为1-2秒。当当前的USB Host决定允许B-Device转变为Host以后通过SetFeature()打开b_hnp_enable,本次Session结束后Host回到A-Device手里。 4.设备框架OTG描述符在设备枚举时,A-Device通过GetDeor向B设备请求OTG描述符。OTG描述符也应当作为GetConfiguration()的一部分返回。其中的bmAttributes标示B-Device是否支持ADP/HNP/SRP标准设备特性,通过SetFeature()设置。b_hnp_enable设置此特性,显示B-Device被允许进行HNP,A设备必须在T(HOST_REQ_SUSP)时间内挂起总线。a_hnp_support早期OTG版本的兼容特性,设置这个特性指示B-Device对端的A-Device支持HNP。A-Device应当对B-Device设置此特性如果A-Device支持HNP。a_alt_hnp_support废弃GetStatus()其中数据部分OTG Status最低位为Host Request flag,指示当期的USB Device角色期望变为USB Host角色。5.一般连接过程(Host -& Device)OTG Device /Embedded Host 与 仅作为外设的B-device(带A插头型)Host端检测到A插头插入,停止ADP,打开VBus,因为B-Device的A插头与设备作为一体,此时B-Device必定与A插头连接,Host检测到外设连接,开始枚举。 OTG Device/Embedded Host 与 仅作为外设的B-device(A插头为线缆连接)Host段检测到A插头插入,停止ADP,打开VBus,如果B-Device是线缆连接完毕在将A插头插入则整个连接过程与上面无异,因为此 时B-Device可能还没有插入插头,则设备连接超时,VBus再次关闭,等待下一次ADP的改变(线缆连接完毕),再次打开VBus,此时开始正常总 线枚举。OTG Device 与 OTG DeviceHost端检测到插头插入,则打开VBus,如果没有外设检测到,则关闭VBus,打开ADP Probing,Device端检测到插头插入,则打开SRP,如果线缆没有插入,则SRP超时,Device端开始进行ADP Probing,当线缆连接完毕,Device端侦测到ADP变化,发送SRP请求Host打开VBus,Host回应SRP并且打开VBus,完成设备 连接。6.OTG Device(Host/Device)与普通USB Host/DeviceOTG Device(Device)插入普通USB Host:SPEC指示OTG Device满足所有USB外设条件,电器原理实现未查明。普通USB设备插入OTG Device(Host):OTG兼容,但是电器原理实现未查明,对VBus的打开,以及ADP和SRP的处理有疑问。在usb.org上有人问起这个问题,回复只是讲会识别并且兼容,但是实现原理及监测细节未知。原贴地址:https://www.usb.org/phpbb/viewtopic.php?t=14450&highlight=otg最新的一些思考和猜想:1.ADP是OTG Device作为Host,既可以关闭VBus又能够监测普通USB设备的关键。2.OTG Device作为Host如果不支持ADP,但是支持SRP的,VBus应当始终打开(或者通过插入中断?RootHub Polling),如果要关闭VBus则仅能支持会发起SRP的OTG Device,普通的USB设备和不支持SRP的OTG Device,在Host没有ADP的情况下无法在关闭VBus的情况下检测到设备(除了插入中断)插入并且通过SRP打开VBus。注: OTG Device作为Host在A插头插入时会尝试打开VBus,如果插入设备线缆在A插头插入时已经连接完毕,则在这次插入时,正常枚举。如果插入设备线缆 在A插头插入时没有连接,作为Host的OTG Device又不支持ADP,但是支持SRP,那么插入设备可以在线缆插入后发起SRP打开VBus,如果插入设备不支持SRP。则设备工作不正常?3.OTG Device在监测总线活动和设备连接前会在插头插入时首先检测插头(普通USB不会检测插头,因为不关心,OTG的ID引脚会起控制器中断),从而决定OTG Device角色,并且通过ADP等待设备连接,然后打开VBus进行总线活动。关于SRP与ADP作为一个B-Device或者是普通的USB Device,怎样打开VBus进行总线枚举是他们的最终目的。SRP为B-Device请求A-Device打开A设备的手段之一,而ADP虽然作为检测插入设备为目的但是有些EH/OTG Device会在ADP检测到状况以后不等到SRP的到来(或者说不支持SRP)就打开VBus,倘若没有设备连接,再关闭VBus并且打开ADP继续侦 测(仅限于OTG Device EH不会),更有甚者检测完A插头直接打开VBus(ADP出来的较晚,很多早期的OTG控制器中,根本没有ADP和HNP Polling的字样,估计那时候可能SPEC里面还没有这些东西)这让SRP显得有些多余,但是我们作为一个B-Device的时候还是应当在开始总线 操作前发出SRP,保证不支持ADP只支持SRP并且插头插入时不打开VBus仅仅在受到SRP才打开VBus的控制器上,设备也能进行正常枚举。Mentor Graphics USB OTG Controller IP Core调试笔记MUSBHDRC与 MUSBMHDRC是Mentor Graphics出品的兼容支持OTG功能的IP Core被广泛的应用于 TI ADI的多媒体处理器中。两个IP的区别在于MUSBMHDRC带有Multipoint功能,可以接HUB。下面是我在FPGA上调试碰到的问题及解 决,欢迎交流拍砖。MUSBHDRC RTL V1.8版本BUG及解决1.中断不会PendingMUSBHDRC在关闭EP中断的情况下不会去置中断位,这样再次打开中断时,因为中断没有Pending,直接导致本次中断丢失。而 Mentor的做法也相当的令人鄙视,竟然只是在Datasheet中悄悄的把原先版本Datasheet中的中断会Pending的那句话悄悄的去掉。解决:只能在SOC级解决,Davinci的解决方法把相关的寄存器Shadow了一下,不允许操作原来MUSBHDRC中的相关中断寄存器而转而使用SOC提供的相关寄存器。2.DMA部分的BUGMUSB系列的DMA模式分为3种。DMA MODE 0,DMA MODE 1 REQ MODE 0, DMA MODE 1 REQ MODE 1。其中DMA MODE 1 REQ MODE 1在MUSBHDRC上无法正常工作,一旦FIFO里有Packet,并且& MAXP 则不会再来中断。DMA MODE 1 REQ MODE 0在连续的发起DMA请求时候会挂住总线,导致系统锁死,而且因为DMA MODE 1 REQ MODE 0必须知道数据总量的限制,在很多的USB上层的协议中都无法使用。DMA MODE 0在Device方式时效率低下,不考虑。解决:只能在SOC级解决,可以见到Davinci和TUSB都没有使用MUSBHDRC的DMA控制器,都是在SOC上做了一个DMA控制器实现相关DMA操作。MUSBMHDRC基本解决了MUSBHDRC中的相关BUG,并且增加了Multipoint功能。可惜Linux驱动中尚没有端点复用及调度相关代码,所以目前仍然不可能支持太多数量的USB设备。关于ID Pin中断MUSB系列没有提供ID Pin的中断,而我们从Controller看到的A/B Device逻辑也相当的奇怪。在A-Device状态下,写DEVCTL.SESSION则PHY拉起VBUS,DEVCTL.B-DEVICE和 DEVCTL.VBUS Session才有效,也就是说我们必须开始Session软件才能知道是目前A-Device还是B-Device,这在OTG状态机的A- Device向B-Device状态推进时会出现很大问题:驱动这边会出现许多协议里没有的状态变迁。这样在OTG Device-& Host 时插头发生变化而软件不知,没人来Drive VBUS,直接导致哑炮熄火(有朋友说我的没有啊,只是有时好用有时不好用,原因后面揭开)。而Host-& Device时,Host设备拔出时停留在A_WAIT_BCON状态,在换上B-Device插头时状态机没有经过A_WAIT_BCON-& A_WAIT_VBUS_FALL-& A_IDLE-&B_IDLE的变迁,直接导致驱动程序中状态机状态变迁异常,而Davinci采取了Timer不停地写Session的方法来 Workaround,但是不是解决问题的根本,而我们又不能总是通过Session来检测,最根本的解决方法就是外加一个ID Pin中断来检测插头,同时推进状态机。诡异的Session Request中断在Datasheet中,这是一条仅仅会在Host方式下来的中断,但是在实际使用中,这条中断来的十分诡异,B-Device状态下有时候会 在插入B插头时每隔3-5秒来一次,有时候又不来,有时候没插插头时也回来,飘忽。而驱动中收到Session Request中断则立即Driver VBUS,这解释了前面Device-&Host时而好用时而失效的原因。解决:走正规的ID PIN检测关闭此中断,在检测到A插头插入时立即打开Session -& Drive VBUS,这样就不用关心对方设备的SRP了。关于Device方式下SetAddress的注意按照Datasheet中的流程在收到Setup包的时候即可设置FADDR改变当前的Address,然后清掉RXPKTRDY并且置位 DataEND 回复0包,并且使Controller进入控制传输的Status Stage,完成后来一个MC_INT中断。实际则不然,如果这样操作会导致MUSB Controller失去响应,在协议分析仪上看到Controller在接下来的Get Deor的SETUP Transaction中的IN Token中没有任何回复,或者回复一些NAK后,失去响应。正确的操作方法为:收到SetAddress以后,不要立即设置FADDR,在Status Stage结束后来的那次中断中设置SETUP包中的传来的地址。关于DMA MODE 1 REQ MODE 1Device方式下DMA MODE 1 REQ MODE 1为兼容性和效率最佳方式。然而在Host方式下只能使用DMA MODE 0。归根结底在于DMA MODE 1 REQ MODE 1的结束条件& MAXP 倘若Host连续开启两个IN Transaction,每个IN Transaction大小为MAXP的倍数,则在DMA停止时无法区分两个包,前一次IN Transaction因为结束时还满足DMA MODE 1 REQ MODE 1的条件,直接导致DMA控制器将下一个IN Transaction的包已经收到了FIFO/URB中,如果所有IN Transaction 如果都能被MAXP整除,开始的那个URB岂不成一团浆糊了。解决:控制器设计问题非BUG无法解决,使用DMA MODE 0。关于Linux中的驱动程序。驱动位于drivers/usb/musb下。代码中没有端点复用和调度部分,因此Multipoint功能极大受限。Interrupt及Isochronous方式传输似乎有问题,尚未研究。关于VBUS_ERROR的缺陷。在一些需要电量较大的设备插入时MUSB在写入Devctl.Session时候VBus拉不起来,并且产生VBUS_ERROR中断,接下来 难堪的问题发生了,Controller居然切到B-Device状态,再也不能通过写Session拉起VBus。尚未找到恢复方法。
阅读(5585) | 评论(0) | 转发(6) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。我是如何把《圈圈教你玩USB》学习板一次性焊接成;闫金龙;前言;刚好有一点时间就给大家把我的经验写出来了,希望能;我在网上看到好多兄弟,都在焊接的时候,没有掌握好;具体方法:;1、焊接前准备:0.8的焊锡丝(若干)、20W电;2、把焊接的环境清理干净;3、熟悉学习板的电路原理图、焊接元件的位图、配料;4、完成上面的3项,就可以开始焊接了;5、首先用万用表通断
我是如何把《圈圈教你玩USB》学习板一次性焊接成功的
刚好有一点时间就给大家把我的经验写出来了,希望能给大家带来帮助。所有照片都是用手机拍的,我的数码相机USB数据线被小孩子玩的时候弄丢了。大家就委屈一下吧,日后再补吧,呵呵…………
我在网上看到好多兄弟,都在焊接的时候,没有掌握好的焊接方法和没有养成良好的焊接习惯,而导致的焊接学习板失败的惨痛。我现在就把我的成功经验和技巧奉献给大家。
具体方法:
1、 焊接前准备:0.8的焊锡丝(若干)、20W电烙铁(可以方便更换烙铁头的那种,我用的就是这样的)、镊子(尖的、弯的各一把)、万用表、助焊剂(适量)、最好准备一个放大镜。
2、 把焊接的环境清理干净。
3、 熟悉学习板的电路原理图、焊接元件的位图、配料单(圈圈把这两个合一块了,大家焊前要注意,因为EDN黄娜给的阻容器件、排针是有余量的,呵呵)。
4、 完成上面的3项,就可以开始焊接了。
5、 首先用万用表通断档测试VCC与GND是否短路。这是所有的焊接都必须的一步,否则后果大大的严重。
6、 测试VCC与GND没有短路,就可以焊接了。
7、 由于是贴装和插件混合在一起的,所以要使用先易后难的焊接已经不可以了,要用插穿法来焊接。 8、 先把按键焊上,只要用万用表通断档测试各个按键能正常通断就好。焊接位置如下图
9、 这个不难吧,呵呵。经过3分钟就焊接OK。来秀下焊好的图
10、 不错呀,继续吧。
11、 接着我们就要焊接22M的晶振了。大家要问为什么要先焊它?其实理由很简单了,因为圈圈为
了省地方把它安排在40PIN插座里面了。不先焊它,以后就不好焊了,当然除非你是所谓的高手。呵呵,高手是不会犯这样低级的错误的。焊接位置如图
12、 提醒大家一点。EDN提供的晶振是没有垫拖的。大家要自己找呀。找不到也没有关系,用剪刀
剪一块和晶振大小一样的薄膜塑料垫在下面。为什么要垫薄膜塑料垫,我想大家都看到上面的照片了吧。晶振焊接位置有过孔,因为这个在40PIN插座里面,要足够的低,否则芯片插入会接触不良的。除非你乐意,呵呵…………
13、 接着就是两个22P的贴片电容。焊接贴片电容是这样的,先在焊接位置的中间一端点锡(这样
做的好处是不怕点锡多),然后用尖镊子把贴片电容放到焊接位置。用电烙铁放到点锡位置,轻轻的把电容向点锡位置送,然后迅速的把电烙铁离开点锡位置。少等3秒钟后,离开尖镊子。然后再点焊贴片电容另一端。同时另一个22P的贴片电容也参照此方法焊接。(所有的贴片电容,贴片电阻的焊接都要照此方法。其他不在叙诉。)好了看看我们焊好的照片吧。如下:
13、这个也好了,赶快把22UF的贴片电容焊上吧。(这个在焊接位图上是有方向的,应该是钽电解电容。乖乖怎么EDN给的器件里面没有呀。找不到22UF的吧,呵呵,这回该知道圈圈把位图和器件清单弄一块是有问题的吧。不要急用用排除法就找到了。对了就这两个东东。大家注意这两个是无方向的那种。估计EDN怕兄弟们弄错方向了吧。呵呵。。。)如下照片
14、焊好了,来秀一下吧。如下照片:
15、接着,就把40PIN的插座焊上吧。大家要注意方向呀。这也的交代,呵呵。。。。。来看看我们焊好的照片吧。呵呵。。如下照片:
16、接下来,我们该焊那一个呢?大家的意思呢?呵呵,到这步就有分歧了。我认为要焊LED灯了。为什么呢?要搭建单片机最小系统嘛。呵呵,这就是“老鸟“和“菜鸟”的区别。要做一步,想三步。(我的想法和圈圈书中所述的调试方法一致。这下知道我有多老了吧。呵呵。废话少说…..其实所有的调试法则都是一样的,如果连最小的系统都不能运行,你还接着焊下去有什么意义呢?对吧,要边焊边调,最后。出来的产品才会一次性成功。如果你不相信,可以问问那些“老鸟“是不是这样调的。呵呵)大家在这里要注意,贴片LED的阴阳两极的判断,带绿点的为阳,接VCC;另一端为阴,接MCU的I/O口,焊接方法参照第13步。我们来一块秀一下焊好的照片。如下:
17、接下来,我不说大家也知道该焊什么了。对了,接I/O的1K阻排。这样单片机最小系统就好了。大家可以试着用离线的编程器,烧录一个LED全亮的程序试试。一定会成功,除非你没有按我的方法做,或者就是程序错了。呵呵。(有的朋友说了做实验要5V的电压呀?5V的电压如何取呀?只要问这样的问题一定是菜鸟了。还记的你的USB吗?我们还没有焊接口。所以要从这里取电。如下图:(左右两边就是5V的输入。焊好引线直接连接到电源上即可。)
18、如果没有编程器,也没有关系,你就接着焊MAX232吧。圈圈给我们选的可是STC的芯片。阻容元件焊接方法参照13步。芯片焊接方法介绍如下:先用助焊剂把MAX232浸一下,这样它就有粘性了,放在PCB焊接位置上,先点焊一个引脚,固定后,其他的一一去点焊就好了。来看看焊好的照片吧。如下照片:
19、接着把两个短路子焊到PCB位置上,一切就OK了。可以使用在线编程了。找条串口线连接到PC就可以下了。当然你不用STC也可以那就用AT89S吧,这个就要焊上J4了。ISP/IAP
。你自己选吧,
反正我没用,省了,给我的FPGA和CPLD用,呵呵。短路子的位置照片如下:
20、接着把另一个阻排焊好。位置如下照片。注意引脚呀。
21、接着我们就来焊D12吧。D12管脚比较密,这里我们要更换烙铁头,为斜铲的那种。采用下拉焊。处理过程先用助焊剂把D12浸一下,这样它就有粘性了,放在PCB焊接位置上,先点焊一个引脚,固定后,其他的用锡点焊再拉焊就好了。PCB位图下照片:
22、接着就是6M的晶振了,处理方法参照第11步。
三亿文库包含各类专业文献、行业资料、外语学习资料、生活休闲娱乐、高等教育、文学作品欣赏、各类资格考试、专业论文、中学教育、我是如何把《圈圈教你玩USB》学习板一次性焊接成功的_图文51等内容。 }

我要回帖

更多关于 江苏人怎么看东南大学 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信