你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

旧帖无参考价值啦~~~usb复合设备串口+U盘!

[复制链接]
lcdi 发布时间:2015-2-4 22:12
本帖最后由 lcdi 于 2018-3-8 15:28 编辑
2 {' p% T6 W  I( t! a: x; l0 C. Y
: b2 B' j: s9 M* k——————————————————————————————————————————————————————————————————————————————  Z9 \4 ~/ I! b
在4.0库里的composite例子,把里面的HID部分去掉,换成virtual comport部分。
% T$ B. R% ]! q! B$ Z把一些关键点写下来给大家参考:5 D. P# n. r) q: B

2 T7 B" D9 B  E; {& r1 |1:主要修改usb_desc.c里的Composite_ConfigDescriptor,
! \  I, p7 F. h" QbNumInterfaces要改成总共的interface数目,我这里串口用了2个,u盘用了1个。然后是具体的描述,因为串口有2个interface,所以需要IAD描述,如果只有一个,就可以像例程那样直接描述。
+ ]' E4 F# G) U! I. R3 _    // IAD) p, y9 L. q9 w5 h/ P, H# `0 n
    0x08,        //描述符大小
" n5 b& M) z, o1 Z    0x0B,        //IAD描述符类型
" C, L; h9 E% c; t% M    0x00,        // bFirstInterface
& d7 V! a  N9 A3 o4 m( f  m    0x02,        // bInterfaceCount
; h, N" R9 `1 n* E3 q% U+ n    0x02,        // bFunctionClass: CDC Class
; `+ D7 u  X' m    0x02,        // bFunctionSubClass& t- K/ j, S8 U
    0x01,        // bFunctionProtocol0 F, B; l. i5 T3 o8 n
    0x00,        // iFunction         
# D& |: n0 M; U: n5 K% z下面接串口本来的描述符,IAD里很简单. g- N6 Z! g( f3 p" W1 m1 |
原串口用了IN2,是中断传输,一直没找到和搞清楚具体的服务函数在哪儿?
3 ]0 v9 r+ b- t因为u盘也用IN2和OUT2,所以把这里改成IN4。  H/ s% d8 I* q
描述完串口接着描述u盘
$ p& {) @% o1 f: Q9 R+ B+ i                  // IAD" X( Y' K# l0 ~3 [3 B) @+ W
    0x08,        //描述符大小
! B# ~3 m' p. e    0x0B,        //IAD描述符类型
* P, Q" e0 \  U5 U* ^6 Z& u/ b# N    0x02,        // bFirstInterface/ n7 T& S: D7 u- l
    0x01,        // bInterfaceCount- w8 Y; _8 ^% `3 s; d/ X# N
    0x08,        // bFunctionClass: MASS STORAGE Class( W. V% l( s* ^$ J8 ?2 j6 v
    0x06,        // bFunctionSubClass
3 M0 c3 U( ?2 Y9 B    0x50,        // bFunctionProtocol
: f2 i" H: |4 C0 X$ D3 S    0x01,        // iFunction         ( D6 l6 v+ C, k& w. Z+ @
下来照搬u盘描述即可。8 t3 ]  o! @! I) @6 Z+ U
Composite_ConfigDescriptor 修改完了,别忘了修改一下usb_desc.h里的Composite_SIZ_CONFIG_DESC,因为增加了描述内容嘛。
8 ]( Z) }' }/ j) q3 ^, S9 G7 ]$ h这时候就能枚举出符合设备了。
3 P7 x% b' v9 p4 w) H2:整合,增加了端点,需要修改usb_prop.c里端点初始化部分。usb_endp.c里callback函数要修改。按照callback函数的增减修改usb_conf.h。* f. a' v2 {' _- F( J8 K2 ^8 ^# ?
这里有很重要的定义,改不好的话设备还是用不了。1 F! i4 H* h! c# ]; _! A+ K
EP_NUM 是使用的端点数,我使用到ep4,那这里就是5。4 B3 d) w0 F$ U' }# n3 j1 b
下来是BTABLE_ADDRESS
/ {+ j$ V: d" b$ ^! Y各端点的缓冲区地址设置。BTABLE_ADDRESS是0,第一个缓冲区地址我这里要设为0x28。因为BTABLE_ADDRESS到第一个缓冲区之间是各缓冲区的偏移地址存放处,我用了5个端点,每个端点8个字节,所以我要把第一个缓冲区放在0x28才行。
# L9 d# v9 @$ k) c. Y% |这个问题搞了好久才明白。
% U9 t$ t) t/ P8 V3 w1 C' Y6 S, U& n0 H9 v6 r
至此,修改完成,两种设备共存都正常工作了!3 F: \$ i, |2 i; E  G7 f) Q
. a. w9 @3 h9 K7 f2 F
只是驱动不容易装,如果我安装ST的串口驱动(修改过PID),那么就只有这个设备,u盘没有,如果直接自动装驱动,有u盘没串口。这时候手动更新有惊叹号的设备,指定串口的驱动,装好后测试也就正常了。4 B$ n, P+ ]) m% y; C% V$ w5 |
——————————————————————————————————————————————————————————————————————————% F9 {3 {5 p! Y8 ~' T! S- y& S+ C7 C
U盘部分不需要驱动,串口部分不能自动安装驱动(即使系统安装过也不行),变惊叹号设备。如果再安装一次倒是可以用了,但是U盘却没了。对这个惊叹号设备手动选择驱动类型,强制使用以前安装的驱动则可以正常使用。这样搞总是不正常的样子。
# m' ^+ x5 t+ T1 t4 [其实,要修改驱动包里的INF, %DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5750改成
  }8 N9 ~3 k8 _" N5 \5 L%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5750&MI_00就可以一切正常了。
# c2 Z7 {0 L+ `, u  P0 [0 z; g* p因为我这里设置串口为interface 0 开始的,惊叹号设备里也能看到 VID_0483&PID_5750&MI_00这样的信息,所以这样设置驱动就知道是要匹配0号interface的。
  ^( l& ~8 w$ B! n: V2 F至此,全部正常!9 Q+ b0 z$ I" Z+ Z) c0 j- |

) ]# z* [8 d5 `0 R

/ i0 p! p+ U% L) A$ ]____________________________________________________________________________________________________2 m5 O- l" E- e2 M( h0 v
测试了一段时间,串口通信不太稳定,表现为通讯一些数据后usb会重置,设备消失一下又出现。暂时还没找到原因。5 ~! W/ J% X8 y9 g

评分

参与人数 1 ST金币 +6 收起 理由
wofei1314 + 6

查看全部评分

赞 收藏 1 评论11 发布时间:2015-2-4 22:12

举报

11个回答
wgsxsm 回答时间:2015-2-5 02:12:21
7c21b7ea6b00273aa083d477bf4b1283.jpg ! R# m& e- L5 o! ]1 t, k$ @( Y
拼命三郎V5 回答时间:2015-2-5 08:07:41
ssss.jpg
hhhhhhhhhhh.jpg
ss.jpg
lcdi 回答时间:2015-2-5 21:49:40
st给出的库和例子并不容易修改移植,库的结构和相关注释还是不够详细。
天涯小草 回答时间:2017-1-19 14:14:28
楼主,你好,我想用stm32 cube库做MSC+HID的复合设备,有参考程序吗
156765556@qq.co 回答时间:2017-8-15 16:10:24
$ }  @% k/ i( F+ R! }6 @# [
楼主,你好,我想用stm32F1做MSC+u盘的复合设备,有参考程序吗?% U! t% e1 o' w
156765556@qq.com9 i: h9 `; J, }8 |8 u' g9 m
谢谢啦!
wofei1314 回答时间:2017-8-16 11:54:27
有学习价值,谢谢分享~
zhxzsh 回答时间:2018-2-27 16:55:48
串口和U盘例程能发我学习吗?谢谢!zhxzsh@msn.com
misakorea 回答时间:2018-2-27 17:00:15
新手学习下
wylew 回答时间:2018-2-27 17:17:53
请问下还有源码存档吗?想需求一份,谢谢!308676264@qq.com
lcdi 回答时间:2018-3-8 15:21:52
wylew 发表于 2018-2-27 17:17/ o! _# ]. A2 C; @7 o/ b
请问下还有源码存档吗?想需求一份,谢谢!

5 Y+ k: g) t/ Q4 T没了没了,现在库都变了,我这些老经验没参考价值了~有机会再研究新的吧~
lcdi 回答时间:2018-3-8 15:23:35
zhxzsh 发表于 2018-2-27 16:55/ d: t- k' ]; @) V5 F
串口和U盘例程能发我学习吗?谢谢!

1 }! q6 D. |4 O. B2 v没有了,以前项目终止了没完成~现在库都不一样了没意义了,去学习库里自带的例程吧~
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版