打印

请问STM32单片机的USB接口枚举过程是完全由硬件完成的吗?

[复制链接]
4006|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a8037902|  楼主 | 2013-3-18 17:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
a8037902|  楼主 | 2013-3-18 17:52 | 只看该作者
没大神过来指点我一下吗?

使用特权

评论回复
板凳
wldtk| | 2013-3-19 11:51 | 只看该作者
STM32的USB与Win7电脑怎么连接,STM32用USB库编的程序,PC不识别?

使用特权

评论回复
地板
john_lee| | 2013-3-19 12:19 | 只看该作者
枚举代码在STM32_USB-FS-Device_Lib库

使用特权

评论回复
5
小番茄| | 2013-5-10 10:27 | 只看该作者
枚举的动作是由PC发起,设备回复,其中的设备回复通讯代码在USB固件库中完成了,枚举的相关描述符在usb_desc.c,可以根据自己的硬件自己设定

使用特权

评论回复
6
icicicici| | 2013-5-10 10:40 | 只看该作者
小番茄 发表于 2013-5-10 10:27
枚举的动作是由PC发起,设备回复,其中的设备回复通讯代码在USB固件库中完成了,枚举的相关描述符在usb_des ...

怎么没看到有调用枚举,是不是在USB的中断里面,一接收到PC的信息就触发一个中断标志?

使用特权

评论回复
7
小番茄| | 2013-5-10 11:12 | 只看该作者
这些都是在USB内核代码都有已经封装好的了,是用一个函数指针去指向你所定义的描述符
u8* (*GetDeviceDescriptor)(u16 Length);
  u8* (*GetConfigDescriptor)(u16 Length);
  u8* (*GetStringDescriptor)(u16 Length);

使用特权

评论回复
8
小番茄| | 2013-5-10 11:13 | 只看该作者
icicicici 发表于 2013-5-10 10:40
怎么没看到有调用枚举,是不是在USB的中断里面,一接收到PC的信息就触发一个中断标志? ...

这些都是在USB内核代码都有已经封装好的了,是用一个函数指针去指向你所定义的描述符
u8* (*GetDeviceDescriptor)(u16 Length);
  u8* (*GetConfigDescriptor)(u16 Length);
  u8* (*GetStringDescriptor)(u16 Length);

使用特权

评论回复
9
icicicici| | 2013-5-10 13:14 | 只看该作者
小番茄 发表于 2013-5-10 11:13
这些都是在USB内核代码都有已经封装好的了,是用一个函数指针去指向你所定义的描述符
u8* (*GetDeviceDe ...

https://bbs.21ic.com/forum.php?mod=viewthread&tid=545768&extra=
方便帮我看看嘛?

使用特权

评论回复
10
icicicici| | 2013-5-14 11:54 | 只看该作者
小番茄 发表于 2013-5-10 11:13
这些都是在USB内核代码都有已经封装好的了,是用一个函数指针去指向你所定义的描述符
u8* (*GetDeviceDe ...

那他的整个流程枚举到通信的流程大概是怎样的?能解释一下吗?感谢?

使用特权

评论回复
11
小番茄| | 2013-5-15 15:08 | 只看该作者
转载至:https://bbs.21ic.com/blog-549219-55928.html
---------------------------------------设备插入---------------------------------------------------------
1)  主机会轮回查询各个USB端口,主机检测到D+与D-之间有电压差,就认为有新的设置接入。主机等待100ms后发出复位请求。设备接到复位请求后将产生一个外部中断信号。

---------------------------------------枚举过程---------------------------------------------------------
2)  主机这时候只是知道有新的设备插入了,但是不知道插进来个什么东西,所以就开始询问它是什么设备,怎么用,负荷能力怎么样。这个时侯就进入了枚举过程。因为刚刚插入的设备没有分配地址,就用默认地址0,首先发送一个Get_deor(获取设备描述符)指令包,设备接到包后就开始解析包(其实就是你在固件程序里判断处理) ,然后按固定格式返回自己设备的设备描述符,这一步主要是主机知道你的USB设备的基础属性,比如支持的传输数据长度,电流负荷多少,支持那个USB版本,以及以后方便电脑找驱动的PID,VID。

3)  这时候主机知道你(你做的设备,简称你吧)的数据长度还有电流大小后,下一步就是给你分配一个属于你的地址。

4)  给你一个地址后就开始询问你的具体配置。首先发送一个试探性的设备配置请求Get_configuration(要求固定返回9个设备配置字),你接到后就开始发送9字节的设备配置字,其中包括你的配置字的总长度,这样主机就知道你的配置到底有多长,然后再发一次设备配置请求,这时你就开始上传所有的配置字。这个时侯主机就已经很明白你的工作方式就各种特性,然后就可以正常工作了

5)  如果你在前面的某些配置(以后章节详细说明)要求要说明自己的名字什么的,这里还要上传字符串描述符。

6)  如果是鼠标或者键盘还要上传报告描述符

---------------------------------------正常数据阶段---------------------------------------------------
7)  这个时侯你已经被主机正式接受并且注册了,你可以通过自己写测驱动或通用驱动与电脑进行通讯了。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
betbet + 3 赞一个!
12
dupeng88| | 2013-5-17 16:34 | 只看该作者
楼上好专业~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

107

主题

154

帖子

0

粉丝