本帖最后由 z755924843 于 2017-3-13 13:37 编辑
来21ic也有几个年头,正所谓有索取必须有回报,看到大神们发的各种教学贴都是敬佩不易 ,由于本人最近一直在做usb相关的工作,从门外汉到现在可以说一般usb的问题都可以解决,在这之中经历了很多,看了好多本书比如《圈圈USB》《USB开发大全》《USB应用》等,也得到了论坛很多的帮助(比如小i)。但是我发现市面上关于usb的资料虽然很多但是特别的杂乱无章而且有些书籍完全落后与当前USB的发展,导致学习起来特别的费时费力,但是由于各个厂商都提供了各自的usb库,在实际应用上能够节省一些时间,usb可以说是“会了不难”,我想分享一下我的经验好让大家快速入门可以直接应用到工程中,提前声明我的经验是基于实际工程来做的,而其中关于usb的基础知识只是简单的说一下,想学的请自行百度吧,之前使用过atmel和stm32407的usb库,但是觉得stm32cubemx比较简单一些,可以自动生成usb例程,所以准备使用stm32的usb例程为大家推出一个系列教程(其实想推出一个视频教程来着,毕竟视频讲的更加详细,但是本人是一个腼腆型的理工男,所以想想还是算了。想和我交流的请加我的qq:1916365117): 第一节:基于stm32cubemx 建立usb工程和usb的基础知识
第二节:基于stm32f407实现usb鼠标(1个endpoint)和usb的运行过程
第三节:基于stm32f407实现usb键 (2个endpoint)
第四节:基于stm32f407实现usb鼠标+键盘1个Interface
第五节:基于stm32f407实现usb鼠标+键盘2个Interface
第六节:基于stm32f407实现usb鼠标+键盘+自定义设备
第七节:基于stm32f407实现usb大数据通信
第八节:基于stm32f407实现usb大数据传输(usb)+上位机libusb驱动简单操作 (备选:基于stm32f407主机读取U盘)
终极版:基于usb的stm32f407的bootloader的实现。 进入正题: 第一节:基于stm32cubemx 建立usb工程和usb的基础知识 1. 打开stm32CubeMx(下图)点击New Project 选项 2.弹出选择芯片选项,选择STM32F407ZGTx芯片,点击OK按钮 3. 配置外设功能
1) 选择时钟:RCC->HighSpeed Clock中选择Crystal/Ceramic Resonator 2) 选择调试接口:SYS –>Debug中Serial Wire 3) 打开usb:USB_OTG_FS 中选择DeviceOnly 选择USB设备:USB_DEVICE ->Class For FS IP 中选择Human Interface Device Class(HID) 4. 配置时钟 我的板子外部时钟使用的是8M晶振,并且usb必须使用48MHz频率 5. 配置选项 1)打开配置界面 2)点击USB_DEVICE选项: 将描述符修改按照下图修改 3)点击USB_FS选项弹出以下界面,VBus Sensing 默认是Enable的,需要将它关闭disable,如果不关闭的话,就会出现其他功能正常,usb没有反应的问题,最开始调试的时候一直不知道问题所在,不停的新建工程浪费了不少时间。 4)之后就可以点击生成按钮弹出下图: 将LinkerSetting 都改成0x1000,这个设置堆栈大小,原来的大小是Heap size 是0x200,StackingSize 0x400,ST的认为已经足够了,但是对于新手来说这个空间是远远不够的。 6.点击OK生产工程
下面讲讲USB的基础知识: USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的。 它的优点是即插即用并且支持的设备特别多,可以连接鼠标、键盘、打印机、扫描仪、摄像头、充电器、闪存盘、MP3机、手机、数码相机、移动硬盘、外置光驱/软驱、USB网卡、ADSL Modem、Cable Modem等,几乎所有的外部设备。而且现在基于usb3.0 的type-c更是风靡手机业。 USBOTG功能更是让USB无所不能 USB OTG是USB On-The-Go的缩写,是当前发展起来的技术,2001年12月18日由USB Implementers Forum公布,主要应用于各种不同的设备或移动设备间的联接,进行数据交换。特别是PDA、移动电话、消费类设备。改变如数码照相机、摄像机、打印机等设备间多种不同制式连接器,多达7种制式的存储卡间数据交换的不便。On-The-Go,即OTG技术就是实现在没有Host的情况下,实现从设备间的数据传送。例如数码相机直接连接到打印机上,通过OTG技术,连接两台设备间的USB口,将拍出的相片立即打印出来;也可以将数码照相机中的数据,通过OTG发送到USB接口的移动硬盘上,野外操作就没有必要携带价格昂贵的存储卡,或者背一个便携电脑。 USB拓扑: USB是一种主从结构的系统,主机叫Host,从机叫做Device(设备)。通常主机具有1个或者多个USB主控制器(host controller)和根集线器(root hub),在windows的设备管理器中可以看到USB主控制器和USB根集线器。 USB数据交换只能发生在主机和设备之间,主机和主机,设备和设备之间不能直接互连和交换数据。 Usb的拓扑 USB硬件检测: 通用的在USB接口有四根线,分别是VBUS,D-,D+,GND。其中VBUS线是HOST/HUB向USB设备供电的电源线。 OTG的usb多了一个地址线 USB集线器的每个下游端口的D+和D-上,分别接了一个15K的下拉电阻到地。这样,当没有设备插入时,端口被拉低。而设备端的D+或D-会接一个1.5K上拉电阻,接到3.3V电源。其中全速和高速设备,在D+上接上拉电阻;而低速设备在D-上接上拉电阻;设备接入集线器后,接了上拉电阻的一端的电压经过上下拉电阻分压,降为3V左右。对集线器的接收端来说就是一个高电平。集线器检测到这个高电平信号,就通知USB控制器。集线器还可以通过判断这个高电平信号是D+还是D-,判断设备是什么速度的设备。USB高速设备首先被识别为全速设备,然后通过集线器和设备两者的确认,再切换到高速模式下。在高速模式下,使电流传输模式,这时要将D+的上拉电阻断开。 有机会的话读者可以自行测试一下。 USB的传输机制: 这个我只简单的说一下,在新手入门的时候还是不要深入了解这些,因为如果在没有了解usb整理的运行机制的话,很容易让初学者觉得USB太难了,机制太复杂了。所以我只是一带而过,当我们对USB有了初步了之后在回来看这些,就容易多了。 USB的传输发起者都是主机,,主机负责管理总线上的传输,从机则响应来自主机的通信。每个传输开始后都是使用定义好的格式发送数据信息、地址信息、错误检验以及状态等信息。 传输要素: 端点(endpoint):是设备的缓冲区,用来存储接收到的数据和准备发送的数据,每个端点都有特定的编号、传输方向、以及一次通信中最端点可发送或者接收的最大数据量 事务(transaction):每个usb传输由一个或者多个事务组成,这些事务都是从输入端点(IN)或者输出端点(OUT)取出 输入和输出(IN和OUT):输入和输出都是相对主机而言的,也就是说IN表示往主机输入,数据流向是从机->主机,OUT表示主机输出,数据流向是主机->从机 IN令牌包:想端点请求数据信息包 OUT令牌包:则是主机发送数据信息的先行信息。 除了数据外每个令牌包还有错误校验位,一个带有数据顺序值的信息包ID。 传输方式: USB支持4中传输方式:控制传输、批量传输、中断传输、和同步传输 例: 控制传输:一般在设备刚开始来连接时(枚举)的时候使用控制传输 批量传输:大数据传输使用此类传输,比如U盘,打印机,扫描仪等 中断传输:数据量小的通信使用此类传输,键盘、鼠标等HI设备D就是使用中断传输 同步传输:对实时性要求比较高的使用此类传输,音频,视频等传输一般使用此类传输。 就先说到这里吧,下个教程我准备根据生成的stm32f407usbhid例程讲解一下usb的枚举过程,请大家多多支持。 注:
Usb枚举:在应用程序与设备通信之前,主机需要了解设备,并且为其分配驱动程序,枚举(enumeration)是完成上述任务的信息交换过程。可以说如果usb设备完成枚举过程的话,那么此设备就算完成80%了。所以说枚举很重要。
|
楼主,后面的没有了吗
很好
不错